]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: report cached extents usage
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 15 Jul 2021 08:09:51 +0000 (16:09 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Tue, 20 Jul 2021 08:48:27 +0000 (16:48 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cached_extent.h

index 514b92a21eb60c604ee61edb326d11edb963f8a8..9a08b20cc3edae834302907e2e2bf5b48d70da14 100644 (file)
@@ -113,6 +113,13 @@ void Cache::register_metrics()
     {extent_types_t::TEST_BLOCK_PHYSICAL, ext_label("TEST_BLOCK_PHYSICAL")}
   };
 
+  auto counter_label = sm::label("counter");
+  std::map<std::string, sm::label_instance> labels_by_counter {
+    {"EXTENTS",     counter_label("EXTENTS")},
+    {"BYTES",       counter_label("BYTES")},
+    {"DELTA_BYTES", counter_label("DELTA_BYTES")},
+  };
+
   /*
    * trans_created
    */
@@ -350,13 +357,6 @@ void Cache::register_metrics()
       {"FRESH",  effort_label("FRESH")},
     };
 
-    auto counter_label = sm::label("counter");
-    std::map<std::string, sm::label_instance> labels_by_counter {
-      {"EXTENTS", counter_label("EXTENTS")},
-      {"BYTES", counter_label("BYTES")},
-      {"DELTA_BYTES", counter_label("DELTA_BYTES")},
-    };
-
     auto register_effort =
       [this, &labels_by_src, &labels_by_effort, &labels_by_counter]
       (const char* category,
@@ -443,6 +443,31 @@ void Cache::register_metrics()
       register_read_effort_successful(counter_name, value);
     }
   }
+
+  /**
+   * Cached extents (including placeholders)
+   */
+  metrics.add_group(
+    "cache",
+    {
+      sm::make_counter(
+        "cached_extents",
+        [this] {
+          return extents.size();
+        },
+        sm::description("total number of cached extents"),
+        {labels_by_counter.find("EXTENTS")->second}
+      ),
+      sm::make_counter(
+        "cached_extents",
+        [this] {
+          return extents.get_bytes();
+        },
+        sm::description("total bytes of cached extents"),
+        {labels_by_counter.find("BYTES")->second}
+      ),
+    }
+  );
 }
 
 void Cache::add_extent(CachedExtentRef ref)
index 88b446e8597f537ccebe5fd8ccb723ae1dc9af28..1168cb9eb9eaae23ed9f6854b239b2847faa8423 100644 (file)
@@ -532,6 +532,7 @@ public:
 
   void clear() {
     extent_index.clear();
+    bytes = 0;
   }
 
   void insert(CachedExtent &extent) {
@@ -541,17 +542,25 @@ public:
       extent.get_length());
     ceph_assert(a == b);
 
-    extent_index.insert(extent);
+    [[maybe_unused]] auto [iter, inserted] = extent_index.insert(extent);
+    assert(inserted);
     extent.parent_index = this;
+
+    bytes += extent.get_length();
   }
 
   void erase(CachedExtent &extent) {
     assert(extent.parent_index);
-    extent_index.erase(extent);
+    auto erased = extent_index.erase(extent);
     extent.parent_index = nullptr;
+
+    if (erased) {
+      bytes -= extent.get_length();
+    }
   }
 
   void replace(CachedExtent &to, CachedExtent &from) {
+    assert(to.get_length() == from.get_length());
     extent_index.replace_node(extent_index.s_iterator_to(from), to);
     from.parent_index = nullptr;
     to.parent_index = this;
@@ -573,18 +582,21 @@ public:
     return extent_index.end();
   }
 
-  void merge(ExtentIndex &&other) {
-    for (auto it = other.extent_index.begin();
-        it != other.extent_index.end();
-        ) {
-      auto &ext = *it;
-      ++it;
-      other.extent_index.erase(ext);
-      extent_index.insert(ext);
-    }
+  auto size() const {
+    return extent_index.size();
   }
 
-  ~ExtentIndex() { assert(extent_index.empty()); }
+  auto get_bytes() const {
+    return bytes;
+  }
+
+  ~ExtentIndex() {
+    assert(extent_index.empty());
+    assert(bytes == 0);
+  }
+
+private:
+  uint64_t bytes = 0;
 };
 
 class LogicalCachedExtent;