From: Patrick Donnelly Date: Thu, 4 May 2017 02:42:57 +0000 (-0400) Subject: mds: remove unnecessary check for parent pins X-Git-Tag: v12.0.3~38^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=41a44ae964544161df04e039bf42b6bc151b5eb3;p=ceph.git mds: remove unnecessary check for parent pins With Zheng's help, now that the code has captured all the paths where an inode should be checked for export pins, we don't need to look at parents anymore. Signed-off-by: Patrick Donnelly --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 4eade9fce5f7..9a68bf118840 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -4419,68 +4419,42 @@ void CInode::maybe_export_pin() if (g_conf->mds_bal_export_pin && is_dir()) { dout(20) << "maybe_export_pin " << *this << dendl; mds_rank_t pin = get_projected_inode()->export_pin; - if (pin == MDS_RANK_NONE) { - if (!mdcache->export_pin_queue.count(this)) { - /* Try to find farthest full auth parent fragment which is pinned - * elsewhere. There cannot be a break in the authority chain of - * directories, otherwise this inode itself will not be exported. - */ - CInode *auth_last = this; /* N.B. we may not be full auth for any fragments of this inode, but adding it to the queue is harmless. */ - bool auth_barrier = false; - for (CDir *cd = get_projected_parent_dir(); cd && !cd->inode->is_base() && !cd->inode->is_system(); cd = cd->inode->get_projected_parent_dir()) { - if (cd->is_full_dir_auth() && !auth_barrier) { - auth_last = cd->inode; + if (pin == mdcache->mds->get_nodeid()) { + for (auto it = dirfrags.begin(); it != dirfrags.end(); it++) { + CDir *cd = it->second; + if (cd->state_test(CDir::STATE_AUXSUBTREE)) continue; + CDir *subtree = mdcache->get_subtree_root(cd); + if (!subtree) continue; + if (subtree->is_ambiguous_auth()) { + subtree->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_CInode_ExportPin(this)); + dout(15) << "aux subtree pin of " << *cd << " delayed for single auth on subtree " << *subtree << dendl; + } else if (subtree->is_auth()) { + assert(cd->is_auth()); + if (subtree->is_frozen() || subtree->is_freezing()) { + subtree->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_CInode_ExportPin(this)); + dout(15) << "aux subtree pin of " << *cd << " delayed for unfreeze on subtree " << *subtree << dendl; } else { - auth_barrier = true; - } - pin = cd->inode->get_projected_inode()->export_pin; - if (pin != MDS_RANK_NONE) { - if (pin != mdcache->mds->get_nodeid()) { - dout(20) << "adding ancestor to export_pin_queue " << *auth_last << dendl; - mdcache->export_pin_queue.insert(auth_last); - } - break; + cd->state_set(CDir::STATE_AUXSUBTREE); + mdcache->adjust_subtree_auth(cd, mdcache->mds->get_nodeid()); + dout(15) << "aux subtree pinned " << *cd << dendl; } + } else { + assert(!cd->is_auth()); + dout(15) << "not setting aux subtree pin for " << *cd << " because not auth" << dendl; } } - } else { - if (pin == mdcache->mds->get_nodeid()) { - for (auto it = dirfrags.begin(); it != dirfrags.end(); it++) { - CDir *cd = it->second; - if (cd->state_test(CDir::STATE_AUXSUBTREE)) continue; - CDir *subtree = mdcache->get_subtree_root(cd); - if (!subtree) continue; - if (subtree->is_ambiguous_auth()) { - subtree->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_CInode_ExportPin(this)); - dout(15) << "aux subtree pin of " << *cd << " delayed for single auth on subtree " << *subtree << dendl; - } else if (subtree->is_auth()) { - assert(cd->is_auth()); - if (subtree->is_frozen() || subtree->is_freezing()) { - subtree->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_CInode_ExportPin(this)); - dout(15) << "aux subtree pin of " << *cd << " delayed for unfreeze on subtree " << *subtree << dendl; - } else { - cd->state_set(CDir::STATE_AUXSUBTREE); - mdcache->adjust_subtree_auth(cd, mdcache->mds->get_nodeid()); - dout(15) << "aux subtree pinned " << *cd << dendl; - } - } else { - assert(!cd->is_auth()); - dout(15) << "not setting aux subtree pin for " << *cd << " because not auth" << dendl; - } - } - } else { - for (auto it = dirfrags.begin(); it != dirfrags.end(); it++) { - CDir *cd = it->second; - if (cd->is_auth() && cd->state_test(CDir::STATE_AUXSUBTREE)) { - assert(!(cd->is_frozen() || cd->is_freezing())); - assert(!cd->state_test(CDir::STATE_EXPORTBOUND)); - cd->state_clear(CDir::STATE_AUXSUBTREE); /* merge will happen eventually */ - dout(15) << "cleared aux subtree pin " << *cd << dendl; - } + } else if (pin != MDS_RANK_NONE) { + for (auto it = dirfrags.begin(); it != dirfrags.end(); it++) { + CDir *cd = it->second; + if (cd->is_auth() && cd->state_test(CDir::STATE_AUXSUBTREE)) { + assert(!(cd->is_frozen() || cd->is_freezing())); + assert(!cd->state_test(CDir::STATE_EXPORTBOUND)); + cd->state_clear(CDir::STATE_AUXSUBTREE); /* merge will happen eventually */ + dout(15) << "cleared aux subtree pin " << *cd << dendl; } - dout(20) << "adding to export_pin_queue " << *this << dendl; - mdcache->export_pin_queue.insert(this); } + dout(20) << "adding to export_pin_queue " << *this << dendl; + mdcache->export_pin_queue.insert(this); } } } diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index d155169c9f79..41bc508d8f4c 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -2943,8 +2943,6 @@ void Migrator::decode_import_inode(CDentry *dn, bufferlist::iterator& blp, in->add_replica(oldauth, CInode::EXPORT_NONCE); if (in->is_replica(mds->get_nodeid())) in->remove_replica(mds->get_nodeid()); - - in->maybe_export_pin(); } void Migrator::decode_import_inode_caps(CInode *in, bool auth_cap,