[sheepdog] [PATCH] cluster/corosync: fix double call to sd_block_handler

Yunkai Zhang yunkai.me at gmail.com
Tue Jul 10 19:50:43 CEST 2012


We seems to fix the same problem at the same time:D

On Wed, Jul 11, 2012 at 1:37 AM, MORITA Kazutaka
<morita.kazutaka at lab.ntt.co.jp> wrote:
> After corosync_unblock() is called and before the unblock message is
> delived, sheep can perform the same block event which was previously
> peformed.  It is because cluster_op_running is false during the time.
> This fixes the race condition.
>
> Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> ---
>  sheep/cluster/corosync.c |    8 +++++++-
>  1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/sheep/cluster/corosync.c b/sheep/cluster/corosync.c
> index bd955bb..8a65e89 100644
> --- a/sheep/cluster/corosync.c
> +++ b/sheep/cluster/corosync.c
> @@ -284,6 +284,7 @@ static int __corosync_dispatch_one(struct corosync_event *cevent)
>         enum cluster_join_result res;
>         struct sd_node entries[SD_MAX_NODES];
>         int idx;
> +       static bool blocked = false;
>
>         switch (cevent->type) {
>         case COROSYNC_EVENT_TYPE_JOIN_REQUEST:
> @@ -342,11 +343,16 @@ static int __corosync_dispatch_one(struct corosync_event *cevent)
>                 sd_leave_handler(&cevent->sender.ent, entries, nr_cpg_nodes);
>                 break;
>         case COROSYNC_EVENT_TYPE_BLOCK:
> -               sd_block_handler(&cevent->sender.ent);
> +               if (blocked)
> +                       /* block events until the unblock message changes this
> +                          event type to COROSYNC_EVENT_TYPE_NOTIFY */
> +                       return 0;
> +               blocked = sd_block_handler(&cevent->sender.ent);
>
>                 /* block other messages until the unblock message comes */
>                 return 0;
>         case COROSYNC_EVENT_TYPE_NOTIFY:
> +               blocked = false;
>                 sd_notify_handler(&cevent->sender.ent, cevent->msg,
>                                                  cevent->msg_len);
>                 break;
> --
> 1.7.2.5
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



-- 
Yunkai Zhang
Work at Taobao



More information about the sheepdog mailing list