From: myoungwon oh Date: Mon, 5 Sep 2022 05:12:17 +0000 (+0900) Subject: crimson/os/seastore/epm: introduce RandomBlockOolWriter X-Git-Tag: v18.1.0~794^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8b4a65362b513ccc64576a87a076d23e37c9ee46;p=ceph.git crimson/os/seastore/epm: introduce RandomBlockOolWriter Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 500a2bed66a7..25e29988d723 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -494,4 +494,53 @@ void ExtentPlacementManager::BackgroundProcess::register_metrics() }); } +RandomBlockOolWriter::alloc_write_iertr::future<> +RandomBlockOolWriter::alloc_write_ool_extents( + Transaction& t, + std::list& extents) +{ + if (extents.empty()) { + return alloc_write_iertr::now(); + } + return seastar::with_gate(write_guard, [this, &t, &extents] { + return do_write(t, extents); + }); +} + +RandomBlockOolWriter::alloc_write_iertr::future<> +RandomBlockOolWriter::do_write( + Transaction& t, + std::list& extents) +{ + LOG_PREFIX(RandomBlockOolWriter::do_write); + assert(!extents.empty()); + DEBUGT("start with {} allocated extents", + t, extents.size()); + return trans_intr::do_for_each(extents, + [this, &t, FNAME](auto& ex) { + auto paddr = ex->get_paddr(); + assert(paddr.is_absolute()); + RandomBlockManager * rbm = rb_cleaner->get_rbm(paddr); + assert(rbm); + TRACE("extent {}, allocated addr {}", ex, paddr); + auto& stats = t.get_ool_write_stats(); + stats.extents.num += 1; + stats.extents.bytes += ex->get_length(); + stats.num_records += 1; + + return rbm->write(paddr, + ex->get_bptr() + ).handle_error( + alloc_write_iertr::pass_further{}, + crimson::ct_error::assert_all{ + "Invalid error when writing record"} + ).safe_then([&t, &ex, paddr, FNAME]() { + TRACET("ool extent written at {} -- {}", + t, paddr, *ex); + t.mark_extent_ool(ex, paddr); + return alloc_write_iertr::now(); + }); + }); +} + } diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 061aa54a6a80..cb0dde5b0c0b 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -85,6 +85,36 @@ private: seastar::gate write_guard; }; + +class RandomBlockOolWriter : public ExtentOolWriter { +public: + RandomBlockOolWriter(RBMCleaner* rb_cleaner) : + rb_cleaner(rb_cleaner) {} + + using open_ertr = ExtentOolWriter::open_ertr; + open_ertr::future<> open() final { + return open_ertr::now(); + } + + alloc_write_iertr::future<> alloc_write_ool_extents( + Transaction &t, + std::list &extents) final; + + close_ertr::future<> close() final { + return write_guard.close().then([this] { + write_guard = seastar::gate(); + return close_ertr::now(); + }); + } +private: + alloc_write_iertr::future<> do_write( + Transaction& t, + std::list &extent); + + RBMCleaner* rb_cleaner; + seastar::gate write_guard; +}; + class ExtentPlacementManager { public: ExtentPlacementManager() { diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 0f5f31f277d7..d89feb2b390f 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -190,6 +190,10 @@ public: write_set.insert(*ref); } + void mark_extent_ool(LogicalCachedExtentRef& ref, paddr_t final_addr) { + mark_delayed_extent_ool(ref, final_addr); + } + void add_mutated_extent(CachedExtentRef ref) { ceph_assert(!is_weak()); assert(ref->is_exist_mutation_pending() ||