]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: errorator omap_get_values() ops
authorKefu Chai <kchai@redhat.com>
Tue, 18 Aug 2020 16:57:58 +0000 (00:57 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 19 Aug 2020 07:00:17 +0000 (15:00 +0800)
* os/alienstore: do not panic if retval is less than 0. instead,
  translate ENOENT to enoent and other erros to input_output_error
* os/FuturizedStore: errorator omap_get_values() variants, so
  they return errorator::future<> instead of plain seastar::future<>
* os/seastore: update accordingly.
* osd/pg_backend: use enodata for OI without omap in it. better
  performance, and better readability this way.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/os/alienstore/alien_store.cc
src/crimson/os/alienstore/alien_store.h
src/crimson/os/cyanstore/cyan_store.cc
src/crimson/os/cyanstore/cyan_store.h
src/crimson/os/futurized_store.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h
src/crimson/osd/pg_meta.cc

index 7ce7af21f9794c4db92e61461d7f324e015cf21f..f89acf613fb632263b4733f5b2b45160be2285fb 100644 (file)
@@ -297,7 +297,7 @@ AlienStore::get_attrs(CollectionRef ch,
                             reinterpret_cast<map<string,bufferptr>&>(aset));
     }).then([&aset] (int r) -> get_attrs_ertr::future<attrs_t> {
       if (r == -ENOENT) {
-        return crimson::ct_error::enoent::make();;
+        return crimson::ct_error::enoent::make();
       } else {
         return get_attrs_ertr::make_ready_future<attrs_t>(std::move(aset));
       }
@@ -305,10 +305,10 @@ AlienStore::get_attrs(CollectionRef ch,
   });
 }
 
-seastar::future<AlienStore::omap_values_t>
-AlienStore::omap_get_values(CollectionRef ch,
-                       const ghobject_t& oid,
-                       const set<string>& keys)
+auto AlienStore::omap_get_values(CollectionRef ch,
+                                 const ghobject_t& oid,
+                                 const set<string>& keys)
+  -> read_errorator::future<omap_values_t>
 {
   logger().debug("{}", __func__);
   return seastar::do_with(omap_values_t{}, [=] (auto &values) {
@@ -316,17 +316,23 @@ AlienStore::omap_get_values(CollectionRef ch,
       auto c = static_cast<AlienCollection*>(ch.get());
       return store->omap_get_values(c->collection, oid, keys,
                                    reinterpret_cast<map<string, bufferlist>*>(&values));
-    }).then([&values] (int r) {
-      assert(r == 0);
-      return seastar::make_ready_future<omap_values_t>(std::move(values));
+    }).then([&values] (int r) -> read_errorator::future<omap_values_t> {
+      if (r == -ENOENT) {
+        return crimson::ct_error::enoent::make();
+      } else if (r < 0){
+        logger().error("omap_get_values: {}", r);
+        return crimson::ct_error::input_output_error::make();
+      } else {
+        return read_errorator::make_ready_future<omap_values_t>(std::move(values));
+      }
     });
   });
 }
 
-seastar::future<std::tuple<bool, AlienStore::omap_values_t>>
-AlienStore::omap_get_values(CollectionRef ch,
-                            const ghobject_t &oid,
-                            const std::optional<string> &start)
+auto AlienStore::omap_get_values(CollectionRef ch,
+                                 const ghobject_t &oid,
+                                 const std::optional<string> &start)
+  -> read_errorator::future<std::tuple<bool, omap_values_t>>
 {
   logger().debug("{} with_start", __func__);
   return seastar::do_with(omap_values_t{}, [=] (auto &values) {
@@ -334,9 +340,17 @@ AlienStore::omap_get_values(CollectionRef ch,
       auto c = static_cast<AlienCollection*>(ch.get());
       return store->omap_get_values(c->collection, oid, start,
                                    reinterpret_cast<map<string, bufferlist>*>(&values));
-    }).then([&values] (int r) {
-      return seastar::make_ready_future<std::tuple<bool, omap_values_t>>(
-        std::make_tuple(true, std::move(values)));
+    }).then([&values] (int r)
+      -> read_errorator::future<std::tuple<bool, omap_values_t>> {
+      if (r == -ENOENT) {
+        return crimson::ct_error::enoent::make();
+      } else if (r < 0){
+        logger().error("omap_get_values(start): {}", r);
+        return crimson::ct_error::input_output_error::make();
+      } else {
+        return read_errorator::make_ready_future<std::tuple<bool, omap_values_t>>(
+          std::make_tuple(true, std::move(values)));
+      }
     });
   });
 }
