crimson/onode-staged-tree: implement NodeExtentManager::retire_extent()

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
This commit is contained in:
Yingxin Cheng 2021-03-18 16:35:21 +08:00
parent 776390d249
commit 5d41bda16e
3 changed files with 48 additions and 0 deletions

View File

@ -72,6 +72,7 @@ class NodeExtentManager {
virtual tm_future<NodeExtentRef> read_extent(
Transaction&, laddr_t, extent_len_t) = 0;
virtual tm_future<NodeExtentRef> alloc_extent(Transaction&, extent_len_t) = 0;
virtual tm_future<> retire_extent(Transaction&, NodeExtentRef) = 0;
virtual tm_future<Super::URef> get_super(Transaction&, RootNodeTracker&) = 0;
virtual std::ostream& print(std::ostream& os) const = 0;

View File

@ -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<Super::URef> 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<NodeExtentRef>(extent);
}
tm_future<> retire_extent_sync(
Transaction& t, NodeExtentRef _extent) {
auto& extent = static_cast<DummyNodeExtent&>(*_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<Super::URef> get_super_sync(
Transaction& t, RootNodeTracker& tracker) {
logger().debug("OTree::Dummy: got root {:#x}", root_laddr);

View File

@ -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<Super::URef> get_super(
Transaction& t, RootNodeTracker& tracker) override {
logger().trace("OTree::Seastore: get root ...");