From: Radoslaw Zarzynski Date: Wed, 27 Nov 2024 00:29:17 +0000 (+0000) Subject: osd: switch SnapMapper to omap_iterate X-Git-Tag: v20.3.0~156^2~11 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=374291673315feda34d398f7cec9e832fc8d4fee;p=ceph.git osd: switch SnapMapper to omap_iterate Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 265b2a0c7f5a7..ceb6dc34e69cd 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -925,44 +925,39 @@ void SnapMapper::record_purged_snaps( #ifndef WITH_CRIMSON -bool SnapMapper::Scrubber::_parse_p(ObjectMap::ObjectMapIterator& psit) +bool SnapMapper::Scrubber::_parse_p(std::string_view key, std::string_view value) { - if (!psit->valid()) { + if (key.find(PURGED_SNAP_PREFIX) != 0) { pool = -1; return false; } - if (psit->key().find(PURGED_SNAP_PREFIX) != 0) { - pool = -1; - return false; - } - ceph::buffer::list v = psit->value(); + ceph::buffer::list v; + v.append(value); auto p = v.cbegin(); ceph::decode(pool, p); ceph::decode(begin, p); ceph::decode(end, p); dout(20) << __func__ << " purged_snaps pool " << pool << " [" << begin << "," << end << ")" << dendl; - psit->next(); return true; } -bool SnapMapper::Scrubber::_parse_m(ObjectMap::ObjectMapIterator& mapit) +bool SnapMapper::Scrubber::_parse_m( + std::string_view key, + std::string_view value) { - if (!mapit->valid()) { + if (key.find(MAPPING_PREFIX) != 0) { return false; } - if (mapit->key().find(MAPPING_PREFIX) != 0) { - return false; - } - auto v = mapit->value(); + ceph::bufferlist v; + v.append(value); // create_static if decoding if anyhow visible a flamegraph auto p = v.cbegin(); mapping.decode(p); { unsigned long long p, s; long sh; - string k = mapit->key(); - int r = sscanf(k.c_str(), "SNA_%lld_%llx.%lx", &p, &s, &sh); + int r = sscanf(key.data(), "SNA_%lld_%llx.%lx", &p, &s, &sh); if (r != 1) { shard = shard_id_t::NO_SHARD; } else { @@ -973,7 +968,6 @@ bool SnapMapper::Scrubber::_parse_m(ObjectMap::ObjectMapIterator& mapit) << " snap " << mapping.snap << " shard " << shard << " " << mapping.hoid << dendl; - mapit->next(); return true; } @@ -981,54 +975,69 @@ void SnapMapper::Scrubber::run() { dout(10) << __func__ << dendl; - ObjectMap::ObjectMapIterator psit; - ObjectMap::ObjectMapIterator mapit; - - psit = store->get_omap_iterator(ch, purged_snaps_hoid); - psit->upper_bound(PURGED_SNAP_PREFIX); - _parse_p(psit); - - mapit = store->get_omap_iterator(ch, mapping_hoid); - mapit->upper_bound(MAPPING_PREFIX); - - while (_parse_m(mapit)) { - // advance to next purged_snaps range? - while (pool >= 0 && - (mapping.hoid.pool > pool || - (mapping.hoid.pool == pool && mapping.snap >= end))) { - _parse_p(psit); - } - if (pool < 0) { - dout(10) << __func__ << " passed final purged_snaps interval, rest ok" - << dendl; - break; - } - if (mapping.hoid.pool < pool || - mapping.snap < begin) { - // ok - dout(20) << __func__ << " ok " << mapping.hoid - << " snap " << mapping.snap - << " precedes pool " << pool - << " purged_snaps [" << begin << "," << end << ")" << dendl; - } else { - assert(mapping.snap >= begin && - mapping.snap < end && - mapping.hoid.pool == pool); - // invalid - dout(10) << __func__ << " stray " << mapping.hoid - << " snap " << mapping.snap - << " in pool " << pool - << " shard " << shard - << " purged_snaps [" << begin << "," << end << ")" << dendl; - stray.emplace_back(std::tuple( - pool, mapping.snap, mapping.hoid.get_hash(), - shard - )); - } - } - + store->omap_iterate( + ch, mapping_hoid, + ObjectStore::omap_iter_seek_t{ + .seek_position = MAPPING_PREFIX, + .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND + }, + [this] (std::string_view key, std::string_view value) mutable { + if (!_parse_m(key, value)) { + return ObjectStore::omap_iter_ret_t::STOP; + } + // advance to next purged_snaps range? + const auto ret = store->omap_iterate( + ch, purged_snaps_hoid, + ObjectStore::omap_iter_seek_t{ + .seek_position = PURGED_SNAP_PREFIX, + .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND + }, + [this] (std::string_view key, std::string_view value) mutable { + _parse_p(key, value); + if (pool >= 0 && + (mapping.hoid.pool > pool || + (mapping.hoid.pool == pool && mapping.snap >= end))) { + return ObjectStore::omap_iter_ret_t::NEXT; + } else { + return ObjectStore::omap_iter_ret_t::STOP; + } + }); + if (ret < 0) { + // beware _parse_p() also modifies pool + pool = -1; + derr << "omap_iterate() on purged_snaps_hoid returns " << ret << dendl; + } else if (const auto more = static_cast(ret); !more) { + pool = -1; + } + if (pool < 0) { + dout(10) << __func__ << " passed final purged_snaps interval, rest ok" + << dendl; + return ObjectStore::omap_iter_ret_t::STOP; + } + if (mapping.hoid.pool < pool || + mapping.snap < begin) { + // ok + dout(20) << __func__ << " ok " << mapping.hoid + << " snap " << mapping.snap + << " precedes pool " << pool + << " purged_snaps [" << begin << "," << end << ")" << dendl; + } else { + assert(mapping.snap >= begin); + assert(mapping.snap < end); + assert(mapping.hoid.pool == pool); + // invalid + dout(10) << __func__ << " stray " << mapping.hoid + << " snap " << mapping.snap + << " in pool " << pool + << " shard " << shard + << " purged_snaps [" << begin << "," << end << ")" << dendl; + stray.emplace_back(std::tuple( + pool, mapping.snap, mapping.hoid.get_hash(), + shard + )); + } + return ObjectStore::omap_iter_ret_t::NEXT; + }); dout(10) << __func__ << " end, found " << stray.size() << " stray" << dendl; - psit = ObjectMap::ObjectMapIterator(); - mapit = ObjectMap::ObjectMapIterator(); } #endif // !WITH_CRIMSON diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index 9f40226c7ff31..377b2185b9db6 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -186,12 +186,12 @@ public: int64_t pool; snapid_t begin, end; - bool _parse_p(ObjectMap::ObjectMapIterator& psit); ///< advance the purged_snaps pointer + bool _parse_p(std::string_view key, std::string_view value); Mapping mapping; shard_id_t shard; - bool _parse_m(ObjectMap::ObjectMapIterator& mapit); ///< advance the (object) mapper pointer + bool _parse_m(std::string_view key, std::string_view value); std::vector> stray;