]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: cleanup truncating inodes when standby replay mds trim log segments 31286/head
authorYan, Zheng <zyan@redhat.com>
Fri, 21 Jun 2019 08:24:51 +0000 (16:24 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 31 Oct 2019 11:24:08 +0000 (19:24 +0800)
Standby replay mds first trims expired log segments, then replays new
log segments. It's possible a 'truncate_start' log event is in expired,
but its 'truncate_finish' counterpart is the new log segments. When mds
replays the 'truncate_finish' log event, log segment that contains the
'truncate_start' is already trimmed, so mds does nothing. This causes
leak of Inode::PIN_TRUNCATING and trigger assertion when removing
corresponding inode.

Fixes: https://tracker.ceph.com/issues/40477
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 32121878dd0eef11e481162ebf924a14a91dd341)

Conflicts:
       src/mds/MDCache.cc

src/mds/MDCache.cc

index 3bb86b9b30dbcedd9599851efddc19d12e37f786..fb37bf94680f0c552c5e1b435e7be78f8e057d58 100644 (file)
@@ -7247,6 +7247,12 @@ void MDCache::standby_trim_segment(LogSegment *ls)
     CInode *in = ls->dirty_dirfrag_dirfragtree.front();
     in->dirfragtreelock.remove_dirty();
   }
+  while (!ls->truncating_inodes.empty()) {
+    auto it = ls->truncating_inodes.begin();
+    CInode *in = *it;
+    ls->truncating_inodes.erase(it);
+    in->put(CInode::PIN_TRUNCATING);
+  }
 }
 
 /* This function DOES put the passed message before returning */