[Sheepdog] [PATCH] sheep: fix race on sys->pending_list

Yunkai Zhang yunkai.me at gmail.com
Tue May 8 11:15:25 CEST 2012


On Tue, May 8, 2012 at 3:48 PM, Yunkai Zhang <yunkai.me at gmail.com> wrote:
> From: Yunkai Zhang <qiushu.zyk at taobao.com>
>
> Actually, there are two race problems when we call do_cluster_request()
> in IO threads:
> 1) race on sys->pending_list which would also be updated in sd_notify_handler().
> 2) calling sys->notify() in IO threads other than main thread is also
>   mistake.
>
> So I move do_cluster_request() into cluster_op_done().
>
> Signed-off-by: Yunkai Zhang <qiushu.zyk at taobao.com>
> ---
>  sheep/sdnet.c |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/sheep/sdnet.c b/sheep/sdnet.c
> index 8aad8f9..10be245 100644
> --- a/sheep/sdnet.c
> +++ b/sheep/sdnet.c
> @@ -174,6 +174,7 @@ static void local_op_done(struct work *work)
>  static void cluster_op_done(struct work *work)
>  {
>        /* request is forwarded to cpg group */
> +       do_cluster_request(work);
>  }
>
>  static void do_local_request(struct work *work)
> @@ -255,6 +256,8 @@ static int check_request(struct request *req)
>        return 0;
>  }
>
> +static do_nothing(struct work *work) {}
Sorry, there was a typo.

static void do_nothing(struct work *work) {}

I'll give v2 later.
> +
>  static void queue_request(struct request *req)
>  {
>        struct event_struct *cevent = &req->cev;
> @@ -323,7 +326,7 @@ static void queue_request(struct request *req)
>                req->work.fn = do_local_request;
>                req->work.done = local_op_done;
>        } else if (is_cluster_op(req->op)) {
> -               req->work.fn = do_cluster_request;
> +               req->work.fn = do_nothing;
>                req->work.done = cluster_op_done;
>        } else {
>                eprintf("unknown operation %d\n", hdr->opcode);
> --
> 1.7.7.6
>



-- 
Yunkai Zhang
Work at Taobao



More information about the sheepdog mailing list