]> 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)
committerYan, Zheng <zyan@redhat.com>
Fri, 23 Feb 2018 03:35:10 +0000 (11:35 +0800)
Fixes: http://tracker.ceph.com/issues/23059
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDCache.cc
src/mds/Server.cc

index de600c84f02bb87146d49a9967b4a2b4c8cbaec6..fb2b56c2942d2f29fdd5ef087abd184c1686b3d2 100644 (file)
@@ -9311,9 +9311,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 b0980b33756ec743a306571f1a496fef708fd4d1..517fb293ccb2daf1406b9a65cf7b289e488603ff 100644 (file)
@@ -1743,6 +1743,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;