From: Yan, Zheng Date: Fri, 21 Jun 2019 08:24:51 +0000 (+0800) Subject: mds: cleanup truncating inodes when standby replay mds trim log segments X-Git-Tag: v15.1.0~2130^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=32121878dd0eef11e481162ebf924a14a91dd341;p=ceph-ci.git mds: cleanup truncating inodes when standby replay mds trim log segments 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" --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index c3bd1ff6f79..d57e655c24f 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7273,6 +7273,13 @@ void MDCache::standby_trim_segment(LogSegment *ls) in->dirfragtreelock.remove_dirty(); try_trim_inode(in); } + while (!ls->truncating_inodes.empty()) { + auto it = ls->truncating_inodes.begin(); + CInode *in = *it; + ls->truncating_inodes.erase(it); + in->put(CInode::PIN_TRUNCATING); + try_trim_inode(in); + } } void MDCache::handle_cache_expire(const cref_t &m)