index c9ecfdf4e316c0eb9981ac2e12e77ad9429e853e..55d0cda55834137257da36659cd96f41bcc2ad92 100644 (file)
@@ -64,24 +64,24 @@ public:
   get_attrs_ertr::future<attrs_t> get_attrs(CollectionRef c,
                                      const ghobject_t& oid) final;
 
-  seastar::future<omap_values_t> omap_get_values(
+  read_errorator::future<omap_values_t> omap_get_values(
     CollectionRef c,
     const ghobject_t& oid,
     const omap_keys_t& keys) final;
 
-  seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
-    CollectionRef c,
-    const ghobject_t& start,
-    const ghobject_t& end,
-    uint64_t limit) const final;
-
   /// Retrieves paged set of values > start (if present)
-  seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+  read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
     CollectionRef c,           ///< [in] collection
     const ghobject_t &oid,     ///< [in] oid
     const std::optional<std::string> &start ///< [in] start, empty for begin
     ) final; ///< @return <done, values> values.empty() iff done
 
+  seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
+    CollectionRef c,
+    const ghobject_t& start,
+    const ghobject_t& end,
+    uint64_t limit) const final;
+
   seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final;
   seastar::future<CollectionRef> open_collection(const coll_t& cid) final;
   seastar::future<std::vector<coll_t>> list_collections() final;
index 4ba19f67effbad245c9b58f5d0a15963847a1146..57363b1d81abb1bfd76472b4c3487fae450d8149 100644 (file)
@@ -253,17 +253,16 @@ CyanStore::get_attrs_ertr::future<CyanStore::attrs_t> CyanStore::get_attrs(
   return get_attrs_ertr::make_ready_future<attrs_t>(o->xattr);
 }
 
