From: Zhi Zhang Date: Fri, 10 Jul 2020 09:03:50 +0000 (+0800) Subject: mds: fix hang issue when accessing a file under a lost parent directory X-Git-Tag: wip-pdonnell-testing-20200918.022351~685^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=778917c426d3c8611c5e5f209840a674c09fef0a;p=ceph-ci.git mds: fix hang issue when accessing a file under a lost parent directory When a directory metadata is lost, if we looked up a file under this lost directory, this request will hang forever. Fixes: https://tracker.ceph.com/issues/46129 Signed-off-by: Zhi Zhang --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 627b7a313ab..c2393dfa15f 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -2045,20 +2045,6 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, } } -void CDir::_go_bad() -{ - if (get_version() == 0) - set_version(1); - state_set(STATE_BADFRAG); - // mark complete, !fetching - mark_complete(); - state_clear(STATE_FETCHING); - auth_unpin(this); - - // kick waiters - finish_waiting(WAIT_COMPLETE, -EIO); -} - void CDir::go_bad_dentry(snapid_t last, std::string_view dname) { dout(10) << __func__ << " " << dname << dendl; @@ -2083,10 +2069,17 @@ void CDir::go_bad(bool complete) ceph_abort(); // unreachable, damaged() respawns us } - if (complete) - _go_bad(); - else - auth_unpin(this); + if (complete) { + if (get_version() == 0) + set_version(1); + + state_set(STATE_BADFRAG); + mark_complete(); + } + + state_clear(STATE_FETCHING); + auth_unpin(this); + finish_waiting(WAIT_COMPLETE, -EIO); } // ----------------------- diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 4ad5edfd5de..52e01001b14 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -648,11 +648,6 @@ protected: const std::set *snaps, bool *force_dirty); - /** - * Mark this fragment as BADFRAG (common part of go_bad and go_bad_dentry) - */ - void _go_bad(); - /** * Go bad due to a damaged dentry (register with damagetable and go BADFRAG) */