]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: implement NodeExtentManager::retire_extent()
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 18 Mar 2021 08:35:21 +0000 (16:35 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 29 Apr 2021 08:03:37 +0000 (16:03 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h

index 601261958a027ab3857d6f7332dd1ed53a8d1767..76b0828a1360c2376de91e1adc5c925e8f5b5247 100644 (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;
 
index 830ea4a7db80e9658357d96060fa117d6fe2020b..e737ffa55c7fe89284ec0ba0f6edbec02e23dc29 100644 (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);
index 815a6a6705aa9582d570b7c79f1a92e2b8cb8e49..9e21d1ef8aa925a6b64d8aeb72e22e2e8fb77351 100644 (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 ...");