From: Xuehan Xu Date: Tue, 18 Feb 2025 04:05:47 +0000 (+0800) Subject: crimson/os/seastore/omap_manager: do binary search on omap nodes X-Git-Tag: v20.0.0~5^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F61866%2Fhead;p=ceph.git crimson/os/seastore/omap_manager: do binary search on omap nodes Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc b/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc index df97f394a0d1..9db3d09440a9 100644 --- a/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc +++ b/src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc @@ -495,8 +495,11 @@ OMapInnerNode::merge_entry( OMapInnerNode::internal_iterator_t OMapInnerNode::get_containing_child(const std::string &key) { - auto iter = std::find_if(iter_begin(), iter_end(), - [&key](auto it) { return it.contains(key); }); + auto iter = string_lower_bound(key); + if (iter == iter_end() || (iter != iter_begin() && iter.get_key() > key)) { + iter--; + } + assert(iter.contains(key)); return iter; } diff --git a/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h b/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h index 3825ebef1455..93a9b8dedb15 100644 --- a/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h +++ b/src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h @@ -597,13 +597,11 @@ public: } const_iterator find_string_key(std::string_view str) const { - auto ret = iter_begin(); - for (; ret != iter_end(); ++ret) { - std::string s = ret->get_key(); - if (s == str) - break; + auto iter = string_lower_bound(str); + if (iter.get_key() == str) { + return iter; } - return ret; + return iter_cend(); } iterator find_string_key(std::string_view str) {