]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: free rbm extent if transaction conflict occurs
authormyoungwon oh <ohmyoungwon@gmail.com>
Sat, 29 Oct 2022 02:20:34 +0000 (11:20 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Wed, 16 Nov 2022 12:08:08 +0000 (21:08 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/async_cleaner.cc
src/crimson/os/seastore/async_cleaner.h
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/extent_placement_manager.h

index 08c755f3ea59f4b5f73b4d9c6d69c6b587202fa2..10c6a9dd222d8f027693769815d6f605304d37af 100644 (file)
@@ -1561,18 +1561,12 @@ void RBMCleaner::mark_space_used(
   paddr_t addr,
   extent_len_t len)
 {
-  // Need to mark the space as used at startup time.
-  // We do not use mark_space_used after complete_commit()
-  // because alloc_extent() already reserved the space.
   assert(addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
-  if (background_callback->get_state() ==
-      BackgroundListener::state_t::SCAN_SPACE) {
-    auto rbms = rb_group->get_rb_managers();
-    for (auto rbm : rbms) {
-      if (addr.get_device_id() == rbm->get_device_id()) {
-       if (rbm->get_start() <= addr) {
-         return rbm->mark_space_used(addr, len);
-       }
+  auto rbms = rb_group->get_rb_managers();
+  for (auto rbm : rbms) {
+    if (addr.get_device_id() == rbm->get_device_id()) {
+      if (rbm->get_start() <= addr) {
+       rbm->mark_space_used(addr, len);
       }
     }
   }
@@ -1593,6 +1587,19 @@ void RBMCleaner::mark_space_free(
   }
 }
 
+void RBMCleaner::commit_space_used(paddr_t addr, extent_len_t len) 
+{
+  auto rbms = rb_group->get_rb_managers();
+  for (auto rbm : rbms) {
+    if (addr.get_device_id() == rbm->get_device_id()) {
+      if (rbm->get_start() <= addr) {
+       rbm->complete_allocation(addr, len);
+      }
+      return;
+    }
+  }
+}
+
 void RBMCleaner::reserve_projected_usage(std::size_t projected_usage)
 {
   assert(background_callback->is_ready());
index 493d881467241229ffea091b30c90567389e1634..b6cab8d60017b0fc7687289d1590830765a26d67 100644 (file)
@@ -850,6 +850,8 @@ public:
 
   virtual void mark_space_free(paddr_t, extent_len_t) = 0;
 
+  virtual void commit_space_used(paddr_t, extent_len_t) = 0;
+
   virtual void reserve_projected_usage(std::size_t) = 0;
 
   virtual void release_projected_usage(std::size_t) = 0;
@@ -1006,6 +1008,10 @@ public:
   void mark_space_used(paddr_t, extent_len_t) final;
 
   void mark_space_free(paddr_t, extent_len_t) final;
+  
+  void commit_space_used(paddr_t addr, extent_len_t len) final {
+    mark_space_used(addr, len);
+  }
 
   void reserve_projected_usage(std::size_t) final;
 
@@ -1333,6 +1339,8 @@ public:
 
   void mark_space_free(paddr_t, extent_len_t) final;
 
+  void commit_space_used(paddr_t, extent_len_t) final;
+
   void reserve_projected_usage(std::size_t) final;
 
   void release_projected_usage(size_t) final;
index 33c3ad35869df100d27515f959f2f2e74da1f295..170e300ca7c4f07266dbadb068e860cb4f319e5b 100644 (file)
@@ -867,6 +867,10 @@ void Cache::mark_transaction_conflicted(
     }
     efforts.mutate_delta_bytes += delta_stat.bytes;
 
+    for (auto &i: t.pre_alloc_list) {
+      epm.mark_space_free(i->get_paddr(), i->get_length());
+    }
+
     auto& ool_stats = t.get_ool_write_stats();
     efforts.fresh_ool_written.increment_stat(ool_stats.extents);
     efforts.num_ool_records += ool_stats.num_records;
@@ -1444,7 +1448,7 @@ void Cache::complete_commit(
     const auto t_src = t.get_src();
     i->invalidate_hints();
     add_extent(i, &t_src);
-    epm.mark_space_used(i->get_paddr(), i->get_length());
+    epm.commit_space_used(i->get_paddr(), i->get_length());
     if (is_backref_mapped_extent_node(i)) {
       DEBUGT("backref_list new {} len {}",
             t,
@@ -1560,6 +1564,12 @@ void Cache::complete_commit(
   if (!backref_list.empty()) {
     backref_batch_update(std::move(backref_list), start_seq);
   }
+
+  for (auto &i: t.pre_alloc_list) {
+    if (!i->is_valid()) {
+      epm.mark_space_free(i->get_paddr(), i->get_length());
+    }
+  }
 }
 
 void Cache::init()
index 0283abfb172fb6c26383ea1170cf50d33d1078fd..d6eaa975b27bf10aa4e221f380a79dbe49e97126 100644 (file)
@@ -297,6 +297,10 @@ public:
     background_process.mark_space_free(addr, len);
   }
 
+  void commit_space_used(paddr_t addr, extent_len_t len) {
+    return background_process.commit_space_used(addr, len);
+  }
+
   seastar::future<> reserve_projected_usage(std::size_t projected_usage) {
     return background_process.reserve_projected_usage(projected_usage);
   }
@@ -409,6 +413,14 @@ private:
       cleaner->mark_space_free(addr, len);
     }
 
+    void commit_space_used(paddr_t addr, extent_len_t len) {
+      if (state < state_t::SCAN_SPACE) {
+        return;
+      }
+      assert(cleaner);
+      return cleaner->commit_space_used(addr, len);
+    }
+
     seastar::future<> reserve_projected_usage(std::size_t projected_usage);
 
     void release_projected_usage(std::size_t projected_usage) {