]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: factor out open_meta_coll, open_or_create_meta_coll
authorSamuel Just <sjust@redhat.com>
Fri, 1 Jul 2022 07:23:34 +0000 (00:23 -0700)
committerSamuel Just <sjust@redhat.com>
Thu, 14 Jul 2022 00:58:29 +0000 (00:58 +0000)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/osd.cc
src/crimson/osd/osd.h
src/crimson/osd/osd_meta.cc
src/crimson/osd/osd_meta.h

index badb957ee3c96bacb282fb79461bc4bbefb893ec..85a4741775c8b74f1bb072a872db6462b3ee8ed6 100644 (file)
@@ -154,6 +154,31 @@ CompatSet get_osd_initial_compat_set()
 }
 }
 
+seastar::future<> OSD::open_meta_coll()
+{
+  return store.open_collection(
+    coll_t::meta()
+  ).then([this](auto ch) {
+    meta_coll = make_unique<OSDMeta>(ch, store);
+    return seastar::now();
+  });
+}
+
+seastar::future<> OSD::open_or_create_meta_coll()
+{
+  return store.open_collection(coll_t::meta()).then([this] (auto ch) {
+    if (!ch) {
+      return store.create_new_collection(coll_t::meta()).then([this] (auto ch) {
+       meta_coll = make_unique<OSDMeta>(ch, store);
+       return seastar::now();
+      });
+    } else {
+      meta_coll = make_unique<OSDMeta>(ch, store);
+      return seastar::now();
+    }
+  });
+}
+
 seastar::future<> OSD::mkfs(
   uuid_d osd_uuid,
   uuid_d cluster_fsid,
@@ -175,6 +200,8 @@ seastar::future<> OSD::mkfs(
                        ec.value(), ec.message());
         std::exit(EXIT_FAILURE);
       }));
