]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::start_flush: fix clone deletion case
authorSamuel Just <sam.just@inktank.com>
Fri, 16 May 2014 23:56:33 +0000 (16:56 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 30 May 2014 20:32:10 +0000 (13:32 -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>
(cherry picked from commit 29f615b7ac9e92f77cdef9927070727fee9d5e33)

src/osd/ReplicatedPG.cc

index 6a471c95b040a6bec24e69969431c8b3b2dcbb76..68922082da7373c4d3226dd9503ae6a1a1ecc207 100644 (file)
@@ -6198,14 +6198,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;
     }