From 778917c426d3c8611c5e5f209840a674c09fef0a Mon Sep 17 00:00:00 2001 From: Zhi Zhang Date: Fri, 10 Jul 2020 17:03:50 +0800 Subject: [PATCH] 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 --- src/mds/CDir.cc | 29 +++++++++++------------------ src/mds/CDir.h | 5 ----- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 627b7a313ab3..c2393dfa15fe 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 4ad5edfd5de7..52e01001b147 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) */ -- 2.47.3