-seastar::future<CyanStore::omap_values_t>
-CyanStore::omap_get_values(CollectionRef ch,
-                           const ghobject_t& oid,
-                           const omap_keys_t& keys)
+auto CyanStore::omap_get_values(CollectionRef ch,
+                               const ghobject_t& oid,
+                               const omap_keys_t& keys)
+  -> read_errorator::future<omap_values_t>
 {
   auto c = static_cast<Collection*>(ch.get());
-  logger().debug("{} {} {}",
-                __func__, c->get_cid(), oid);
+  logger().debug("{} {} {}", __func__, c->get_cid(), oid);
   auto o = c->get_object(oid);
   if (!o) {
-    throw std::runtime_error(fmt::format("object does not exist: {}", oid));
+    return crimson::ct_error::enoent::make();
   }
   omap_values_t values;
   for (auto& key : keys) {
@@ -274,19 +273,17 @@ CyanStore::omap_get_values(CollectionRef ch,
   return seastar::make_ready_future<omap_values_t>(std::move(values));
 }
 
-seastar::future<std::tuple<bool, CyanStore::omap_values_t>>
-CyanStore::omap_get_values(
-    CollectionRef ch,
-    const ghobject_t &oid,
-    const std::optional<string> &start
-  ) {
+auto
+CyanStore::omap_get_values(CollectionRef ch,
+                          const ghobject_t &oid,
+                          const std::optional<string> &start)
+  -> read_errorator::future<std::tuple<bool, omap_values_t>>
+{
   auto c = static_cast<Collection*>(ch.get());
-  logger().debug(
-    "{} {} {}",
-    __func__, c->get_cid(), oid);
+  logger().debug("{} {} {}", __func__, c->get_cid(), oid);
   auto o = c->get_object(oid);
   if (!o) {
-    throw std::runtime_error(fmt::format("object does not exist: {}", oid));
+    return crimson::ct_error::enoent::make();
   }
   omap_values_t values;
   for (auto i = start ? o->omap.upper_bound(*start) : o->omap.begin();
index a53cfea931578eeeca15e47f7477e936f3c4c141..877400272b56cd7e6cd6d872f00482a08bb12080 100644 (file)
@@ -100,24 +100,24 @@ public:
     CollectionRef c,
     const ghobject_t& oid);
 
-  seastar::future<omap_values_t> omap_get_values(
+  read_errorator::future<omap_values_t> omap_get_values(
     CollectionRef c,
     const ghobject_t& oid,
     const omap_keys_t& keys) final;
 
-  seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
-    CollectionRef c,
-    const ghobject_t& start,
-    const ghobject_t& end,
-    uint64_t limit) const final;
-
   /// Retrieves paged set of values > start (if present)
-  seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+  read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
     CollectionRef c,           ///< [in] collection
     const ghobject_t &oid,     ///< [in] oid
     const std::optional<std::string> &start ///< [in] start, empty for begin
     ) final; ///< @return <done, values> values.empty() iff done
 
+  seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
+    CollectionRef c,
+    const ghobject_t& start,
+    const ghobject_t& end,
+    uint64_t limit) const final;
+
   seastar::future<ceph::bufferlist> omap_get_header(
     CollectionRef c,
     const ghobject_t& oid) final;
index 445f34ef4dcbb5d1d67c4ffc430e5344319df724..dd41f9c04934134a3e73777677cc3cf2366a9f2a 100644 (file)
@@ -118,16 +118,16 @@ public:
 
   using omap_values_t = std::map<std::string, bufferlist, std::less<>>;
   using omap_keys_t = std::set<std::string>;
-  virtual seastar::future<omap_values_t> omap_get_values(
-                                         CollectionRef c,
-                                         const ghobject_t& oid,
-                                         const omap_keys_t& keys) = 0;
+  virtual read_errorator::future<omap_values_t> omap_get_values(
+    CollectionRef c,
+    const ghobject_t& oid,
+    const omap_keys_t& keys) = 0;
   virtual seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
     CollectionRef c,
     const ghobject_t& start,
     const ghobject_t& end,
     uint64_t limit) const = 0;
-  virtual seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+  virtual read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
     CollectionRef c,           ///< [in] collection
     const ghobject_t &oid,     ///< [in] oid
     const std::optional<std::string> &start ///< [in] start, empty for begin
index bae0bd857ddca2caa2ecfa1492162dd65809523e..e9d77f7228bcee674417948a6836c59bf698f3fd 100644 (file)
@@ -163,18 +163,6 @@ seastar::future<struct stat> SeaStore::stat(
   return seastar::make_ready_future<struct stat>(st);
 }
 
-seastar::future<SeaStore::omap_values_t>
-SeaStore::omap_get_values(CollectionRef ch,
-                           const ghobject_t& oid,
-                           const omap_keys_t& keys)
-{
-  auto c = static_cast<SeastoreCollection*>(ch.get());
-  logger().debug("{} {} {}",
-                __func__, c->get_cid(), oid);
-  return seastar::make_ready_future<omap_values_t>();
-}
-
-
 seastar::future<ceph::bufferlist> omap_get_header(
   CollectionRef c,
   const ghobject_t& oid)
@@ -182,12 +170,26 @@ seastar::future<ceph::bufferlist> omap_get_header(
   return seastar::make_ready_future<bufferlist>();
 }
 
-seastar::future<std::tuple<bool, SeaStore::omap_values_t>>
+auto
+SeaStore::omap_get_values(
+  CollectionRef ch,
+  const ghobject_t& oid,
+  const omap_keys_t& keys)
+  -> read_errorator::future<omap_values_t>
+{
+  auto c = static_cast<SeastoreCollection*>(ch.get());
+  logger().debug("{} {} {}",
+                __func__, c->get_cid(), oid);
+  return seastar::make_ready_future<omap_values_t>();
+}
+
+auto
 SeaStore::omap_get_values(
-    CollectionRef ch,
-    const ghobject_t &oid,
-    const std::optional<string> &start
-  ) {
+  CollectionRef ch,
+  const ghobject_t &oid,
+  const std::optional<string> &start)
+  -> read_errorator::future<std::tuple<bool, SeaStore::omap_values_t>>
+{
   auto c = static_cast<SeastoreCollection*>(ch.get());
   logger().debug(
     "{} {} {}",
index 38afac2e64761646ed212401fa734b4044c3ef12..5ca383c8102708676daa0b43407b11320d171f41 100644 (file)
@@ -69,11 +69,18 @@ public:
     CollectionRef c,
     const ghobject_t& oid) final;
 
-  seastar::future<omap_values_t> omap_get_values(
+  read_errorator::future<omap_values_t> omap_get_values(
     CollectionRef c,
     const ghobject_t& oid,
     const omap_keys_t& keys) final;
 
+  /// Retrieves paged set of values > start (if present)
+  read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
+    CollectionRef c,           ///< [in] collection
+    const ghobject_t &oid,     ///< [in] oid
+    const std::optional<std::string> &start ///< [in] start, empty for begin
+    ) final; ///< @return <done, values> values.empty() iff done
+
   seastar::future<bufferlist> omap_get_header(
     CollectionRef c,
     const ghobject_t& oid) final;
@@ -84,13 +91,6 @@ public:
     const ghobject_t& end,
     uint64_t limit) const final;
 
-  /// Retrieves paged set of values > start (if present)
-  seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
-    CollectionRef c,           ///< [in] collection
-    const ghobject_t &oid,     ///< [in] oid
-    const std::optional<std::string> &start ///< [in] start, empty for begin
-    ) final; ///< @return <done, values> values.empty() iff done
-
   seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final;
   seastar::future<CollectionRef> open_collection(const coll_t& cid) final;
   seastar::future<std::vector<coll_t>> list_collections() final;
