From: Yingxin Cheng Date: Thu, 29 Apr 2021 02:17:53 +0000 (+0800) Subject: crimson/onode-staged-tree: make sure oids in tree are always valid X-Git-Tag: v17.1.0~2016^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=16a464f77cba3b7cdd0df392ebb446808e417e16;p=ceph.git crimson/onode-staged-tree: make sure oids in tree are always valid Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h index 83afad7e6177..f8a9cc6b8eff 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h @@ -480,6 +480,10 @@ inline const ghobject_t _MAX_OID() { "MAX", "MAX", MAX_SNAP, MAX_GEN); } +// the valid key stored in tree should be in the range of (_MIN_OID, _MAX_OID) +template +bool is_valid_key(const full_key_t& key); + /** * key_hobj_t * @@ -549,6 +553,10 @@ class key_hobj_t { return os; } + bool is_valid() const { + return is_valid_key(*this); + } + static key_hobj_t decode(ceph::bufferlist::const_iterator& delta) { shard_t shard; ceph::decode(shard, delta); @@ -675,6 +683,7 @@ class key_view_t { } ghobject_t to_ghobj() const { + assert(is_valid_key(*this)); return ghobject_t( shard_id_t(shard()), pool(), crush(), std::string(nspace()), std::string(oid()), snap(), gen()); @@ -801,6 +810,12 @@ inline MatchKindCMP key_view_t::compare_to( return compare_full_key(*this, o); } +template +bool is_valid_key(const full_key_t& key) { + return key.compare_to(key_hobj_t(ghobject_t())) == MatchKindCMP::GT && + key.compare_to(key_hobj_t(ghobject_t::get_max())) == MatchKindCMP::LT; +} + inline std::ostream& operator<<(std::ostream& os, const key_view_t& key) { return key.dump(os); } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h index 62db82fc7fed..567df2d5ba6e 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h @@ -243,6 +243,7 @@ class Btree { return seastar::do_with( full_key_t(obj), [this, &t, vconf](auto& key) -> btree_future> { + ceph_assert(key.is_valid()); return get_root(t).safe_then([this, &t, &key, vconf](auto root) { return root->insert(get_context(t), key, vconf); }).safe_then([this](auto ret) { diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h index 016244ac3835..83445f55be26 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h @@ -246,6 +246,7 @@ class KVPool { auto ret = ghobject_t( hobject_t( sobject_t(ss.str(), CEPH_NOSNAP))); + ret.set_shard(shard_id_t(0)); ret.hobj.nspace = "asdf"; return ret; } diff --git a/src/test/crimson/seastore/test_seastore.cc b/src/test/crimson/seastore/test_seastore.cc index 1100306209e0..efc4d81561f7 100644 --- a/src/test/crimson/seastore/test_seastore.cc +++ b/src/test/crimson/seastore/test_seastore.cc @@ -275,6 +275,7 @@ ghobject_t make_oid(int i) { auto ret = ghobject_t( hobject_t( sobject_t(ss.str(), CEPH_NOSNAP))); + ret.set_shard(shard_id_t(0)); ret.hobj.nspace = "asdf"; return ret; }