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: v15.2.9~122^2~53^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2515d60f8db8e5488c0d39f036ac73984bfbe39e;p=ceph.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 (cherry picked from commit 778917c426d3c8611c5e5f209840a674c09fef0a) --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 67f46df98a5..7d20acc30cf 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -2046,20 +2046,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; @@ -2084,10 +2070,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 aa447a88d00..42f1feedfb3 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -646,11 +646,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) */