From 941cfc26a05654f37889a88c68acd520d830461e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 26 Mar 2013 08:53:00 -0700 Subject: [PATCH] osd: fix clone snap list for list-snaps We need to return the list of snaps that each clone is defined for, not the list of snaps we know may or may not exist globally over a similar interval. This requires looking at the clone's obc, unfortunately. Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index dbd0a5f9e9815..c845118d28955 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2323,25 +2323,25 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } assert(ssc); - vector::reverse_iterator snap_iter = - ssc->snapset.snaps.rbegin(); - int clonecount = ssc->snapset.clones.size(); if (ssc->snapset.head_exists) clonecount++; resp.clones.reserve(clonecount); for (vector::const_iterator clone_iter = ssc->snapset.clones.begin(); clone_iter != ssc->snapset.clones.end(); ++clone_iter) { - dout(20) << "List clones id=" << *clone_iter << dendl; clone_info ci; ci.cloneid = *clone_iter; - for ( ; snap_iter != ssc->snapset.snaps.rend() && - (*snap_iter <= ci.cloneid); ++snap_iter) { - dout(20) << "List snaps id=" << *snap_iter << dendl; - assert(*snap_iter != CEPH_NOSNAP); - assert(*snap_iter != CEPH_SNAPDIR); - ci.snaps.push_back(*snap_iter); - } + + hobject_t clone_oid = soid; + clone_oid.snap = *clone_iter; + ObjectContext *clone_obc = ctx->src_obc[clone_oid]; + for (vector::reverse_iterator p = clone_obc->obs.oi.snaps.rbegin(); + p != clone_obc->obs.oi.snaps.rend(); + ++p) { + ci.snaps.push_back(*p); + } + + dout(20) << " clone " << *clone_iter << " snaps " << ci.snaps << dendl; map >::const_iterator coi; coi = ssc->snapset.clone_overlap.find(ci.cloneid); -- 2.39.5