From: John Spray Date: Fri, 18 Nov 2016 21:11:54 +0000 (+0000) Subject: mds: fix dropping events in standby replay X-Git-Tag: v11.1.0~37^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e3f2fa356f419cbac8d72bd068313f64769ef3af;p=ceph.git mds: fix dropping events in standby replay Ensure that we never drop the last segment during standby replay -- this avoids the case where we start ignoring events because we think we're still waiting to see a subtreemap. Fixes: http://tracker.ceph.com/issues/17954 Signed-off-by: John Spray --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 351fad0de75ff..f337d6a79e205 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -1435,9 +1435,20 @@ void MDLog::standby_trim_segments() bool removed_segment = false; while (have_any_segments()) { LogSegment *seg = get_oldest_segment(); - if (seg->end > expire_pos) + dout(10) << " segment seq=" << seg->seq << " " << seg->offset << + "~" << seg->end - seg->offset << dendl; + + if (seg->end > expire_pos) { + dout(10) << " won't remove, not expired!" << dendl; + break; + } + + if (segments.size() == 1) { + dout(10) << " won't remove, last segment!" << dendl; break; - dout(10) << " removing segment " << seg->seq << "/" << seg->offset << dendl; + } + + dout(10) << " removing segment" << dendl; mds->mdcache->standby_trim_segment(seg); remove_oldest_segment(); removed_segment = true; @@ -1446,8 +1457,9 @@ void MDLog::standby_trim_segments() if (removed_segment) { dout(20) << " calling mdcache->trim!" << dendl; mds->mdcache->trim(-1); - } else + } else { dout(20) << " removed no segments!" << dendl; + } } void MDLog::dump_replay_status(Formatter *f) const