From: Samuel Just Date: Wed, 1 Apr 2015 23:25:22 +0000 (-0700) Subject: ReplicatedPG::finish_promote: fix snap promote head snaps X-Git-Tag: v9.0.2~88^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a45a698372def1623323470c6a1c4eb70e0bb79f;p=ceph.git ReplicatedPG::finish_promote: fix snap promote head snaps If the snaps vector is: 10=[9,5,2]:[4]+head, the backing pool's snaps vector is 3=[2]:[]+head, and we request clone 4 from the backing pool, the backing pool will send us head with an empty results->snaps vector. Actually, clone 4 should be trimmed, but the cache pool does not know that. Thus, we should construct an empty snaps vector for that clone. PartialFix: #11296 Backport: firefly, hammer Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index cfd4ba356873..c8595d8f0d1a 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -6628,11 +6628,10 @@ void ReplicatedPG::finish_promote(int r, CopyResults *results, vector::iterator p = snapset.snaps.begin(); while (p != snapset.snaps.end() && *p > soid.snap) ++p; - assert(p != snapset.snaps.end()); - do { + while (p != snapset.snaps.end() && *p > results->snap_seq) { tctx->new_obs.oi.snaps.push_back(*p); ++p; - } while (p != snapset.snaps.end() && *p > results->snap_seq); + } } dout(20) << __func__ << " snaps " << tctx->new_obs.oi.snaps << dendl; assert(!tctx->new_obs.oi.snaps.empty());