]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: apply errorator along the read path, part 5.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 22:43:57 +0000 (00:43 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 20 Nov 2019 19:37:40 +0000 (20:37 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/os/futurized_store.h
src/crimson/osd/ops_executer.cc
src/crimson/osd/osd_meta.cc
src/crimson/osd/pg_backend.cc

index 10bf6874c253dda18d33956976aee614f14f6bce..b7ac7d7dff7a5bae0653792ea7d46d1691e284c4 100644 (file)
@@ -42,17 +42,7 @@ public:
   virtual store_statfs_t stat() const = 0;
 
   using CollectionRef = boost::intrusive_ptr<FuturizedCollection>;
-
-  // TODO: using read_errorator = ceph::errorator<...>
-  struct read_errorator : crimson::errorator<crimson::ct_error::enoent> {
-    // just for the makeshift period of switching to errorator
-    struct throw_as_runtime_error : discard_all {
-      auto operator()(const auto& e) {
-        throw std::runtime_error("legacy throwing");
-        return discard_all::operator()(e);
-      }
-    };
-  };
+  using read_errorator = crimson::errorator<crimson::ct_error::enoent>;
   virtual read_errorator::future<ceph::bufferlist> read(
     CollectionRef c,
     const ghobject_t& oid,
index 3e7519dfb643245afcb6441a0de106135abe9f08..9fb66f543e63e65d6c257d67238585e60909fce7 100644 (file)
@@ -370,7 +370,20 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op)
           osd_op.rval = bl.length();
           osd_op.outdata = std::move(bl);
           return seastar::now();
-        }, PGBackend::read_errorator::discard_all{});
+        },
+        // TODO: move this error handling do PG::do_osd_ops().
+        crimson::ct_error::input_output_error::handle([] {
+          throw ceph::osd::input_output_error{};
+        }),
+        crimson::ct_error::object_corrupted::handle([] {
+          throw ceph::osd::object_corrupted{};
+        }),
+        crimson::ct_error::enoent::handle([] {
+          throw ceph::osd::object_not_found{};
+        }),
+        crimson::ct_error::enodata::handle([] {
+          throw ceph::osd::no_message_available{};
+        }));
     });
   case CEPH_OSD_OP_GETXATTR:
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
index 6baaf07d154386ca14a050a5fbf98e117c554fb7..c608c8d3512207150774c52261f3acd169a11e4f 100644 (file)
@@ -1,6 +1,7 @@
 #include "osd_meta.h"
 
 #include <fmt/format.h>
+#include <fmt/ostream.h>
 
 #include "crimson/os/futurized_collection.h"
 #include "crimson/os/futurized_store.h"
@@ -24,8 +25,14 @@ seastar::future<bufferlist> OSDMeta::load_map(epoch_t e)
   return store->read(coll,
                      osdmap_oid(e), 0, 0,
                      CEPH_OSD_OP_FLAG_FADVISE_WILLNEED).safe_then(
-    [] (auto&& bl) { return bl; },
-    read_errorator::throw_as_runtime_error{});
+    [] (auto&& bl) {
+      // TODO: introduce `::handle_error()` to errorated futures
+      // to avoid lambas like this one.
+      return bl;
+    }, crimson::ct_error::enoent::handle([e] {
+      throw std::runtime_error(fmt::format("read gave enoent on {}",
+                                           osdmap_oid(e)));
+    }));
 }
 
 void OSDMeta::store_superblock(ceph::os::Transaction& t,
@@ -38,13 +45,16 @@ void OSDMeta::store_superblock(ceph::os::Transaction& t,
 
 seastar::future<OSDSuperblock> OSDMeta::load_superblock()
 {
-  return store->read(coll, superblock_oid(), 0, 0)
-    .safe_then([this] (bufferlist&& bl) {
+  return store->read(coll, superblock_oid(), 0, 0).safe_then(
+    [this] (bufferlist&& bl) {
       auto p = bl.cbegin();
       OSDSuperblock superblock;
       decode(superblock, p);
       return seastar::make_ready_future<OSDSuperblock>(std::move(superblock));
-  }, read_errorator::throw_as_runtime_error{});
+    }, crimson::ct_error::enoent::handle([] {
+      throw std::runtime_error(fmt::format("read gave enoent on {}",
+                                           superblock_oid()));
+    }));
 }
 
 seastar::future<pg_pool_t,
@@ -65,7 +75,10 @@ OSDMeta::load_final_pool_info(int64_t pool) {
                                       ec_profile_t>(std::move(pi),
                                                     std::move(name),
                                                     std::move(ec_profile));
-  }, read_errorator::throw_as_runtime_error{});
+  }, crimson::ct_error::enoent::handle([pool] {
+    throw std::runtime_error(fmt::format("read gave enoent on {}",
+                                         final_pool_info_oid(pool)));
+  }));
 }
 
 ghobject_t OSDMeta::osdmap_oid(epoch_t epoch)
index dec2fb84b60f2808a658596e44832a75a0c38e83..f15444fe4ec881bc17ab92cbb590bf2e7ad52af4 100644 (file)
@@ -7,6 +7,7 @@
 #include <boost/range/adaptor/filtered.hpp>
 #include <boost/range/adaptor/transformed.hpp>
 #include <boost/range/algorithm/copy.hpp>
+#include <fmt/format.h>
 #include <fmt/ostream.h>
 #include <seastar/core/print.hh>