]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: refactor SegmentManager reference ownership
authorSamuel Just <sjust@redhat.com>
Thu, 22 Apr 2021 23:56:08 +0000 (16:56 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 7 May 2021 07:36:44 +0000 (00:36 -0700)
Gives SeaStore ownership over SegmentManager and rearranges mkfs/mount.
Replaces mkfs_config_t/mount_config_t with config params.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/common/options/crimson.yaml.in
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h
src/crimson/os/seastore/segment_manager.h
src/crimson/os/seastore/segment_manager/block.cc
src/crimson/os/seastore/segment_manager/block.h
src/crimson/os/seastore/segment_manager/ephemeral.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/tools/store-nbd.cc
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h

index eb4c9d74214add8bf7c7c7f808d20c04c7d9254f..38fd8c032470a697a17a28268bb2246075bd317d 100644 (file)
@@ -23,3 +23,20 @@ options:
   type: str
   level: advanced
   desc: CPU cores on which alienstore threads will run
+- name: seastore_segment_size
+  type: size
+  desc: Segment size to use for SegmentManager
+  level: advanced
+  default: 64_M
+- name: seastore_device_size
+  type: size
+  desc: Total size to use for SegmentManager block file if created
+  level: dev
+  default: 100_G
+- name: seastore_block_create
+  type: bool
+  level: dev
+  desc: Create SegmentManager file if it doesn't exist
+  default: true
+  see_also:
+  - seastore_device_size
index 4fb577113a7a73c6f7ee2400f5bc71603f7642e0..62101430abfe88d39de32d0bf85cff746be450dc 100644 (file)
@@ -46,8 +46,10 @@ seastar::future<> SeaStore::stop()
 
 seastar::future<> SeaStore::mount()
 {
-  return transaction_manager->mount(
-  ).handle_error(
+  return segment_manager->mount(
+  ).safe_then([this] {
+    return transaction_manager->mount();
+  }).handle_error(
     crimson::ct_error::assert_all{
       "Invalid error in SeaStore::mount"
     }
@@ -61,8 +63,15 @@ seastar::future<> SeaStore::umount()
 
 seastar::future<> SeaStore::mkfs(uuid_d new_osd_fsid)
 {
-  return transaction_manager->mkfs(
+  return segment_manager->mkfs(
+    seastore_meta_t{new_osd_fsid}
   ).safe_then([this] {
+    return segment_manager->mount();
+  }).safe_then([this] {
+    return transaction_manager->mkfs();
+  }).safe_then([this] {
+    return transaction_manager->mount();
+  }).safe_then([this] {
     return seastar::do_with(
       transaction_manager->create_transaction(),
       [this](auto &t) {
@@ -77,6 +86,8 @@ seastar::future<> SeaStore::mkfs(uuid_d new_osd_fsid)
            std::move(t));
        });
       });
+  }).safe_then([this] {
+    return stop();
   }).handle_error(
     crimson::ct_error::assert_all{
       "Invalid error in SeaStore::mkfs"
index 1eb568ebd0e2bdccc82157890445744abab4f6a2..e673e4fff7412999c3fb24e8ef7922e68df233d6 100644 (file)
@@ -33,10 +33,12 @@ class SeaStore final : public FuturizedStore {
 public:
 
   SeaStore(
+    SegmentManagerRef sm,
     TransactionManagerRef tm,
     CollectionManagerRef cm,
     OnodeManagerRef om
-  ) : transaction_manager(std::move(tm)),
+  ) : segment_manager(std::move(sm)),
+      transaction_manager(std::move(tm)),
       collection_manager(std::move(cm)),
       onode_manager(std::move(om)) {}
 
@@ -239,6 +241,7 @@ private:
     const std::optional<std::string>& start,
     OMapManager::omap_list_config_t config);
 
+  SegmentManagerRef segment_manager;
   TransactionManagerRef transaction_manager;
   CollectionManagerRef collection_manager;
   OnodeManagerRef onode_manager;
index 61c6509d19f7dbc503a262d4022b518775d792a0..192564a4b18c7518a823a41e85c8593261bd3105 100644 (file)
@@ -79,6 +79,19 @@ constexpr size_t PADDR_SIZE = sizeof(paddr_t);
 
 class SegmentManager {
 public:
+  using access_ertr = crimson::errorator<
+    crimson::ct_error::input_output_error,
+    crimson::ct_error::permission_denied,
+    crimson::ct_error::enoent>;
+
+  using mount_ertr = access_ertr;
+  using mount_ret = access_ertr::future<>;
+  virtual mount_ret mount() = 0;
+
+  using mkfs_ertr = access_ertr;
+  using mkfs_ret = mkfs_ertr::future<>;
+  virtual mkfs_ret mkfs(seastore_meta_t meta) = 0;
+
   using open_ertr = crimson::errorator<
     crimson::ct_error::input_output_error,
     crimson::ct_error::invarg,
index 36e890894cebd61ec358b8e14a974bfdf676aca8..0094e58e2c2b4de275775cdb3b9d8ecae6cf6db8 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/mman.h>
 #include <string.h>
 
+#include "crimson/common/config_proxy.h"
 #include "crimson/common/log.h"
 
 #include "include/buffer.h"
@@ -92,31 +93,40 @@ SegmentStateTracker::read_in(
 
 static
 block_sm_superblock_t make_superblock(
-  const BlockSegmentManager::mkfs_config_t &config,
+  seastore_meta_t meta,
   const seastar::stat_data &data)
 {
+  using crimson::common::get_conf;
+
+  auto config_size = get_conf<Option::size_t>(
+    "seastore_device_size");
+
   logger().debug(
     "{}: size {}, block_size {}, allocated_size {}, configured_size {}",
     __func__,
     data.size,
     data.block_size,
     data.allocated_size,
-    config.total_size);
-  size_t size = (data.size == 0) ? config.total_size : data.size;
-  size_t raw_segments = size / config.segment_size;
+    config_size);
+
+  size_t size = (data.size == 0) ? config_size : data.size;
+
+  auto config_segment_size = get_conf<Option::size_t>(
+    "seastore_segment_size");
+  size_t raw_segments = size / config_segment_size;
   size_t tracker_size = SegmentStateTracker::get_raw_size(
     raw_segments,
     data.block_size);
   size_t segments = (size - tracker_size - data.block_size)
-    / config.segment_size;
+    / config_segment_size;
   return block_sm_superblock_t{
     size,
-    config.segment_size,
+    config_segment_size,
     data.block_size,
     segments,
     data.block_size,
     tracker_size + data.block_size,
-    config.meta
+    meta
   };
 }
 
@@ -268,10 +278,10 @@ BlockSegmentManager::~BlockSegmentManager()
 {
 }
 
-BlockSegmentManager::mount_ret BlockSegmentManager::mount(const mount_config_t& config)
+BlockSegmentManager::mount_ret BlockSegmentManager::mount()
 {
   return open_device(
-    config.path, seastar::open_flags::rw | seastar::open_flags::dsync
+    device_path, seastar::open_flags::rw | seastar::open_flags::dsync
   ).safe_then([=](auto p) {
     device = std::move(p.first);
     auto sd = p.second;
@@ -295,7 +305,7 @@ BlockSegmentManager::mount_ret BlockSegmentManager::mount(const mount_config_t&
   });
 }
 
-BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(mkfs_config_t config)
+BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(seastore_meta_t meta)
 {
   return seastar::do_with(
     seastar::file{},
@@ -304,11 +314,11 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(mkfs_config_t config)
     std::unique_ptr<SegmentStateTracker>(),
     [=](auto &device, auto &stat, auto &sb, auto &tracker) {
       return open_device(
-       config.path, seastar::open_flags::rw
-      ).safe_then([&, config](auto p) {
+       device_path, seastar::open_flags::rw
+      ).safe_then([&, meta](auto p) {
        device = p.first;
        stat = p.second;
-       sb = make_superblock(config, stat);
+       sb = make_superblock(meta, stat);
        return write_superblock(device, sb);
       }).safe_then([&] {
        logger().debug("BlockSegmentManager::mkfs: superblock written");
index bfa4bd7e1926e5f798d808f33a5ee98031a099e4..6cadbf018ff07d8090d0f20d802fb9fc48203665 100644 (file)
@@ -132,35 +132,16 @@ public:
  */
 class BlockSegmentManager final : public SegmentManager {
 public:
-  using access_ertr = crimson::errorator<
-    crimson::ct_error::input_output_error,
-    crimson::ct_error::permission_denied,
-    crimson::ct_error::enoent>;
-
-
-  struct mount_config_t {
-    std::string path;
-  };
-  using mount_ertr = access_ertr;
-  using mount_ret = access_ertr::future<>;
-  mount_ret mount(const mount_config_t&);
-
-  struct mkfs_config_t {
-    std::string path;
-    size_t segment_size = 0;
-    size_t total_size = 0;
-    seastore_meta_t meta;
-  };
-  using mkfs_ertr = access_ertr;
-  using mkfs_ret = mkfs_ertr::future<>;
-  static mkfs_ret mkfs(mkfs_config_t);
+  mount_ret mount() final;
+
+  mkfs_ret mkfs(seastore_meta_t) final;
   
   using close_ertr = crimson::errorator<
     crimson::ct_error::input_output_error
     >;
   close_ertr::future<> close();
 
-  BlockSegmentManager() = default;
+  BlockSegmentManager(const std::string &path) : device_path(path) {}
   ~BlockSegmentManager();
 
   open_ertr::future<SegmentRef> open(segment_id_t id) final;
@@ -193,6 +174,7 @@ private:
   using segment_state_t = Segment::segment_state_t;
 
   
+  std::string device_path;
   std::unique_ptr<SegmentStateTracker> tracker;
   block_sm_superblock_t superblock;
   seastar::file device;
index 9f19cb4d0c7473ce9ea0d520a5a44d21b4fc5c3a..2096fab3910fc694cb21681164d1dc12dbe05568 100644 (file)
@@ -75,6 +75,14 @@ public:
     crimson::ct_error::erange>;
   init_ertr::future<> init();
 
+  mount_ret mount() {
+    return mount_ertr::now();
+  }
+
+  mkfs_ret mkfs(seastore_meta_t) {
+    return mkfs_ertr::now();
+  }
+
   open_ertr::future<SegmentRef> open(segment_id_t id) final;
 
   release_ertr::future<> release(segment_id_t id) final;
index 1862de85658b8c8d1426a4a733fd7027e195889d..62ea036ea3b5caffd20c58d4c8d3437a86a48e65 100644 (file)
@@ -55,7 +55,7 @@ TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs()
        });
       });
   }).safe_then([this] {
-    return journal->close();
+    return close();
   });
 }
 
index fb485e57430bafa70877169e4d728e9b64516034..065c94c7be2e9af49b8fa949b58868840b608e30 100644 (file)
@@ -38,6 +38,9 @@
 #include <seastar/core/byteorder.hh>
 #include <seastar/core/rwlock.hh>
 
+#include "crimson/common/config_proxy.h"
+#include "crimson/common/perf_counters_collection.h"
+
 #include "crimson/os/seastore/cache.h"
 #include "crimson/os/seastore/segment_cleaner.h"
 #include "crimson/os/seastore/segment_manager.h"
@@ -73,8 +76,6 @@ public:
     std::string type;
     bool mkfs = false;
     std::optional<std::string> path;
-    size_t segment_size;
-    size_t total_device_size;
 
     void populate_options(
       po::options_description &desc)
@@ -86,18 +87,6 @@ public:
         ->notifier([this](auto s) { type = s; }),
         "Backend to use, options are transaction_manager"
        )
-       ("segment-size",
-        po::value<size_t>()
-        ->default_value(16ul << 20 /* 16MB */)
-        ->notifier([this](auto s) { segment_size = s; }),
-        "Total working set size"
-       )
-       ("total-device-size",
-        po::value<size_t>()
-        ->default_value(10ul << 30 /* 10G */)
-        ->notifier([this](auto s) { total_device_size = s; }),
-        "Size of writes"
-       )
        ("device-path",
         po::value<std::string>()
         ->required()
@@ -374,20 +363,29 @@ int main(int argc, char** argv)
   }
 
   sc.run([=] {
-    auto backend = get_backend(backend_config);
-    return seastar::do_with(
-      NBDHandler(*backend, nbd_config),
-      std::move(backend),
-      [](auto &nbd, auto &backend) {
-       return backend->mount(
-       ).then([&] {
-         logger().debug("Running nbd server...");
-         return nbd.run();
-       }).then([&] {
-         return backend->close();
+    return crimson::common::sharded_conf(
+    ).start(EntityName{}, string_view{"ceph"}
+    ).then([=] {
+      auto backend = get_backend(backend_config);
+      return seastar::do_with(
+       NBDHandler(*backend, nbd_config),
+       std::move(backend),
+       [](auto &nbd, auto &backend) {
+         return backend->mount(
+         ).then([&] {
+           logger().debug("Running nbd server...");
+           return nbd.run();
+         }).then([&] {
+           return backend->close();
+         });
        });
+    }).then([=] {
+      return crimson::common::sharded_perf_coll().stop().then([] {
+       return crimson::common::sharded_conf().stop();
       });
+    });
   });
+
   sc.stop();
 }
 
@@ -663,16 +661,15 @@ public:
     assert(config.path);
     segment_manager = std::make_unique<
       segment_manager::block::BlockSegmentManager
-      >();
+      >(*config.path);
     logger().debug("mkfs");
-    BlockSegmentManager::mkfs_config_t block_config{
-      *config.path, config.segment_size, config.total_device_size
-    };
-    block_config.meta.seastore_id.generate_random();
-    return segment_manager->mkfs(std::move(block_config)
+    seastore_meta_t meta;
+    meta.seastore_id.generate_random();
+    return segment_manager->mkfs(
+      std::move(meta)
     ).safe_then([this] {
       logger().debug("");
-      return segment_manager->mount({ *config.path });
+      return segment_manager->mount();
     }).safe_then([this] {
       init();
       logger().debug("tm mkfs");
@@ -699,8 +696,8 @@ public:
     ).then([this] {
       segment_manager = std::make_unique<
        segment_manager::block::BlockSegmentManager
-       >();
-      return segment_manager->mount({ *config.path });
+       >(*config.path);
+      return segment_manager->mount();
     }).safe_then([this] {
       init();
       return tm->mount();
index 96c8384c3171b613f8062617067891eeaca4fb2f..455a4c4df12e963625b45c69d54b29d884e24064 100644 (file)
@@ -82,18 +82,21 @@ struct fltree_onode_manager_test_t
   virtual seastar::future<> _mkfs() final {
     return TMTestState::_mkfs(
     ).then([this] {
-      return seastar::do_with(
-        tm->create_transaction(),
-        [this](auto &t) {
-          return manager->mkfs(*t
-          ).safe_then([this, &t] {
-            return tm->submit_transaction(std::move(t));
-          }).handle_error(
-            crimson::ct_error::assert_all{
-              "Invalid error in _mkfs"
-            }
-          );
-        });
+      return tm->mount(
+      ).safe_then([this] {
+       return seastar::do_with(
+         tm->create_transaction(),
+         [this](auto &t) {
+           return manager->mkfs(*t
+           ).safe_then([this, &t] {
+             return tm->submit_transaction(std::move(t));
+           });
+         });
+      }).safe_then([this] {
+       return tm->close();
+      }).handle_error(
+       crimson::ct_error::assert_all{"Invalid error in _mkfs"}
+      );
     });
   }
 
index b2e37f7c3f9345d50524025d7f2aa7523f61b553..2fa8ebe65932eb6990bc29c31b1e21e651f52fe6 100644 (file)
@@ -91,12 +91,12 @@ auto get_transaction_manager(
 }
 
 auto get_seastore(
-  SegmentManager &segment_manager
+  SegmentManagerRef sm
 ) {
-
-  auto tm = get_transaction_manager(segment_manager);
+  auto tm = get_transaction_manager(*sm);
   auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
   return std::make_unique<SeaStore>(
+    std::move(sm),
     std::move(tm),
     std::move(cm),
     std::make_unique<crimson::os::seastore::onode::FLTreeOnodeManager>(*tm));
@@ -149,6 +149,44 @@ protected:
   }
 };
 
+class TestSegmentManagerWrapper : public SegmentManager {
+  SegmentManager &sm;
+public:
+  TestSegmentManagerWrapper(SegmentManager &sm) : sm(sm) {}
+
+  mount_ret mount() final {
+    return mount_ertr::now(); // we handle this above
+  }
+
+  mkfs_ret mkfs(seastore_meta_t c) final {
+    return mkfs_ertr::now(); // we handle this above
+  }
+
+
+  open_ertr::future<SegmentRef> open(segment_id_t id) final {
+    return sm.open(id);
+  }
+
+  release_ertr::future<> release(segment_id_t id) final {
+    return sm.release(id);
+  }
+
+  read_ertr::future<> read(
+    paddr_t addr, size_t len, ceph::bufferptr &out) final {
+    return sm.read(addr, len, out);
+  }
+
+  size_t get_size() const final { return sm.get_size(); }
+  segment_off_t get_block_size() const final { return sm.get_block_size(); }
+  segment_off_t get_segment_size() const final {
+    return sm.get_segment_size();
+  }
+  const seastore_meta_t &get_meta() const final {
+    return sm.get_meta();
+  }
+  ~TestSegmentManagerWrapper() final {}
+};
+
 class SeaStoreTestState : public EphemeralTestState {
 protected:
   std::unique_ptr<SeaStore> seastore;
@@ -156,7 +194,8 @@ protected:
   SeaStoreTestState() : EphemeralTestState() {}
 
   virtual void _init() {
-    seastore = get_seastore(*segment_manager);
+    seastore = get_seastore(
+      std::make_unique<TestSegmentManagerWrapper>(*segment_manager));
   }
 
   virtual void _destroy() {