From: Yan, Zheng Date: Fri, 23 Feb 2018 03:33:41 +0000 (+0800) Subject: mds: don't cleanup request that has pending remote authpin/wrlock/xlock X-Git-Tag: v12.2.5~42^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a349fc0c29c09ba6a4a74c43abdf3f5b1b9f031;p=ceph.git 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) --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 400205503e2c..e954c8912a57 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 c5fae6989cfe..66cecfc09847 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;