From a6f85089c0d0213481c8038f57820d3d31cf9ebd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 30 May 2019 12:17:50 -0500 Subject: [PATCH] osd/PrimaryLogPG: find_object_context: trust SnapSet's clone_snaps Instead of checking the OSDMap pg_pool_t whether a snap exists, instead 1- Look at the clone_snaps more carefully. If the snap didn't exist when the clone was last touched (created or partially-trimmed) then it still doesn't exist now (snaps aren't resurrected). 2- Check in the OSDMap's removed snaps queue. This will catch anything that is still being removed but hasn't been reflected by the clone_snaps yet. Signed-off-by: Sage Weil --- src/osd/PrimaryLogPG.cc | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 7bed099784a..102a1186f87 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -10953,14 +10953,9 @@ int PrimaryLogPG::find_object_context(const hobject_t& oid, return 0; } - hobject_t head = oid.get_head(); - // we want a snap - if (!map_snapid_to_clone && pool.info.is_removed_snap(oid.snap)) { - dout(10) << __func__ << " snap " << oid.snap << " is removed" << dendl; - return -ENOENT; - } + hobject_t head = oid.get_head(); SnapSetContext *ssc = get_snapset_context(oid, can_create); if (!ssc || !(ssc->exists || can_create)) { dout(20) << __func__ << " " << oid << " no snapset" << dendl; @@ -11111,18 +11106,21 @@ int PrimaryLogPG::find_object_context(const hobject_t& oid, ceph_assert(!cct->_conf->osd_debug_verify_snaps); return -ENOENT; } - first = p->second.back(); - last = p->second.front(); - if (first <= oid.snap) { - dout(20) << __func__ << " " << soid << " [" << first << "," << last - << "] contains " << oid.snap << " -- HIT " << obc->obs << dendl; - *pobc = obc; - return 0; - } else { - dout(20) << __func__ << " " << soid << " [" << first << "," << last - << "] does not contain " << oid.snap << " -- DNE" << dendl; + if (std::find(p->second.begin(), p->second.end(), oid.snap) == + p->second.end()) { + dout(20) << __func__ << " " << soid << " clone_snaps " << p->second + << " does not contain " << oid.snap << " -- DNE" << dendl; return -ENOENT; } + if (get_osdmap()->in_removed_snaps_queue(info.pgid.pgid.pool(), oid.snap)) { + dout(20) << __func__ << " " << soid << " snap " << oid.snap + << " in removed_snaps_queue" << " -- DNE" << dendl; + return -ENOENT; + } + dout(20) << __func__ << " " << soid << " clone_snaps " << p->second + << " contains " << oid.snap << " -- HIT " << obc->obs << dendl; + *pobc = obc; + return 0; } void PrimaryLogPG::object_context_destructor_callback(ObjectContext *obc) -- 2.39.5