]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make clientreplay go faster
authorSage Weil <sage@newdream.net>
Thu, 9 Jul 2009 16:11:57 +0000 (09:11 -0700)
committerSage Weil <sage@newdream.net>
Thu, 9 Jul 2009 16:11:57 +0000 (09:11 -0700)
Queue up next op as soon as we submit the journal entry.  That maintains
ordering while avoiding any waiting for the journal to flush.

src/TODO
src/mds/MDCache.cc
src/mds/Server.cc

index 10c529e3bc09c1352b0715a30f4f7a20faeddf87..931da36903f44db290da20e3a7fcdf649c8b0eec 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -131,7 +131,6 @@ uclient
 - fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
 
 mds
-- make clientreplay faster
 - fix file recovery
   - make sure we recover mtime, not just size.. i.e. max_size > 0, not > size.
   - disallow access until file is recovered?
index c027016f348230d435de1f4881f2e507a57b50e0..f65693b7a50fdfdf0ec143b1d06f558cc0d01cd6 100644 (file)
@@ -6215,11 +6215,6 @@ void MDCache::request_finish(MDRequest *mdr)
     mds->logger->favg(l_mds_replyl, g_clock.now() - mdr->client_request->get_recv_stamp());
   }
 
-  if (mdr->client_request && mdr->client_request->is_replay()) {
-    dout(10) << " queueing next replay op" << dendl;
-    mds->queue_one_replay();
-  }
-
   request_cleanup(mdr);
 }
 
@@ -6319,10 +6314,18 @@ void MDCache::request_cleanup(MDRequest *mdr)
   // remove from session
   mdr->session_request_item.remove_myself();
 
+  bool was_replay = mdr->client_request && mdr->client_request->is_replay();
+
   // remove from map
   active_requests.erase(mdr->reqid);
   mdr->put();
 
+  // fail-safe!
+  if (was_replay && active_requests.empty()) {
+    dout(10) << " fail-safe queueing next replay op" << dendl;
+    mds->queue_one_replay();
+  }
+
   if (mds->logger)
     log_stat();
 }
index 8837800fcb5524244f6078d54c8642ed41f7e62e..7fbec09a6f149ea93667efff83bf9966a557e7f8 100644 (file)
@@ -624,7 +624,14 @@ void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent
   mdlog->submit_entry(le, fin,
                      mdr->did_ino_allocation());
   
-  if (mdr->did_early_reply)
+  if (mdr->client_request && mdr->client_request->is_replay()) {
+    if (mds->queue_one_replay()) {
+      dout(10) << " queued next replay op" << dendl;
+    } else {
+      dout(10) << " journaled last replay op, flushing" << dendl;
+      mdlog->flush();
+    }
+  } else if (mdr->did_early_reply)
     mds->locker->drop_rdlocks(mdr);
   else
     mdlog->flush();