From: Radoslaw Zarzynski Date: Thu, 17 Nov 2022 21:29:20 +0000 (+0000) Subject: common, osd: switch SnapMapper::_lookup_purged_snap to use OSDriver X-Git-Tag: v18.1.0~260^2~39 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6f7ed374967706fe9bfe7e2bd385c78f77694739;p=ceph.git common, osd: switch SnapMapper::_lookup_purged_snap to use OSDriver Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/common/map_cacher.hpp b/src/common/map_cacher.hpp index 4698eb78bba85..a83f924b622c0 100644 --- a/src/common/map_cacher.hpp +++ b/src/common/map_cacher.hpp @@ -60,6 +60,11 @@ public: std::pair *next ///< [out] first key after key ) = 0; ///< @return 0 on success, -ENOENT if there is no next + virtual int get_next_or_current( + const K &key, ///< [in] key at-which-or-after to get + std::pair *next_or_current + ) = 0; ///< @return 0 on success, -ENOENT if there is no next + virtual ~StoreDriver() {} }; diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 8665eaa4429ef..87a84da8e151d 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -87,7 +87,7 @@ int OSDriver::get_keys( int OSDriver::get_next( const std::string &key, - pair *next) + std::pair *next) { ObjectMap::ObjectMapIterator iter = os->get_omap_iterator(ch, hoid); @@ -105,6 +105,26 @@ int OSDriver::get_next( } } +int OSDriver::get_next_or_current( + const std::string &key, + std::pair *next_or_current) +{ + ObjectMap::ObjectMapIterator iter = + os->get_omap_iterator(ch, hoid); + if (!iter) { + ceph_abort(); + return -EINVAL; + } + iter->lower_bound(key); + if (iter->valid()) { + if (next_or_current) + *next_or_current = make_pair(iter->key(), iter->value()); + return 0; + } else { + return -ENOENT; + } +} + string SnapMapper::get_prefix(int64_t pool, snapid_t snap) { static_assert(sizeof(pool) == 8, "assumed by the formatting code"); @@ -571,21 +591,21 @@ int SnapMapper::_lookup_purged_snap( int64_t pool, snapid_t snap, snapid_t *begin, snapid_t *end) { + OSDriver backend(store, ch, hoid); string k = make_purged_snap_key(pool, snap); - auto it = store->get_omap_iterator(ch, hoid); - it->lower_bound(k); - if (!it->valid()) { + std::pair kv; + if (auto ret = backend.get_next_or_current(k, &kv); ret == -ENOENT) { dout(20) << __func__ << " pool " << pool << " snap " << snap << " key '" << k << "' lower_bound not found" << dendl; return -ENOENT; } - if (it->key().find(PURGED_SNAP_PREFIX) != 0) { + if (kv.first.find(PURGED_SNAP_PREFIX) != 0) { dout(20) << __func__ << " pool " << pool << " snap " << snap << " key '" << k << "' lower_bound got mismatched prefix '" - << it->key() << "'" << dendl; + << kv.first << "'" << dendl; return -ENOENT; } - ceph::buffer::list v = it->value(); + ceph::buffer::list v = kv.second; auto p = v.cbegin(); int64_t gotpool; decode(gotpool, p); diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index 62bdd083cc015..2b3227ba802aa 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -66,16 +66,21 @@ public: } OSDriver(ObjectStore *os, const coll_t& cid, const ghobject_t &hoid) : + OSDriver(os, os->open_collection(cid), hoid) {} + OSDriver(ObjectStore *os, ObjectStore::CollectionHandle ch, const ghobject_t &hoid) : os(os), - hoid(hoid) { - ch = os->open_collection(cid); - } + ch(ch), + hoid(hoid) {} + int get_keys( const std::set &keys, std::map *out) override; int get_next( const std::string &key, std::pair *next) override; + int get_next_or_current( + const std::string &key, + std::pair *next_or_current) override; }; /** diff --git a/src/test/test_snap_mapper.cc b/src/test/test_snap_mapper.cc index 3da2ffd42266b..e502892cc42f1 100644 --- a/src/test/test_snap_mapper.cc +++ b/src/test/test_snap_mapper.cc @@ -193,6 +193,19 @@ public: return -ENOENT; } } + int get_next_or_current( + const string &key, + pair *next_or_current) override { + std::lock_guard l{lock}; + map::iterator j = store.lower_bound(key); + if (j != store.end()) { + if (next_or_current) + *next_or_current = *j; + return 0; + } else { + return -ENOENT; + } + } void submit(Transaction *t) { doer.submit(t->ops); doer.submit(t->callbacks);