From 75827db6a3d0d27bd5e8fd98c4243e904811b5ac Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 26 May 2021 16:57:12 -0700 Subject: [PATCH] crimson/os/seastore/seastore: add helpers to simplify omap usage Add _omap_get_values and _omap_get_value to clarify omap_get_values and get_attr. Also resolves a clang linker error. Signed-off-by: Samuel Just --- src/crimson/os/seastore/seastore.cc | 127 ++++++++++++++++------------ src/crimson/os/seastore/seastore.h | 16 ++++ 2 files changed, 87 insertions(+), 56 deletions(-) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index f99b763b59f..91cf5fdc9c1 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -259,23 +259,10 @@ SeaStore::get_attr_errorator::future SeaStore::get_attr( bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size)); return seastar::make_ready_future(std::move(bl)); } - return seastar::do_with( - BtreeOMapManager(*transaction_manager), + return _omap_get_value( + t, layout.xattr_root.get(), - std::string(name), - [&t](auto &manager, auto& root, auto& name) { - if (root.is_null()) { - return get_attr_ertr::make_ready_future( - ceph::bufferlist()); - } - return manager.omap_get_value(root, t, name).safe_then([](auto opt) - -> get_attr_ertr::future { - if (!opt) { - return crimson::ct_error::enodata::make(); - } - return seastar::make_ready_future(std::move(*opt)); - }); - }); + name); }).handle_error(crimson::ct_error::input_output_error::handle([FNAME] { ERROR("EIO when getting attrs"); abort(); @@ -338,10 +325,6 @@ seastar::future SeaStore::stat( ); } -using omap_int_ertr_t = OMapManager::base_ertr::extend< - crimson::ct_error::enoent - >; - auto SeaStore::omap_get_header( CollectionRef c, @@ -351,52 +334,84 @@ SeaStore::omap_get_header( return seastar::make_ready_future(); } -auto +SeaStore::read_errorator::future SeaStore::omap_get_values( CollectionRef ch, const ghobject_t &oid, const omap_keys_t &keys) - -> read_errorator::future { - using int_ret_t = omap_int_ertr_t::future; auto c = static_cast(ch.get()); return repeat_with_onode( c, oid, - [this, &keys](auto &t, auto &onode) -> int_ret_t { - auto omap_root = onode.get_layout().omap_root.get(); - if (omap_root.is_null()) { - return seastar::make_ready_future(); - } else { - return seastar::do_with( - BtreeOMapManager(*transaction_manager), - omap_root, - omap_values_t(), - [&](auto &manager, auto &root, auto &ret) -> int_ret_t { - return crimson::do_for_each( - keys.begin(), - keys.end(), - [&](auto &key) { - return manager.omap_get_value( - root, - t, - key - ).safe_then([&ret, &key](auto &&p) { - if (p) { - bufferlist bl; - bl.append(*p); - ret.emplace( - std::make_pair( - std::move(key), - std::move(bl))); - } - return seastar::now(); - }); - }).safe_then([&ret] { - return std::move(ret); - }); - }); + [this, &keys](auto &t, auto &onode) { + omap_root_t omap_root = onode.get_layout().omap_root.get(); + return _omap_get_values( + t, + std::move(omap_root), + keys); + }); +} + +SeaStore::_omap_get_value_ret SeaStore::_omap_get_value( + Transaction &t, + omap_root_t &&root, + std::string_view key) const +{ + return seastar::do_with( + BtreeOMapManager(*transaction_manager), + std::move(root), + std::string(key), + [&t](auto &manager, auto& root, auto& key) -> _omap_get_value_ret { + if (root.is_null()) { + return crimson::ct_error::enodata::make(); } + return manager.omap_get_value( + root, t, key + ).safe_then([](auto opt) -> _omap_get_value_ret { + if (!opt) { + return crimson::ct_error::enodata::make(); + } + return seastar::make_ready_future(std::move(*opt)); + }); + }); +} + +SeaStore::_omap_get_values_ret SeaStore::_omap_get_values( + Transaction &t, + omap_root_t &&omap_root, + const omap_keys_t &keys) const +{ + if (omap_root.is_null()) { + return seastar::make_ready_future(); + } + return seastar::do_with( + BtreeOMapManager(*transaction_manager), + std::move(omap_root), + omap_values_t(), + [&](auto &manager, auto &root, auto &ret) { + return crimson::do_for_each( + keys.begin(), + keys.end(), + [&](auto &key) { + return manager.omap_get_value( + root, + t, + key + ).safe_then([&ret, &key](auto &&p) { + if (p) { + bufferlist bl; + bl.append(*p); + ret.emplace( + std::make_pair( + std::move(key), + std::move(bl))); + } + return seastar::now(); + }); + }).safe_then([&ret] { + return std::move(ret); + }); }); } diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index fde3c8a26f0..48a1b81599a 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -195,6 +195,22 @@ private: }); } + using _omap_get_value_ertr = OMapManager::base_ertr::extend< + crimson::ct_error::enodata + >; + using _omap_get_value_ret = _omap_get_value_ertr::future; + _omap_get_value_ret _omap_get_value( + Transaction &t, + omap_root_t &&root, + std::string_view key) const; + + using _omap_get_values_ertr = OMapManager::base_ertr; + using _omap_get_values_ret = _omap_get_values_ertr::future; + _omap_get_values_ret _omap_get_values( + Transaction &t, + omap_root_t &&root, + const omap_keys_t &keys) const; + using _omap_list_bare_ret = OMapManager::omap_list_bare_ret; using _omap_list_ret = OMapManager::omap_list_ret; _omap_list_ret _omap_list( -- 2.47.3