From: Yan, Zheng Date: Sat, 7 Dec 2013 23:33:19 +0000 (+0800) Subject: mds: fix discover path race X-Git-Tag: v0.75~93^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80005f1ece5b7e0584b28d835f0a270632552be6;p=ceph.git mds: fix discover path race When C_MDC_RetryDiscoverPath executed, we may have already become auth mds of base Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index a02e7e7e5645..1ac26fd1c8d8 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1145,11 +1145,14 @@ void CDir::take_sub_waiting(list& ls) waiting_on_dentry.clear(); put(PIN_DNWAITER); } - for (map >::iterator p = waiting_on_ino.begin(); - p != waiting_on_ino.end(); - ++p) - ls.splice(ls.end(), p->second); - waiting_on_ino.clear(); + if (!waiting_on_ino.empty()) { + for (map >::iterator p = waiting_on_ino.begin(); + p != waiting_on_ino.end(); + ++p) + ls.splice(ls.end(), p->second); + waiting_on_ino.clear(); + put(PIN_INOWAITER); + } } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index a7d181b02cf0..e25df16cf284 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -9820,7 +9820,12 @@ void MDCache::discover_path(CInode *base, onfinish = new C_MDC_RetryDiscoverPath(this, base, snap, want_path, from); base->add_waiter(CInode::WAIT_SINGLEAUTH, onfinish); return; - } + } else if (from == mds->get_nodeid()) { + list finished; + base->take_waiting(CInode::WAIT_DIR, finished); + mds->queue_waiters(finished); + return; + } if ((want_xlocked && want_path.depth() == 1) || !base->is_waiter_for(CInode::WAIT_DIR) || !onfinish) { // FIXME: weak! @@ -9868,6 +9873,11 @@ void MDCache::discover_path(CDir *base, onfinish = new C_MDC_RetryDiscoverPath2(this, base, snap, want_path); base->add_waiter(CDir::WAIT_SINGLEAUTH, onfinish); return; + } else if (from == mds->get_nodeid()) { + list finished; + base->take_sub_waiting(finished); + mds->queue_waiters(finished); + return; } if ((want_xlocked && want_path.depth() == 1) || @@ -9915,7 +9925,12 @@ void MDCache::discover_ino(CDir *base, onfinish = new C_MDC_RetryDiscoverIno(this, base, want_ino); base->add_waiter(CDir::WAIT_SINGLEAUTH, onfinish); return; - } + } else if (from == mds->get_nodeid()) { + list finished; + base->take_sub_waiting(finished); + mds->queue_waiters(finished); + return; + } if (want_xlocked || !base->is_waiting_for_ino(want_ino) || !onfinish) { discover_info_t& d = _create_discover(from);