From 5d41bda16ee7cf5ac234be732dc2ba971fc12b10 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 18 Mar 2021 16:35:21 +0800 Subject: [PATCH] crimson/onode-staged-tree: implement NodeExtentManager::retire_extent() Signed-off-by: Yingxin Cheng --- .../staged-fltree/node_extent_manager.h | 1 + .../staged-fltree/node_extent_manager/dummy.h | 35 +++++++++++++++++++ .../node_extent_manager/seastore.h | 12 +++++++ 3 files changed, 48 insertions(+) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h index 601261958a0..76b0828a136 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h @@ -72,6 +72,7 @@ class NodeExtentManager { virtual tm_future read_extent( Transaction&, laddr_t, extent_len_t) = 0; virtual tm_future alloc_extent(Transaction&, extent_len_t) = 0; + virtual tm_future<> retire_extent(Transaction&, NodeExtentRef) = 0; virtual tm_future get_super(Transaction&, RootNodeTracker&) = 0; virtual std::ostream& print(std::ostream& os) const = 0; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h index 830ea4a7db8..e737ffa55c7 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h @@ -43,6 +43,14 @@ class DummyNodeExtent final: public NodeExtent { state = extent_state_t::INITIAL_WRITE_PENDING; } ~DummyNodeExtent() override = default; + + void retire() { + assert(state == extent_state_t::INITIAL_WRITE_PENDING); + state = extent_state_t::INVALID; + bufferptr empty_bptr; + get_bptr().swap(empty_bptr); + } + protected: NodeExtentRef mutate(context_t, DeltaRecorderURef&&) override { ceph_abort("impossible path"); } @@ -92,6 +100,20 @@ class DummyNodeExtentManager final: public NodeExtentManager { } } + tm_future<> retire_extent( + Transaction& t, NodeExtentRef extent) override { + logger().trace("OTree::Dummy: retiring {}B at {:#x} ...", + extent->get_length(), extent->get_laddr()); + if constexpr (SYNC) { + return retire_extent_sync(t, extent); + } else { + using namespace std::chrono_literals; + return seastar::sleep(1us).then([this, &t, extent] { + return retire_extent_sync(t, extent); + }); + } + } + tm_future get_super( Transaction& t, RootNodeTracker& tracker) override { logger().trace("OTree::Dummy: get root ..."); @@ -138,6 +160,19 @@ class DummyNodeExtentManager final: public NodeExtentManager { return tm_ertr::make_ready_future(extent); } + tm_future<> retire_extent_sync( + Transaction& t, NodeExtentRef _extent) { + auto& extent = static_cast(*_extent.get()); + auto addr = extent.get_laddr(); + auto len = extent.get_length(); + extent.retire(); + auto iter = allocate_map.find(addr); + assert(iter != allocate_map.end()); + allocate_map.erase(iter); + logger().debug("OTree::Dummy: retired {}B at {:#x}", len, addr); + return tm_ertr::now(); + } + tm_future get_super_sync( Transaction& t, RootNodeTracker& tracker) { logger().debug("OTree::Dummy: got root {:#x}", root_laddr); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h index 815a6a6705a..9e21d1ef8aa 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h @@ -100,6 +100,18 @@ class SeastoreNodeExtentManager final: public NodeExtentManager { }); } + tm_future<> retire_extent( + Transaction& t, NodeExtentRef _extent) override { + LogicalCachedExtentRef extent = _extent; + auto addr = extent->get_laddr(); + auto len = extent->get_length(); + logger().debug("OTree::Seastore: retiring {}B at {:#x} ...", len, addr); + return tm.dec_ref(t, extent).safe_then([addr, len] (unsigned cnt) { + assert(cnt == 0); + logger().trace("OTree::Seastore: retired {}B at {:#x} ...", len, addr); + }); + } + tm_future get_super( Transaction& t, RootNodeTracker& tracker) override { logger().trace("OTree::Seastore: get root ...");