From: Yan, Zheng Date: Wed, 17 May 2017 08:08:32 +0000 (+0800) Subject: mds: don't pin inodes in MDCache::export_pin_queue X-Git-Tag: v12.1.1~65^2~18^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4d66902ecf2ebd05901a5ee2c02e2ee19f3d2eb8;p=ceph.git mds: don't pin inodes in MDCache::export_pin_queue pinning inode can trigger assertion when replaying log 1: (()+0x560ceb) [0x55b263ff7ceb] 2: (()+0x115c0) [0x7fc0393a75c0] 3: (gsignal()+0x9f) [0x7fc03812f91f] 4: (abort()+0x16a) [0x7fc03813151a] 5: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x2bc) [0x55b26404158c] 6: (MDCache::remove_inode(CInode*)+0x316) [0x55b263d9c616] 7: (MDCache::trim_non_auth_subtree(CDir*)+0x4d8) [0x55b263d9cd68] 8: (MDCache::try_trim_non_auth_subtree(CDir*)+0x5e2) [0x55b263da7292] 9: (EExport::replay(MDSRank*)+0x549) [0x55b263fdc619] 10: (MDLog::_replay_thread()+0xd0f) [0x55b263f8580f] 11: (MDLog::ReplayThread::entry()+0xd) [0x55b263cebbfd] 12: (()+0x76ca) [0x7fc03939d6ca] 13: (clone()+0x5f) [0x7fc038201f7f] Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index ba2ebaab60a8..fdc264328f86 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -4419,7 +4419,7 @@ void CInode::maybe_export_pin(bool update) if (export_pin == MDS_RANK_NONE && !update) return; - if (mdcache->export_pin_queue.count(this)) + if (state_test(CInode::STATE_QUEUEDEXPORTPIN)) return; bool queue = false; @@ -4440,7 +4440,7 @@ void CInode::maybe_export_pin(bool update) queue = dir->state_test(CDir::STATE_AUXSUBTREE); } if (queue) { - get(CInode::PIN_EXPORTPINQUEUE); + state_set(CInode::STATE_QUEUEDEXPORTPIN); mdcache->export_pin_queue.insert(this); break; } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 0eb72690cc2b..a446bebb8cf3 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -153,7 +153,6 @@ class CInode : public MDSCacheObject, public InodeStoreBase, public Counterstate_clear(CInode::STATE_QUEUEDEXPORTPIN); q.erase(cur); - in->put(CInode::PIN_EXPORTPINQUEUE); } } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index ae1c7e250e4b..4b56cb879b63 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -295,6 +295,9 @@ void MDCache::remove_inode(CInode *o) o->item_open_file.remove_myself(); + if (o->state_test(CInode::STATE_QUEUEDEXPORTPIN)) + export_pin_queue.erase(o); + // remove from inode map inode_map.erase(o->vino());