index 3a35ffc2f2cd4cb21bd8df409c718f0b8b72c770..eb3defaacec204bf039a1837cd4752cbd3865234 100644 (file)
@@ -723,7 +723,12 @@ PGBackend::get_attr_errorator::future<> PGBackend::get_xattrs(
   });
 }
 
-static seastar::future<crimson::os::FuturizedStore::omap_values_t>
+using get_omap_ertr =
+  crimson::os::FuturizedStore::read_errorator::extend<
+    crimson::ct_error::enodata>;
+static
+get_omap_ertr::future<
+  crimson::os::FuturizedStore::omap_values_t>
 maybe_get_omap_vals_by_keys(
   crimson::os::FuturizedStore* store,
   const crimson::os::CollectionRef& coll,
@@ -733,12 +738,13 @@ maybe_get_omap_vals_by_keys(
   if (oi.is_omap()) {
     return store->omap_get_values(coll, ghobject_t{oi.soid}, keys_to_get);
   } else {
-    return seastar::make_ready_future<crimson::os::FuturizedStore::omap_values_t>(
-      crimson::os::FuturizedStore::omap_values_t{});
+    return crimson::ct_error::enodata::make();
   }
 }
 
-static seastar::future<std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>
+static
+get_omap_ertr::future<
+  std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>
 maybe_get_omap_vals(
   crimson::os::FuturizedStore* store,
   const crimson::os::CollectionRef& coll,
@@ -748,8 +754,7 @@ maybe_get_omap_vals(
   if (oi.is_omap()) {
     return store->omap_get_values(coll, ghobject_t{oi.soid}, start_after);
   } else {
-    return seastar::make_ready_future<std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>(
-      std::make_tuple(true, crimson::os::FuturizedStore::omap_values_t{}));
+    return crimson::ct_error::enodata::make();
   }
 }
 
@@ -771,7 +776,8 @@ seastar::future<> PGBackend::omap_get_header(
     });
 }
 
