]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix request_kill()
authorSage Weil <sage@inktank.com>
Thu, 29 Nov 2012 05:19:01 +0000 (21:19 -0800)
committerSage Weil <sage@inktank.com>
Fri, 30 Nov 2012 01:20:16 +0000 (17:20 -0800)
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>
src/mds/MDCache.cc
src/mds/Server.cc

index 993cbcf5ad78b9abba4970dc5f35534e28066c11..2ab85808e7e9b2debb3065c239d2c1dabb683968 100644 (file)
@@ -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;
+  }
 }
 
 
index fbb0289c283587889a00efd6e8ac1882c465b7fd..157f5c1d150cb498491552334a8f3d21b13cde30 100644 (file)
@@ -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()