From 87ba4d7949d50ad9b83cf001ec07d8064351737d Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 1 Jul 2022 00:23:34 -0700 Subject: [PATCH] crimson/osd: factor out open_meta_coll, open_or_create_meta_coll Signed-off-by: Samuel Just --- src/crimson/osd/osd.cc | 85 +++++++++++++++++++++++-------------- src/crimson/osd/osd.h | 2 + src/crimson/osd/osd_meta.cc | 20 ++++----- src/crimson/osd/osd_meta.h | 6 ++- 4 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index badb957ee3c96..85a4741775c8b 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -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(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(ch, store); + return seastar::now(); + }); + } else { + meta_coll = make_unique(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(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(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(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); diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index 3f8bcdd120164..96398ff7daade 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -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); diff --git a/src/crimson/osd/osd_meta.cc b/src/crimson/osd/osd_meta.cc index eeea9b57280eb..973169fa4af1f 100644 --- a/src/crimson/osd/osd_meta.cc +++ b/src/crimson/osd/osd_meta.cc @@ -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 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(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(std::move(superblock)); + }); } seastar::future #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 load_superblock(); + + using load_superblock_ertr = crimson::os::FuturizedStore::read_errorator; + using load_superblock_ret = load_superblock_ertr::future; + load_superblock_ret load_superblock(); using ec_profile_t = std::map; seastar::future