diff options
author | Sage Weil <sage@inktank.com> | 2012-11-28 21:19:01 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-11-29 17:20:16 -0800 |
commit | 44bc687d98f931b15538805d3923492d62dca779 (patch) | |
tree | 25bf1c68ff44d071a48f73938edfeb30dbb64af9 | |
parent | abd9e36c5dbbc1ca16fd1e6b2fd79306da2dde00 (diff) | |
download | ceph-44bc687d98f931b15538805d3923492d62dca779.tar.gz |
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 <sage@inktank.com>
-rw-r--r-- | src/mds/MDCache.cc | 8 | ||||
-rw-r--r-- | 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 993cbcf5ad7..2ab85808e7e 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 fbb0289c283..157f5c1d150 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<MDRequest*>::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() |