]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: support mark_space_{free, used} on cold_cleaner
authorZhang Song <zhangsong325@gmail.com>
Tue, 10 Jan 2023 10:01:25 +0000 (18:01 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Tue, 23 May 2023 08:09:20 +0000 (08:09 +0000)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
(cherry picked from commit 783c5e7662006c6efca7ade795e6e731b0b18332)

src/crimson/os/seastore/async_cleaner.h
src/crimson/os/seastore/extent_placement_manager.h

index 81abe925a8c9a71199ca6d435a4802e00234310f..e45ad7f63605f781edaa87473d37c21f1826a792 100644 (file)
@@ -1150,6 +1150,8 @@ public:
   using clean_space_ret = clean_space_ertr::future<>;
   virtual clean_space_ret clean_space() = 0;
 
+  virtual const std::set<device_id_t>& get_device_ids() const = 0;
+
   // test only
   virtual bool check_usage() = 0;
 
@@ -1329,6 +1331,10 @@ public:
 
   clean_space_ret clean_space() final;
 
+  const std::set<device_id_t>& get_device_ids() const final {
+    return sm_group->get_device_ids();
+  }
+
   // Testing interfaces
 
   bool check_usage() final;
@@ -1646,6 +1652,10 @@ public:
 
   clean_space_ret clean_space() final;
 
+  const std::set<device_id_t>& get_device_ids() const final {
+    return rb_group->get_device_ids();
+  }
+
   RandomBlockManager* get_rbm(paddr_t paddr) {
     auto rbs = rb_group->get_rb_managers();
     for (auto p : rbs) {
index ab5ffdf7495fcfc4e7729c1976bec99482e0828c..51401e78d12600ee6b047bb6a3b7e51e05d93369 100644 (file)
@@ -474,6 +474,14 @@ private:
       if (_cold_cleaner) {
         cold_cleaner = std::move(_cold_cleaner);
         cold_cleaner->set_background_callback(this);
+
+        cleaners_by_device_id.resize(DEVICE_ID_MAX, nullptr);
+        for (auto id : main_cleaner->get_device_ids()) {
+          cleaners_by_device_id[id] = main_cleaner.get();
+        }
+        for (auto id : cold_cleaner->get_device_ids()) {
+          cleaners_by_device_id[id] = cold_cleaner.get();
+        }
       }
     }
 
@@ -528,24 +536,51 @@ private:
       if (state < state_t::SCAN_SPACE) {
         return;
       }
-      assert(main_cleaner);
-      main_cleaner->mark_space_used(addr, len);
+
+      if (!has_cold_tier()) {
+        assert(main_cleaner);
+        main_cleaner->mark_space_used(addr, len);
+      } else {
+        auto id = addr.get_device_id();
+        assert(id < cleaners_by_device_id.size());
+        auto cleaner = cleaners_by_device_id[id];
+        assert(cleaner);
+        cleaner->mark_space_used(addr, len);
+      }
     }
 
     void mark_space_free(paddr_t addr, extent_len_t len) {
       if (state < state_t::SCAN_SPACE) {
         return;
       }
-      assert(main_cleaner);
-      main_cleaner->mark_space_free(addr, len);
+
+      if (!has_cold_tier()) {
+        assert(main_cleaner);
+        main_cleaner->mark_space_free(addr, len);
+      } else {
+        auto id = addr.get_device_id();
+        assert(id < cleaners_by_device_id.size());
+        auto cleaner = cleaners_by_device_id[id];
+        assert(cleaner);
+        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(main_cleaner);
-      return main_cleaner->commit_space_used(addr, len);
+
+      if (!has_cold_tier()) {
+        assert(main_cleaner);
+        main_cleaner->commit_space_used(addr, len);
+      } else {
+        auto id = addr.get_device_id();
+        assert(id < cleaners_by_device_id.size());
+        auto cleaner = cleaners_by_device_id[id];
+        assert(cleaner);
+        cleaner->commit_space_used(addr, len);
+      }
     }
 
     seastar::future<> reserve_projected_usage(io_usage_t usage);
@@ -664,6 +699,7 @@ private:
      * cold tier (optional, see has_cold_tier())
      */
     AsyncCleanerRef cold_cleaner;
+    std::vector<AsyncCleaner*> cleaners_by_device_id;
 
     std::optional<seastar::future<>> process_join;
     std::optional<seastar::promise<>> blocking_background;