]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::start_flush: fix clone deletion case 1832/head 1834/head
authorSamuel Just <sam.just@inktank.com>
Fri, 16 May 2014 23:56:33 +0000 (16:56 -0700)
committerSamuel Just <sam.just@inktank.com>
Mon, 19 May 2014 21:27:02 +0000 (14:27 -0700)
dsnapc.snaps will be non-empty most of the time if there
have been snaps before prev_snapc.  What we really want to
know is whether there are any snaps between oi.snaps.back()
and prev_snapc.

Fixes: 8334
Backport: firefly
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc

index 4c69111fa9223dd7426fdcc3248d947f51682cae..3b89b4ff0a3533d79368f7926319fc5b672981ae 100644 (file)
@@ -6203,14 +6203,20 @@ int ReplicatedPG::start_flush(
       ++p;
     snapc.snaps = vector<snapid_t>(p, snapset.snaps.end());
 
+    while (p != snapset.snaps.end() && *p >= oi.snaps.back())
+      ++p;
+    vector<snapid_t>::iterator dnewest = p;
+
     // we may need to send a delete first
     while (p != snapset.snaps.end() && *p > prev_snapc)
       ++p;
     dsnapc.snaps = vector<snapid_t>(p, snapset.snaps.end());
 
-    if (dsnapc.snaps.empty()) {
+    if (p == dnewest) {
+      // no snaps between the oldest in this clone and prev_snapc
       snapc.seq = prev_snapc;
     } else {
+      // snaps between oldest in this clone and prev_snapc, send delete
       dsnapc.seq = prev_snapc;
       snapc.seq = oi.snaps.back() - 1;
     }