From 6a349fc0c29c09ba6a4a74c43abdf3f5b1b9f031 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" (cherry picked from commit a197a89d65c76c51cbc24890474ad27f72ebe382) --- 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 400205503e2c5..e954c8912a57f 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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()); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index c5fae6989cfe3..66cecfc098479 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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; -- 2.39.5