]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: construct appropriate snapc for flush/writeback
authorSage Weil <sage@inktank.com>
Fri, 27 Dec 2013 23:41:47 +0000 (15:41 -0800)
committerSage Weil <sage@inktank.com>
Tue, 14 Jan 2014 00:19:43 +0000 (16:19 -0800)
Construct a snap context that will trigger the appropriate cloning (if any)
on the base pool.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc

index c8b0eb54746c2f091d7e48f7c9f7e01dcc9030d2..780bfd6f844a1750412c19f5398f41051675f269 100644 (file)
@@ -5331,7 +5331,22 @@ int ReplicatedPG::start_flush(OpContext *ctx, bool blocking)
   C_Flush *fin = new C_Flush(this, soid, get_last_peering_reset());
   object_locator_t base_oloc(soid);
   base_oloc.pool = pool.info.tier_of;
-  SnapContext snapc;  // FIXME
+
+  // construct a SnapContext appropriate for this clone/head
+  SnapContext snapc;
+  if (soid.snap == CEPH_NOSNAP) {
+    snapc.seq = snapset.seq;
+    snapc.snaps = snapset.snaps;
+  } else {
+    // we want to only include snaps that are older than the oldest
+    // snap for which we are defined, so that the object appears to
+    // have been written before that.
+    vector<snapid_t>::iterator p = snapset.snaps.begin();
+    while (p != snapset.snaps.end() && *p >= oi.snaps.back())
+      p++;
+    snapc.snaps = vector<snapid_t>(p, snapset.snaps.end());
+    snapc.seq = oi.snaps.back() - 1;
+  }
 
   osd->objecter_lock.Lock();
   tid_t tid = osd->objecter->mutate(soid.oid, base_oloc, o, snapc, oi.mtime,