]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix hang issue when accessing a file under a lost parent directory 35690/head
authorZhi Zhang <willzzhang@tencent.com>
Fri, 10 Jul 2020 09:03:50 +0000 (17:03 +0800)
committerZhi Zhang <willzzhang@tencent.com>
Fri, 10 Jul 2020 09:03:50 +0000 (17:03 +0800)
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 <zhangz.david@outlook.com>
src/mds/CDir.cc
src/mds/CDir.h

index 627b7a313ab3fcdde6b756f01b0cac7bb0f5c48c..c2393dfa15fe36d33ffb5ad6dd61ab0dbdad67db 100644 (file)
@@ -2045,20 +2045,6 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& 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);
 }
 
 // -----------------------
index 4ad5edfd5de74a357f39f0159c646d3ceeff9a5d..52e01001b147fa09d7667f7b4664b043c4589ef5 100644 (file)
@@ -648,11 +648,6 @@ protected:
       const std::set<snapid_t> *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)
    */