From: Yan, Zheng Date: Sun, 22 Jan 2017 08:38:27 +0000 (+0800) Subject: mds: ignore useless slave request replies during recovery X-Git-Tag: v12.0.0~43^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cdc2eb8a683b971de1fb843e77c18945ee265f65;p=ceph.git mds: ignore useless slave request replies during recovery 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" --- diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index a9c41193478..4bd7e77cdfc 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 0eefba49d28..a13857ce0c9 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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;