From da63b206523f109a03d61155bd4bb65bf6895d48 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 21 Jun 2019 16:24:51 +0800 Subject: [PATCH] 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" (cherry picked from commit 32121878dd0eef11e481162ebf924a14a91dd341) --- src/mds/MDCache.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 18fa35ae6b72d..b903a039d5cee 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7383,6 +7383,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); + } } /* This function DOES put the passed message before returning */ -- 2.39.5