[sheepdog-users] Possible bug when adding participants to vdi

furkan at theshell.co.jp furkan at theshell.co.jp
Mon Apr 25 08:17:33 CEST 2016


And one more reply (additional correction to my post),

Now I understand the purpose of the proposed change a bit better.

I believe it'd work OK like this;

idx = entry->nr_participants;
// ...
entry->nr_participants++;

The change here is to remove " + 1" from the first line of the proposed 
change.
>> idx = entry->nr_participants + 1;

Thanks,

Furkan Mustafa

On 2016-04-25 15:11, furkan at theshell.co.jp wrote:
> Hello,
> 
> Sorry for butting in randomly, and sorry for top-posting.
> I'd like to point out a possible problem in the proposed change;
> 
> Original Code:
>> idx = entry->nr_participants++;
>> ...
> 
> Proposed Change:
>> idx = entry->nr_participants + 1;
>> ...
>> entry->nr_participants++;
> 
> I didn't read the source but I believe that the original code here is
> making the assignment *before* increment on purpose.
> 
> Because current number of elements in an array would be same number 
> with
> the index of the next added item. and *after that*, number of items 
> should
> be increased.
> 
> Please correct me if I'm wrong.
> 
> Thanks,
> 
> Furkan Mustafa
> 
> On 2016-04-25 14:09, Hitoshi Mitake wrote:
>> Hi Vedvyas, sorry for my late reply.
>> 
>> On Sun, Apr 17, 2016 at 12:20 PM, Vedvyas shanbhogue
>> <vedvyas13686 at gmail.com> wrote:
>> 
>>> This code increments the nr_participants but the participant state
>>> is not updated yet. The is_modified will now iterate over the
>>> updated nr_participants and can see bad state in participant_state
>>> array.
>>> 
>>> idx = entry->nr_participants++;
>>> memcpy(&entry->participants[idx], owner, sizeof(*owner));
>>> entry->participants_state[idx] =
>>> is_modified(entry) ?
>>> SHARED_LOCK_STATE_INVALIDATED :
>>> SHARED_LOCK_STATE_SHARED;
>>> 
>>> A fix may be:
>>> 
>>> idx = entry->nr_participants+ 1;
>>> memcpy(&entry->participants[idx], owner, sizeof(*owner));
>>> entry->participants_state[idx] =
>>> is_modified(entry) ?
>>> SHARED_LOCK_STATE_INVALIDATED :
>>> SHARED_LOCK_STATE_SHARED;
>>> entry->nr_participants++;
>>> 
>>> Please tell me if this would be a good fix.
>>> 
>>> I was investigating a panic from is_modified where
>>> is_valid_shared_state finds an invalid shared state - "invalid
>>> shared state, two (or more) nodes are owning VDI..."
>> 
>> Good catch, thanks a lot! Could you create a PR on github for your
>> change?
>> 
>> Thanks,
>> Hitoshi



More information about the sheepdog-users mailing list