From a197a89d65c76c51cbc24890474ad27f72ebe382 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 23 Feb 2018 11:33:41 +0800 Subject: [PATCH] mds: don't cleanup request that has pending remote authpin/wrlock/xlock Fixes: http://tracker.ceph.com/issues/23059 Signed-off-by: "Yan, Zheng" --- src/mds/MDCache.cc | 10 ++++++++-- src/mds/Server.cc | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index de600c84f02..fb2b56c2942 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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()); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index b0980b33756..517fb293ccb 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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; -- 2.39.5