[Pvfs2-developers] duplicate entries in directory listing
Phil Carns
pcarns at wastedcycles.org
Mon Oct 9 16:23:22 EDT 2006
Phil Carns wrote:
>
>> I started thinking about some more possible ideas, but I realized
>> after looking closer at the code that I don't actually see why
>> duplicates would occur in the first place with the algorithm that is
>> being used :) I apologize if this has been discussed a few times
>> already, but could we walk through it one more time?
>>
>> I know that the request protocol uses a token (integer based) to keep
>> track of position. However, the pcache converts this into a
>> particular key based on where the last iteration left off. This key
>> contains the handle as well as the alphanumeric name of the entry.
>>
>> Trove then does a c_get on that key with the DB_SET flag, which should
>> put the cursor at the proper position. If the entry has been deleted
>> (which is not happening in my case- I am only creating files), then it
>> retries the c_get with the DB_SET_RANGE flag which should set the
>> cursor at the next position. "next" in this case is defined by the
>> comparison function, PINT_trove_dbpf_keyval_compare().
>>
>> The keyval_comare() function sorts the keys based on handle value,
>> then key length, then stncmp of the key name.
>>
>> This means that essentially we are indexing off of the name of the
>> entry rather than a position in the database.
>>
>> So how could inserting a new entry between readdir requests cause a
>> duplicate? The old entry that is stored in the pcache should still be
>> valid. If the newly inserted entry comes after it (according to the
>> keyval_comare() sort order), then we should see it as we continue
>> iterating. If the new entry comes before it, then it should not show
>> up (we don't back up in the directory listing). It doesn't seem like
>> there should be any combination that causes it to show up twice.
>>
>> Is c_get() not traversing the db in the order defined by the
>> keyval_comare() function?
>>
>> The only other danger that I see is that if the pcache_lookup() fails,
>> the code falls back to stepping linearly through the db to the token
>> position which I could imagine might have ordering implications.
>> However, I am only talking to the server from a single client, so I
>> don't see why it would ever miss the pcache lookup.
>>
>> I just want to confirm that there is actually an algorithm problem
>> here rather than just a bug in the code somewhere.
>
>
> Oh, or is the problem in how the end of the directory is detected? Does
> the client do something like issuing a readdir until it gets a response
> with zero entries? I haven't looked at how this works yet, but I
> imagine that could throw a wrench into things if the directory gets
> additional entries between when the server first indicates that it has
> reached the end and when the client gives up on asking for more.
I just tried repeating the test a few times, replacing the "ls" in my
test script with either "pvfs2-ls" or "pvfs2-ls -al". I cannot trigger
the problem when using pvfs2-ls.
If I switch back to "ls" or "/bin/ls" the problem shows up reliably.
Is there anything fundamentally different between how pvfs2-ls works and
how the vfs readdir path works, or is pvfs2-ls somehow getting luckier
with the timing?
-Phil
More information about the Pvfs2-developers
mailing list