]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't cleanup request that has pending remote authpin/wrlock/xlock
authorYan, Zheng <zyan@redhat.com>
Fri, 23 Feb 2018 03:33:41 +0000 (11:33 +0800)
committerNathan Cutler <ncutler@suse.com>
Mon, 2 Apr 2018 10:40:57 +0000 (12:40 +0200)
Fixes: http://tracker.ceph.com/issues/23059
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit a197a89d65c76c51cbc24890474ad27f72ebe382)

src/mds/MDCache.cc
src/mds/Server.cc

index 400205503e2c53bcc7151b42b451f02636232184..e954c8912a57fbc6c470ff20d3626dac6556e3c7 100644 (file)
@@ -9237,9 +9237,15 @@ void MDCache::request_cleanup(MDRequestRef& mdr)
 void MDCache::request_kill(MDRequestRef& mdr)
 {
   // rollback slave requests is tricky. just let the request proceed.
-  if (mdr->done_locking && mdr->has_more() &&
+  if (mdr->has_more() &&
       (!mdr->more()->witnessed.empty() || !mdr->more()->waiting_on_slave.empty())) {
-    dout(10) << "request_kill " << *mdr << " -- already started slave requests, no-op" << dendl;
+    if (!mdr->done_locking) {
+      assert(mdr->more()->witnessed.empty());
+      mdr->aborted = true;
+      dout(10) << "request_kill " << *mdr << " -- waiting for slave reply, delaying" << dendl;
+    } else {
+      dout(10) << "request_kill " << *mdr << " -- already started slave prep, no-op" << dendl;
+    }
 
     assert(mdr->used_prealloc_ino == 0);
     assert(mdr->prealloc_inos.empty());
index c5fae6989cfe3cad6a027b13d7113bf2288b4324..66cecfc0984794b9414ec3303d3592ce209438f9 100644 (file)
@@ -1735,6 +1735,10 @@ void Server::dispatch_client_request(MDRequestRef& mdr)
   if (mdr->killed) {
     dout(10) << "request " << *mdr << " was killed" << dendl;
     return;
+  } else if (mdr->aborted) {
+    mdr->aborted = false;
+    mdcache->request_kill(mdr);
+    return;
   }
 
   MClientRequest *req = mdr->client_request;