]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ignore ENOENT on writing backtrace 14682/head
authorJohn Spray <john.spray@redhat.com>
Tue, 28 Mar 2017 18:13:33 +0000 (14:13 -0400)
committerNathan Cutler <ncutler@suse.com>
Thu, 20 Apr 2017 13:14:54 +0000 (15:14 +0200)
We get ENOENT when a pool doesn't exist.  This can
happen because we don't prevent people deleting
former cephfs data pools whose files may not have
had their metadata flushed yet.

http://tracker.ceph.com/issues/19401
Signed-off-by: John Spray <john.spray@redhat.com>
(cherry picked from commit 3fccc2372f2715d075b05e459140360cf6e7ca96)

src/mds/CInode.cc

index 553549125e94da7df1171fa147870285469f6f2d..811f463354cda2f4f5ca27713cdeeb9be1c2cc13 100644 (file)
@@ -1198,6 +1198,23 @@ void CInode::store_backtrace(MDSInternalContextBase *fin, int op_prio)
 
 void CInode::_stored_backtrace(int r, version_t v, Context *fin)
 {
+  if (r == -ENOENT) {
+    const int64_t pool = get_backtrace_pool();
+    bool exists = mdcache->mds->objecter->with_osdmap(
+        [pool](const OSDMap &osd_map) {
+          return osd_map.have_pg_pool(pool);
+        });
+
+    // This ENOENT is because the pool doesn't exist (the user deleted it
+    // out from under us), so the backtrace can never be written, so pretend
+    // to succeed so that the user can proceed to e.g. delete the file.
+    if (!exists) {
+      dout(4) << "store_backtrace got ENOENT: a data pool was deleted "
+                 "beneath us!" << dendl;
+      r = 0;
+    }
+  }
+
   if (r < 0) {
     dout(1) << "store backtrace error " << r << " v " << v << dendl;
     mdcache->mds->clog->error() << "failed to store backtrace on ino "