]> git.apps.os.sepia.ceph.com Git - ceph-ci.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)
committerZhang Song <zhangsong325@gmail.com>
Wed, 15 Mar 2023 01:22:33 +0000 (09:22 +0800)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/crimson/os/seastore/async_cleaner.h
src/crimson/os/seastore/extent_placement_manager.h

index 599db2ae03243209eb5292fd66cccebc4868db22..c1787d302b3668041580ffa5cba3eba25dc6a07c 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;
@@ -1643,6 +1649,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;