-seastar::future<> PGBackend::omap_get_keys(
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_keys(
   const ObjectState& os,
   OSDOp& osd_op) const
 {
@@ -793,12 +799,12 @@ seastar::future<> PGBackend::omap_get_keys(
     std::min(max_return, local_conf()->osd_max_omap_entries_per_request);
 
   // TODO: truly chunk the reading
-  return maybe_get_omap_vals(store, coll, os.oi, start_after).then(
-    [=, &osd_op] (auto ret) {
+  return maybe_get_omap_vals(store, coll, os.oi, start_after).safe_then(
+    [=, &osd_op](auto ret) {
       ceph::bufferlist result;
       bool truncated = false;
       uint32_t num = 0;
-      for (auto[key, val] : std::get<1>(ret)) {
+      for (auto &[key, val] : std::get<1>(ret)) {
         if (num >= max_return ||
             result.length() >= local_conf()->osd_max_omap_bytes_per_request) {
           truncated = true;
@@ -811,14 +817,23 @@ seastar::future<> PGBackend::omap_get_keys(
       osd_op.outdata.claim_append(result);
       encode(truncated, osd_op.outdata);
       return seastar::now();
-    });
-
+    }).handle_error(
+      crimson::ct_error::enodata::handle([&osd_op] {
+        uint32_t num = 0;
+       bool truncated = false;
+       encode(num, osd_op.outdata);
+       encode(truncated, osd_op.outdata);
+       return seastar::now();
+      }),
+      ll_read_errorator::pass_further{}
+    );
   // TODO:
   //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
   //ctx->delta_stats.num_rd++;
 }
 
-seastar::future<> PGBackend::omap_get_vals(
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_vals(
   const ObjectState& os,
   OSDOp& osd_op) const
 {
@@ -843,7 +858,7 @@ seastar::future<> PGBackend::omap_get_vals(
     std::min(max_return, local_conf()->osd_max_omap_entries_per_request);
 
   // TODO: truly chunk the reading
-  return maybe_get_omap_vals(store, coll, os.oi, start_after).then(
+  return maybe_get_omap_vals(store, coll, os.oi, start_after).safe_then(
     [=, &osd_op] (auto&& ret) {
       auto [done, vals] = std::move(ret);
       assert(done);
@@ -868,14 +883,23 @@ seastar::future<> PGBackend::omap_get_vals(
       encode(num, osd_op.outdata);
       osd_op.outdata.claim_append(result);
       encode(truncated, osd_op.outdata);
-      return seastar::now();
-    });
+      return ll_read_errorator::now();
+    }).handle_error(
+      crimson::ct_error::enodata::handle([&osd_op] {
+        encode(uint32_t{0} /* num */, osd_op.outdata);
+        encode(bool{false} /* truncated */, osd_op.outdata);
+        return ll_read_errorator::now();
+      }),
+      ll_read_errorator::pass_further{}
+    );
 
   // TODO:
   //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
   //ctx->delta_stats.num_rd++;
 }
-seastar::future<> PGBackend::omap_get_vals_by_keys(
+
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_vals_by_keys(
   const ObjectState& os,
   OSDOp& osd_op) const
 {
@@ -892,11 +916,18 @@ seastar::future<> PGBackend::omap_get_vals_by_keys(
     throw crimson::osd::invalid_argument();
   }
 
-  return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).then(
-    [&osd_op] (crimson::os::FuturizedStore::omap_values_t vals) {
+  return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).safe_then(
+    [&osd_op] (crimson::os::FuturizedStore::omap_values_t&& vals) {
       encode(vals, osd_op.outdata);
-      return seastar::now();
-    });
+      return ll_read_errorator::now();
+    }).handle_error(
+      crimson::ct_error::enodata::handle([&osd_op] {
+        uint32_t num = 0;
+        encode(num, osd_op.outdata);
+        return ll_read_errorator::now();
+      }),
+      ll_read_errorator::pass_further{}
+    );
 
   // TODO:
   //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
index dab750dde17ff525cf9d1d5ab5ffa16e37dce0e1..39516a7f04ac9a76289b45c08aaf0838993ad7c7 100644 (file)
@@ -143,13 +143,13 @@ public:
     uint64_t len);
 
   // OMAP
-  seastar::future<> omap_get_keys(
+  ll_read_errorator::future<> omap_get_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;
-  seastar::future<> omap_get_vals(
+  ll_read_errorator::future<> omap_get_vals(
     const ObjectState& os,
     OSDOp& osd_op) const;
-  seastar::future<> omap_get_vals_by_keys(
+  ll_read_errorator::future<> omap_get_vals_by_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;
   seastar::future<> omap_set_vals(
index e5dda965aa667cd5a8264b693b59b10466a489b9..ad538596355cbd9c7add3b30777c3b8203f09430 100644 (file)
@@ -32,13 +32,14 @@ namespace {
     return std::make_optional(std::move(value));
   }
 }
+
 seastar::future<epoch_t> PGMeta::get_epoch()
 {
   return store->open_collection(coll_t{pgid}).then([this](auto ch) {
     return store->omap_get_values(ch,
                                 pgid.make_pgmeta_oid(),
                                 {string{infover_key},
-                                 string{epoch_key}}).then(
+                                 string{epoch_key}}).safe_then(
     [](auto&& values) {
       {
         // sanity check
@@ -53,6 +54,9 @@ seastar::future<epoch_t> PGMeta::get_epoch()
         assert(epoch);
         return seastar::make_ready_future<epoch_t>(*epoch);
       }
+    },
+    FuturizedStore::read_errorator::assert_all{
+      "PGMeta::get_epoch: unable to read pgmeta"
     });
   });
 }
@@ -66,7 +70,7 @@ seastar::future<std::tuple<pg_info_t, PastIntervals>> PGMeta::load()
                                  string{info_key},
                                  string{biginfo_key},
                                  string{fastinfo_key}});
-  }).then([](auto&& values) {
+  }).safe_then([](auto&& values) {
     {
       // sanity check
       auto infover = find_value<__u8>(values, infover_key);
@@ -97,5 +101,8 @@ seastar::future<std::tuple<pg_info_t, PastIntervals>> PGMeta::load()
     }
     return seastar::make_ready_future<std::tuple<pg_info_t, PastIntervals>>(
       std::make_tuple(std::move(info), std::move(past_intervals)));
+  },
+  FuturizedStore::read_errorator::assert_all{
+    "PGMeta::load: unable to read pgmeta"
   });
 }