]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ignore ENOENT on writing backtrace 16101/head
authorJohn Spray <john.spray@redhat.com>
Tue, 28 Mar 2017 18:13:33 +0000 (14:13 -0400)
committerNathan Cutler <ncutler@suse.com>
Tue, 4 Jul 2017 10:58:40 +0000 (12:58 +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 d2239317cdb15b4df5e3df51117ebae2ffb5afcb..e62d962ff635126b40649a0ff995b8a54eaa970f 100644 (file)
@@ -1201,6 +1201,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 "