]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix dropping events in standby replay 13126/head
authorJohn Spray <john.spray@redhat.com>
Fri, 18 Nov 2016 21:11:54 +0000 (21:11 +0000)
committerNathan Cutler <ncutler@suse.com>
Thu, 26 Jan 2017 09:09:16 +0000 (10:09 +0100)
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 <john.spray@redhat.com>
(cherry picked from commit e3f2fa356f419cbac8d72bd068313f64769ef3af)

src/mds/MDLog.cc

index 260e8747056405fcd8af0182fd95dd8fb8332e87..8d0cbb160c64c80348a4b6c8d97df3743bca4c2f 100644 (file)
@@ -1416,9 +1416,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;
@@ -1427,8 +1438,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