From: Yan, Zheng Date: Wed, 19 Sep 2012 07:52:36 +0000 (+0800) Subject: mds: Clean up finished two phase commits X-Git-Tag: v0.53~83 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=8276fa2901ee57e38d6906ad07213a9fdc288923;p=ceph.git mds: Clean up finished two phase commits When handling master request with slaves, the mds could crash after receiving all slaves' commit acknowledgement, but before journalling the ECommitted. Current MDS recovery code does not handle this case correctly, the request will be left in LogSegment's uncommitted_masters after recovery is finished. It prevents LogSegment from being trimmed. The fix is find and clean up request of this kind when recovery enters rejoin stage. Signed-off-by: Yan, Zheng Signed-off-by: Sage Weil --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 9ac7a62facbf9..da3affbe1a1d9 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2163,6 +2163,24 @@ void MDCache::committed_master_slave(metareqid_t r, int from) } +/* + * The mds could crash after receiving all slaves' commit acknowledgement, + * but before journalling the ECommitted. + */ +void MDCache::finish_committed_masters() +{ + map::iterator p = uncommitted_masters.begin(); + while (p != uncommitted_masters.end()) { + if (p->second.slaves.empty()) { + metareqid_t reqid = p->first; + dout(10) << "finish_committed_masters " << reqid << dendl; + ++p; + log_master_commit(reqid); + } else { + ++p; + } + } +} /* * at end of resolve... we must journal a commit|abort for all slave diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 9c7b096fe5210..12bdb0300a806 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -291,6 +291,7 @@ public: void log_master_commit(metareqid_t reqid); void _logged_master_commit(metareqid_t reqid, LogSegment *ls, list &waiters); void committed_master_slave(metareqid_t r, int from); + void finish_committed_masters(); void _logged_slave_commit(int from, metareqid_t reqid); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index ce306c466db7b..d0aac301d8703 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -1413,6 +1413,7 @@ void MDS::reconnect_done() void MDS::rejoin_joint_start() { dout(1) << "rejoin_joint_start" << dendl; + mdcache->finish_committed_masters(); mdcache->rejoin_send_rejoins(); } void MDS::rejoin_done()