From: Yingxin Cheng Date: Tue, 15 Mar 2022 01:18:08 +0000 (+0800) Subject: crimson/os/seastore/EPM: coalesce writes using the same writer X-Git-Tag: v18.0.0~1193^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=593b3a9b9119886787ddcf1122797f8b3655bd8e;p=ceph.git crimson/os/seastore/EPM: coalesce writes using the same writer After integrated with RecordSubmitter, Writer is able to coalesce concurrent writes into record groups. There is no need to distribute writes to multiple Writers for both large and small write sizes. Signed-off-by: Yingxin Cheng --- diff --git a/src/common/options/crimson.yaml.in b/src/common/options/crimson.yaml.in index 7f906a889589..ee9ee653ec78 100644 --- a/src/common/options/crimson.yaml.in +++ b/src/common/options/crimson.yaml.in @@ -40,11 +40,6 @@ options: default: true see_also: - seastore_device_size -- name: seastore_init_write_segments_num_per_device - type: uint - level: dev - desc: Initial number of segments for writing new extents per device - default: 6 - name: seastore_journal_batch_capacity type: uint level: dev diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index fcb9cb394785..660e8d554f4c 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -12,22 +12,16 @@ namespace crimson::os::seastore { SegmentedAllocator::SegmentedAllocator( SegmentProvider& sp, SegmentManager& sm) - : rewriter(sp, sm) + : cold_writer{"COLD", sp, sm}, + rewrite_writer{"REWRITE", sp, sm} { - std::generate_n( - std::back_inserter(writers), - crimson::common::get_conf( - "seastore_init_write_segments_num_per_device"), - [&] { - return Writer{sp, sm}; - } - ); } SegmentedAllocator::Writer::Writer( + std::string name, SegmentProvider& sp, SegmentManager& sm) - : segment_allocator("OOL", segment_type_t::OOL, sp, sm), + : segment_allocator(name, segment_type_t::OOL, sp, sm), record_submitter(crimson::common::get_conf( "seastore_journal_iodepth_limit"), crimson::common::get_conf( diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 263dc0cf4218..0d1c4e49cfb5 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -75,7 +75,7 @@ class SegmentProvider; class SegmentedAllocator : public ExtentAllocator { class Writer : public ExtentOolWriter { public: - Writer(SegmentProvider& sp, SegmentManager& sm); + Writer(std::string name, SegmentProvider& sp, SegmentManager& sm); Writer(Writer &&) = default; open_ertr::future<> open() final; @@ -112,16 +112,20 @@ public: SegmentManager& sm); Writer &get_writer(placement_hint_t hint) { - if (hint == placement_hint_t::REWRITE) { - return rewriter; + assert(hint >= placement_hint_t::COLD); + assert(hint < placement_hint_t::NUM_HINTS); + if (hint == placement_hint_t::COLD) { + return cold_writer; } else { - return writers[std::rand() % writers.size()]; + assert(hint == placement_hint_t::REWRITE); + return rewrite_writer; } } open_ertr::future<> open() { - return crimson::do_for_each(writers, [](auto& writer) { - return writer.open(); + return cold_writer.open( + ).safe_then([this] { + return rewrite_writer.open(); }); } @@ -146,13 +150,17 @@ public: } stop_ertr::future<> stop() { - return crimson::do_for_each(writers, [](auto& writer) { - return writer.stop(); + return cold_writer.stop( + ).safe_then([this] { + return rewrite_writer.stop(); }); } private: - Writer rewriter; - std::vector writers; + // TODO: + // - hot_writer + // - a map of hint -> writer + Writer cold_writer; + Writer rewrite_writer; }; class ExtentPlacementManager { @@ -202,7 +210,7 @@ public: std::move(bp)}; } - // FIXME: set delay for COLD extent when the record overhead is low + // FIXME: set delay for COLD extent and improve GC // NOTE: delay means to delay the decision about whether to write the // extent as inline or out-of-line extents. bool delay = (hint > placement_hint_t::COLD &&