]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix dropping events in standby replay 12077/head
authorJohn Spray <john.spray@redhat.com>
Fri, 18 Nov 2016 21:11:54 +0000 (21:11 +0000)
committerJohn Spray <john.spray@redhat.com>
Wed, 23 Nov 2016 18:36:09 +0000 (18:36 +0000)
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>
src/mds/MDLog.cc

index 351fad0de75ffc17ac2b9f7274eb329500603b25..f337d6a79e205f4e37d3259ad917cd89c51153e7 100644 (file)
@@ -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