From 8b4a65362b513ccc64576a87a076d23e37c9ee46 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Mon, 5 Sep 2022 14:12:17 +0900 Subject: [PATCH] crimson/os/seastore/epm: introduce RandomBlockOolWriter Signed-off-by: Myoungwon Oh --- .../os/seastore/extent_placement_manager.cc | 49 +++++++++++++++++++ .../os/seastore/extent_placement_manager.h | 30 ++++++++++++ src/crimson/os/seastore/transaction.h | 4 ++ 3 files changed, 83 insertions(+) diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 500a2bed66a..25e29988d72 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 061aa54a6a8..cb0dde5b0c0 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 0f5f31f277d..d89feb2b390 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() || -- 2.39.5