From 44bc687d98f931b15538805d3923492d62dca779 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 28 Nov 2012 21:19:01 -0800 Subject: [PATCH] mds: fix request_kill() Only request_cleanup() if the request isn't already committing. If it is, wait for it to commit before we clean up. It might fix all of #3531, #3210, #1947, and #1548. Maybe. Signed-off-by: Sage Weil --- src/mds/MDCache.cc | 8 ++++++-- src/mds/Server.cc | 9 +++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 993cbcf5ad78b..2ab85808e7e9b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7605,8 +7605,12 @@ void MDCache::request_cleanup(MDRequest *mdr) void MDCache::request_kill(MDRequest *mdr) { - dout(10) << "request_kill " << *mdr << dendl; - request_cleanup(mdr); + if (!mdr->committing) { + dout(10) << "request_kill " << *mdr << dendl; + request_cleanup(mdr); + } else { + dout(10) << "request_kill " << *mdr << " -- already committing, no-op" << dendl; + } } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index fbb0289c28358..157f5c1d150cb 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -496,12 +496,13 @@ void Server::journal_close_session(Session *session, int state) mdlog->flush(); // clean up requests, too - while (!session->requests.empty()) { - MDRequest *mdr = session->requests.front(member_offset(MDRequest, - item_session_request)); + elist::iterator p = session->requests.begin(member_offset(MDRequest, + item_session_request)); + while (!p.end()) { + MDRequest *mdr = *p; + ++p; mdcache->request_kill(mdr); } - } void Server::reconnect_clients() -- 2.39.5