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;
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"); }
}
}
+ 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 ...");
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);
});
}
+ 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 ...");