]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: allow early reply when there is no journaled slave update
authorYan, Zheng <zheng.z.yan@intel.com>
Thu, 8 May 2014 09:02:18 +0000 (17:02 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Sun, 18 May 2014 05:13:22 +0000 (13:13 +0800)
Early reply should be Ok when there were slave requests, but none
of them modifies any object.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Mutation.h
src/mds/Server.cc
src/messages/MMDSSlaveRequest.h

index e07089ddbc225393897508a2dd131b0d0382bf88..2a704235d5e2e7947035d554c4f2897b37055aa8 100644 (file)
@@ -209,6 +209,7 @@ struct MDRequestImpl : public MutationImpl, public TrackedOp {
     set<int> witnessed;       // nodes who have journaled a RenamePrepare
     map<MDSCacheObject*,version_t> pvmap;
 
+    bool has_journaled_slaves;
     bool slave_update_journaled;
     
     // for rename
@@ -244,7 +245,7 @@ struct MDRequestImpl : public MutationImpl, public TrackedOp {
     dirfrag_t fragment_base;
 
     More() : 
-      slave_update_journaled(false),
+      has_journaled_slaves(false), slave_update_journaled(false),
       srcdn_auth_mds(-1), inode_import_v(0), rename_inode(0),
       is_freeze_authpin(false), is_ambiguous_auth(false),
       is_remote_frozen_authpin(false), is_inode_exporter(false),
index 9351fc6a6006b3f80511856e0b2a89abca70d942..e7440f021820d132243684cd6d6133f116cf4d10 100644 (file)
@@ -845,8 +845,8 @@ void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn)
   if (!g_conf->mds_early_reply)
     return;
 
-  if (mdr->has_witnesses()) {
-    dout(10) << "early_reply - there are witnesses, not allowed." << dendl;
+  if (mdr->has_more() && mdr->more()->has_journaled_slaves) {
+    dout(10) << "early_reply - there are journaled slaves, not allowed." << dendl;
     mds->mdlog->flush();
     return; 
   }
@@ -4562,6 +4562,7 @@ void Server::handle_slave_link_prep(MDRequestRef& mdr)
   // set up commit waiter
   mdr->more()->slave_commit = new C_MDS_SlaveLinkCommit(this, mdr, targeti);
 
+  mdr->more()->slave_update_journaled = true;
   submit_mdlog_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti),
                      mdr, __func__);
   mdlog->flush();
@@ -4742,6 +4743,8 @@ void Server::handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m)
   // witnessed!
   assert(mdr->more()->witnessed.count(from) == 0);
   mdr->more()->witnessed.insert(from);
+  assert(!m->is_not_journaled());
+  mdr->more()->has_journaled_slaves = true;
   
   // remove from waiting list
   assert(mdr->more()->waiting_on_slave.count(from));
@@ -5134,6 +5137,7 @@ void Server::handle_slave_rmdir_prep(MDRequestRef& mdr)
 
     MMDSSlaveRequest *reply = new MMDSSlaveRequest(mdr->reqid, mdr->attempt,
                                                   MMDSSlaveRequest::OP_RMDIRPREPACK);
+    reply->mark_not_journaled();
     mds->send_message_mds(reply, mdr->slave_to_mds);
 
     // send caps to auth (if we're not already)
@@ -5207,6 +5211,8 @@ void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ac
 
   mdr->more()->slaves.insert(from);
   mdr->more()->witnessed.insert(from);
+  if (!ack->is_not_journaled())
+    mdr->more()->has_journaled_slaves = true;
 
   // remove from waiting list
   assert(mdr->more()->waiting_on_slave.count(from));
@@ -6659,8 +6665,11 @@ void Server::_logged_slave_rename(MDRequestRef& mdr,
 
   // prepare ack
   MMDSSlaveRequest *reply = NULL;
-  if (!mdr->aborted)
+  if (!mdr->aborted) {
     reply= new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RENAMEPREPACK);
+    if (!mdr->more()->slave_update_journaled)
+      reply->mark_not_journaled();
+  }
 
   CDentry::linkage_t *srcdnl = srcdn->get_linkage();
   CDentry::linkage_t *destdnl = NULL; 
@@ -7180,6 +7189,8 @@ void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *a
   assert(mdr->more()->witnessed.count(from) == 0);
   if (ack->witnesses.empty()) {
     mdr->more()->witnessed.insert(from);
+    if (!ack->is_not_journaled())
+      mdr->more()->has_journaled_slaves = true;
   } else {
     dout(10) << " extra witnesses (srcdn replicas) are " << ack->witnesses << dendl;
     mdr->more()->extra_witnesses.swap(ack->witnesses);
index 15f095bf7748a1433e30b4eb19dc3e979854997a..455bc6361b6d72e36b7f9bc0fd0a0d3544b4786a 100644 (file)
@@ -98,6 +98,7 @@ class MMDSSlaveRequest : public Message {
 
   static const unsigned FLAG_NONBLOCK  = 1;
   static const unsigned FLAG_WOULDBLOCK        = 2;
+  static const unsigned FLAG_NOTJOURNALED = 4;
 
   // for locking
   __u16 lock_type;  // lock object type
@@ -133,6 +134,8 @@ public:
   bool is_nonblock() { return (flags & FLAG_NONBLOCK); }
   void mark_error_wouldblock() { flags |= FLAG_WOULDBLOCK; }
   bool is_error_wouldblock() { return (flags & FLAG_WOULDBLOCK); }
+  void mark_not_journaled() { flags |= FLAG_NOTJOURNALED; }
+  bool is_not_journaled() { return (flags & FLAG_NOTJOURNALED); }
 
   void set_lock_type(int t) { lock_type = t; }