]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/seastore: add helpers to simplify omap usage 41560/head
authorSamuel Just <sjust@redhat.com>
Wed, 26 May 2021 23:57:12 +0000 (16:57 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 26 May 2021 23:57:50 +0000 (16:57 -0700)
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 <sjust@redhat.com>
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h

index f99b763b59f475195fc217c1c44d788584dd4214..91cf5fdc9c13bddb1c0a557c9af00e9474c9d0e0 100644 (file)
@@ -259,23 +259,10 @@ SeaStore::get_attr_errorator::future<ceph::bufferlist> SeaStore::get_attr(
       bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
       return seastar::make_ready_future<ceph::bufferlist>(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>(
-         ceph::bufferlist());
-      }
-      return manager.omap_get_value(root, t, name).safe_then([](auto opt)
-       -> get_attr_ertr::future<ceph::bufferlist> {
-       if (!opt) {
-         return crimson::ct_error::enodata::make();
-       }
-       return seastar::make_ready_future<ceph::bufferlist>(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<struct stat> 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<bufferlist>();
 }
 
-auto
+SeaStore::read_errorator::future<SeaStore::omap_values_t>
 SeaStore::omap_get_values(
   CollectionRef ch,
   const ghobject_t &oid,
   const omap_keys_t &keys)
-  -> read_errorator::future<omap_values_t>
 {
-  using int_ret_t = omap_int_ertr_t::future<omap_values_t>;
   auto c = static_cast<SeastoreCollection*>(ch.get());
   return repeat_with_onode<omap_values_t>(
     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<omap_values_t>();
-      } 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<ceph::bufferlist>(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<omap_values_t>();
+  }
+  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);
+       });
     });
 }
 
index fde3c8a26f0caab668d9440cf8e7de3efa660680..48a1b81599aaae1a573b28cd41c160ab264ef934 100644 (file)
@@ -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<ceph::bufferlist>;
+  _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_values_t>;
+  _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(