]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: tracking committing and rolling back slave requests
authorYan, Zheng <zyan@redhat.com>
Mon, 6 Feb 2017 07:54:57 +0000 (15:54 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 20 Feb 2017 08:12:36 +0000 (16:12 +0800)
When handling mds failure, we need to distinguish committing and
'rolling back' slave requests from unprepared slave requests.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDCache.cc
src/mds/Mutation.cc
src/mds/Mutation.h
src/mds/Server.cc

index 48b8c51bfe8e3a077d1977f6cd161724960a6bbd..f635135548e375e0e9257c982fe8c5670b9bb0de 100644 (file)
@@ -2895,9 +2895,9 @@ void MDCache::handle_mds_failure(mds_rank_t who)
          }
          mdr->more()->waiting_on_slave.clear();
        }
-      } else {
+      } else if (!mdr->committing) {
        dout(10) << " slave request " << *mdr << " has no prepare, finishing up" << dendl;
-       if (mdr->slave_request)
+       if (mdr->slave_request || mdr->slave_rolling_back())
          mdr->aborted = true;
        else
          finish.push_back(mdr);
@@ -8986,8 +8986,15 @@ void MDCache::request_finish(MDRequestRef& mdr)
   if (mdr->has_more() && mdr->more()->slave_commit) {
     Context *fin = mdr->more()->slave_commit;
     mdr->more()->slave_commit = 0;
-    int ret = mdr->aborted ? -1 : 0;
-    mdr->aborted = false;
+    int ret;
+    if (mdr->aborted) {
+      mdr->aborted = false;
+      ret = -1;
+      mdr->more()->slave_rolling_back = true;
+    } else {
+      ret = 0;
+      mdr->committing = true;
+    }
     fin->complete(ret);   // this must re-call request_finish.
     return; 
   }
index a8bd18d3709322ee9c41b05367922dc90d271ea3..15db202cb2855bf2c6c605470fadfb812d81388c 100644 (file)
@@ -211,6 +211,11 @@ bool MDRequestImpl::slave_did_prepare()
   return has_more() && more()->slave_commit;
 }
 
+bool MDRequestImpl::slave_rolling_back()
+{
+  return has_more() && more()->slave_rolling_back;
+}
+
 bool MDRequestImpl::did_ino_allocation() const
 {
   return alloc_ino || used_prealloc_ino || prealloc_inos.size();
index a8f66465edf7a7dc70e4f451f135e064d0efb89e..e5df22d135a9e11ced61a5d9b43953237289acf2 100644 (file)
@@ -230,6 +230,7 @@ struct MDRequestImpl : public MutationImpl {
 
     bool has_journaled_slaves;
     bool slave_update_journaled;
+    bool slave_rolling_back;
     
     // for rename
     set<mds_rank_t> extra_witnesses; // replica list from srcdn auth (rename)
@@ -270,6 +271,7 @@ struct MDRequestImpl : public MutationImpl {
     More() : 
       slave_error(0),
       has_journaled_slaves(false), slave_update_journaled(false),
+      slave_rolling_back(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),
@@ -317,6 +319,7 @@ struct MDRequestImpl : public MutationImpl {
   bool has_more() const;
   bool has_witnesses();
   bool slave_did_prepare();
+  bool slave_rolling_back();
   bool did_ino_allocation() const;
   bool freeze_auth_pin(CInode *inode);
   void unfreeze_auth_pin(bool clear_inode=false);
index ea79583496066421fc8e665fed40c6f2598c8f0d..2acadc3886fc9784d50ff261bb63c9bf2ede48e4 100644 (file)
@@ -5324,7 +5324,8 @@ void Server::_commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti)
     // write a commit to the journal
     ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_commit", mdr->reqid, mdr->slave_to_mds,
                                        ESlaveUpdate::OP_COMMIT, ESlaveUpdate::LINK);
-    mdlog->start_submit_entry(le, new C_MDS_CommittedSlave(this, mdr));
+    mdlog->start_entry(le);
+    submit_mdlog_entry(le, new C_MDS_CommittedSlave(this, mdr), mdr, __func__);
     mdlog->flush();
   } else {
     do_link_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
@@ -7901,8 +7902,10 @@ void Server::_rename_rollback_finish(MutationRef& mut, MDRequestRef& mdr, CDentr
       mdr->more()->is_ambiguous_auth = false;
     }
     mds->queue_waiters(finished);
-    if (finish_mdr)
+    if (finish_mdr || mdr->aborted)
       mdcache->request_finish(mdr);
+    else
+      mdr->more()->slave_rolling_back = false;
   }
 
   mdcache->finish_rollback(mut->reqid);