+  }).then([this] {
+    return open_or_create_meta_coll();
   }).then([cluster_fsid, this] {
     superblock.cluster_fsid = cluster_fsid;
     superblock.osd_fsid = store.get_fsid();
@@ -203,39 +230,33 @@ seastar::future<> OSD::mkfs(
 
 seastar::future<> OSD::_write_superblock()
 {
-  return store.open_collection(coll_t::meta()).then([this] (auto ch) {
-    if (ch) {
-      // if we already have superblock, check if it matches
-      meta_coll = make_unique<OSDMeta>(ch, store);
-      return meta_coll->load_superblock().then([this](OSDSuperblock&& sb) {
-        if (sb.cluster_fsid != superblock.cluster_fsid) {
-          logger().error("provided cluster fsid {} != superblock's {}",
-                         sb.cluster_fsid, superblock.cluster_fsid);
-          throw std::invalid_argument("mismatched fsid");
-        }
-        if (sb.whoami != superblock.whoami) {
-          logger().error("provided osd id {} != superblock's {}",
-                         sb.whoami, superblock.whoami);
-          throw std::invalid_argument("mismatched osd id");
-        }
-      });
-    } else {
+  return meta_coll->load_superblock().safe_then([this](OSDSuperblock&& sb) {
+    if (sb.cluster_fsid != superblock.cluster_fsid) {
+      logger().error("provided cluster fsid {} != superblock's {}",
+                    sb.cluster_fsid, superblock.cluster_fsid);
+      throw std::invalid_argument("mismatched fsid");
+    }
+    if (sb.whoami != superblock.whoami) {
+      logger().error("provided osd id {} != superblock's {}",
+                    sb.whoami, superblock.whoami);
+      throw std::invalid_argument("mismatched osd id");
+    }
+  }).handle_error(
+    crimson::ct_error::enoent::handle([this] {
       // meta collection does not yet, create superblock
       logger().info(
         "{} writing superblock cluster_fsid {} osd_fsid {}",
         "_write_superblock",
         superblock.cluster_fsid,
         superblock.osd_fsid);
-      return store.create_new_collection(coll_t::meta()).then([this] (auto ch) {
-        meta_coll = make_unique<OSDMeta>(ch, store);
-        ceph::os::Transaction t;
-        meta_coll->create(t);
-        meta_coll->store_superblock(t, superblock);
-        logger().debug("OSD::_write_superblock: do_transaction...");
-        return store.do_transaction(meta_coll->collection(), std::move(t));
-      });
-    }
-  });
+      ceph::os::Transaction t;
+      meta_coll->create(t);
+      meta_coll->store_superblock(t, superblock);
+      logger().debug("OSD::_write_superblock: do_transaction...");
+      return store.do_transaction(meta_coll->collection(), std::move(t));
+    }),
+    crimson::ct_error::assert_all("_write_superbock error")
+  );
 }
 
 // this `to_string` sits in the `crimson::osd` namespace, so we don't brake
@@ -323,10 +344,12 @@ seastar::future<> OSD::start()
         std::exit(EXIT_FAILURE);
       }));
   }).then([this] {
-    return store.open_collection(coll_t::meta());
-  }).then([this](auto ch) {
-    meta_coll = make_unique<OSDMeta>(ch, store);
-    return meta_coll->load_superblock();
+    return open_meta_coll();
+  }).then([this] {
+    return meta_coll->load_superblock(
+    ).handle_error(
+      crimson::ct_error::assert_all("open_meta_coll error")
+    );
   }).then([this](OSDSuperblock&& sb) {
     superblock = std::move(sb);
     return get_map(superblock.current_epoch);
index 3f8bcdd120164583d3f06ded6123bdeda6c8dd40..96398ff7daadebf003a9a0e6f54643682e5d11a6 100644 (file)
@@ -126,6 +126,8 @@ public:
       crimson::net::MessengerRef hb_back_msgr);
   ~OSD() final;
 
+  seastar::future<> open_meta_coll();
+  seastar::future<> open_or_create_meta_coll();
   seastar::future<> mkfs(uuid_d osd_uuid,
                          uuid_d cluster_fsid,
                          std::string osdspec_affinity);
index eeea9b57280eb4ddb18070c1987bba9bee393164..973169fa4af1fd31504fb13d694ac85d7316e8fc 100644 (file)
@@ -43,18 +43,16 @@ void OSDMeta::store_superblock(ceph::os::Transaction& t,
   t.write(coll->get_cid(), superblock_oid(), 0, bl.length(), bl);
 }
 
-seastar::future<OSDSuperblock> OSDMeta::load_superblock()
+OSDMeta::load_superblock_ret OSDMeta::load_superblock()
 {
-  return store.read(coll, superblock_oid(), 0, 0).safe_then(
-    [] (bufferlist&& bl) {
-      auto p = bl.cbegin();
-      OSDSuperblock superblock;
-      decode(superblock, p);
-      return seastar::make_ready_future<OSDSuperblock>(std::move(superblock));
-    }, read_errorator::all_same_way([] {
-      throw std::runtime_error(fmt::format("read gave enoent on {}",
-                                           superblock_oid()));
-    }));
+  return store.read(
+    coll, superblock_oid(), 0, 0
+  ).safe_then([] (bufferlist&& bl) {
+    auto p = bl.cbegin();
+    OSDSuperblock superblock;
+    decode(superblock, p);
+    return seastar::make_ready_future<OSDSuperblock>(std::move(superblock));
+  });
 }
 
 seastar::future<std::tuple<pg_pool_t,
index df1444180885184cfd740952753caa5b38530508..716af2eb232e90cc66a505fa41dba712ed3c87c1 100644 (file)
@@ -8,6 +8,7 @@
 #include <seastar/core/future.hh>
 #include "osd/osd_types.h"
 #include "crimson/os/futurized_collection.h"
+#include "crimson/os/futurized_store.h"
 
 namespace ceph::os {
   class Transaction;
@@ -43,7 +44,10 @@ public:
 
   void store_superblock(ceph::os::Transaction& t,
                         const OSDSuperblock& sb);
-  seastar::future<OSDSuperblock> load_superblock();
+
+  using load_superblock_ertr = crimson::os::FuturizedStore::read_errorator;
+  using load_superblock_ret = load_superblock_ertr::future<OSDSuperblock>;
+  load_superblock_ret load_superblock();
 
   using ec_profile_t = std::map<std::string, std::string>;
   seastar::future<std::tuple<pg_pool_t,