]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix readdir vs fragmentation race 11416/head
authorYan, Zheng <zyan@redhat.com>
Tue, 20 Sep 2016 10:07:56 +0000 (18:07 +0800)
committerLoic Dachary <ldachary@redhat.com>
Tue, 11 Oct 2016 08:51:03 +0000 (10:51 +0200)
following sequence of events tigger the race

client readdir frag 0* -> got item 'A'
MDS merges frag 0* and frag 1*
client send readdir request (frag 1*, offset 2, readdir_start 'A')
MDS reply items (that are after item 'A') in frag *

Fixes: http://tracker.ceph.com/issues/17286
Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit feb63776d4f2b03ece189715fdd75da5cae2afc2)

src/client/Client.cc

index b465cadec55f2f337b6e74fce0b0d411f0cbe7b9..473874298b64a351568728a18cccdfffddcd2547 100644 (file)
@@ -1147,7 +1147,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
                   << ", readdir_start " << readdir_start << dendl;
 
     if (diri->snapid != CEPH_SNAPDIR &&
-       fg.is_leftmost() && readdir_offset == 2) {
+       fg.is_leftmost() && readdir_offset == 2 && readdir_start.empty()) {
       dirp->release_count = diri->dir_release_count;
       dirp->ordered_count = diri->dir_ordered_count;
       dirp->start_shared_gen = diri->shared_gen;