[sheepdog] [Sheepdog] [PATCH] sheep: remove unregister_event from process_event_queue()

Yunkai Zhang yunkai.me at gmail.com
Wed May 16 05:53:00 CEST 2012


On Wed, May 16, 2012 at 3:55 AM, Christoph Hellwig <hch at infradead.org> wrote:
> On Wed, May 16, 2012 at 01:54:06AM +0800, Yunkai Zhang wrote:
>> +static void get_vdi_bitmap_from_sd_list(struct sd_node *nodes, size_t nr_nodes)
>>  {
>>       int i;
>>       /* fixme: we need this until starting up. */
>>
>> -     for (i = 0; i < sys->nr_nodes; i++)
>> -             get_vdi_bitmap_from(sys->nodes + i);
>> +     for (i = 0; i < nr_nodes; i++)
>> +             get_vdi_bitmap_from(nodes + i);
>>  }
>
> I'd suggest to simply kill get_vdi_bitmap_from_sd_list and opencode it
> in __sd_join to make the code cleaner.

I'm also confused by this code. Obviously, the for loop after
get_vdi_bitmap_from_sd_list() do a lot of duplicated works, Maybe this
code is outdated, but I need more testing to clean it, I'll have a
try.

>
>>       /*
>> +      * w->member_list contains joining node, we should
>> +      * exclude it in following operation.
>> +      */
>> +     for (i = 0, nr_nodes = 0; i < w->member_list_entries; i++) {
>> +             if (node_eq(w->member_list + i, &w->joined))
>> +                     continue;
>> +             nodes[nr_nodes++] = w->member_list[i];
>> +     }
>> +
>> +     /*
>>       * If a new comer try to join the running cluster, it only need read
>>       * one copy of bitmap from the first member.
>>       */
>>       if (sys_stat_wait_format())
>> -             get_vdi_bitmap_from(w->member_list);
>> +             get_vdi_bitmap_from(nodes);
>>       else {
>> -             get_vdi_bitmap_from_sd_list();
>> +             get_vdi_bitmap_from_sd_list(nodes, nr_nodes);
>>               for (i = 0; i < w->member_list_entries; i++)
>>                       get_vdi_bitmap_from(w->member_list + i);
>
> The else clause here iterates over member_list_entries twice, also
> why create the local nodes array if we could simplify skip it in
> the for loop.  E.g. why not:

Same as previous comments.

>
>        for (i = 0; i < w->member_list_entries; i++) {
>                if (node_eq(&w->member_list[i], &w->joined))
>                        continue;
>                get_vdi_bitmap_from(&w->member_list[i]);
>
>                /*
>                 * A newly joining node only needs to read a copy of the
>                 * bitmap from one single member node.
>                 */
>                if (sys_stat_wait_format())
>                        break;
>        }
>
>> +     if (result == CJ_RES_SUCCESS || result == CJ_RES_MASTER_TRANSFER)
>> +             update_cluster_info(jm, joined, members, nr_members);
>> +
>
> Previously we would only queue up an event for the CJ_RES_SUCCESS case,
> while the CJ_RES_MASTER_TRANSFER case handles the updates itself already,
> I think with your patch CJ_RES_MASTER_TRANSFER is handled twice now.
>
Good catch. I will give a V3 later.


-- 
Yunkai Zhang
Work at Taobao



More information about the sheepdog mailing list