]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ignore useless slave request replies during recovery
authorYan, Zheng <zyan@redhat.com>
Sun, 22 Jan 2017 08:38:27 +0000 (16:38 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 23 Jan 2017 09:42:43 +0000 (17:42 +0800)
During mds recovers, most slave request replies are useless. If
corresponding master was not committed, slave requests will be
rollback. If corresponding master was committed, it's only
possible to receive slave request reply of type OP_COMMITTED.
The OP_COMMITTED replay is useful only if it's was triggered
by the recovering mds's resolve ack message.

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

index a9c41193478a79f48c2aeb528d9f8788445333cf..4bd7e77cdfcf7dafd214af7b00a5ba6328cf7b0b 100644 (file)
@@ -369,6 +369,9 @@ public:
   void wait_for_uncommitted_master(metareqid_t reqid, MDSInternalContextBase *c) {
     uncommitted_masters[reqid].waiters.push_back(c);
   }
+  bool have_uncommitted_master(metareqid_t reqid) {
+    return uncommitted_masters.count(reqid);
+  }
   void log_master_commit(metareqid_t reqid);
   void logged_master_update(metareqid_t reqid);
   void _logged_master_commit(metareqid_t reqid);
index 0eefba49d28fecd87ab1a5e718ca2dcdc6be3584..a13857ce0c99fd7be3bdda2247357c25dddc58b7 100644 (file)
@@ -1737,6 +1737,12 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m)
   mds_rank_t from = mds_rank_t(m->get_source().num());
   
   if (!mds->is_clientreplay() && !mds->is_active() && !mds->is_stopping()) {
+    metareqid_t r = m->get_reqid();
+    if (!mdcache->have_uncommitted_master(r)) {
+      dout(10) << "handle_slave_request_reply ignoring reply from unknown reqid " << r << dendl;
+      m->put();
+      return;
+    }
     dout(3) << "not clientreplay|active yet, waiting" << dendl;
     mds->wait_for_replay(new C_MDS_RetryMessage(mds, m));
     return;
@@ -1750,11 +1756,6 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m)
   }
 
   MDRequestRef mdr = mdcache->request_get(m->get_reqid());
-  if (!mdr.get()) {
-    dout(10) << "handle_slave_request_reply ignoring reply from unknown reqid " << m->get_reqid() << dendl;
-    m->put();
-    return;
-  }
   if (m->get_attempt() != mdr->attempt) {
     dout(10) << "handle_slave_request_reply " << *mdr << " ignoring reply from other attempt "
             << m->get_attempt() << dendl;