summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-11-28 21:19:01 -0800
committerSage Weil <sage@inktank.com>2012-11-29 17:20:16 -0800
commit44bc687d98f931b15538805d3923492d62dca779 (patch)
tree25bf1c68ff44d071a48f73938edfeb30dbb64af9
parentabd9e36c5dbbc1ca16fd1e6b2fd79306da2dde00 (diff)
downloadceph-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.cc8
-rw-r--r--src/mds/Server.cc9
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()