]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Make read_meta / write_meta cached
authorAdam Kupczyk <akupczyk@ibm.com>
Tue, 23 Jan 2024 12:31:53 +0000 (12:31 +0000)
committerPere Diaz Bou <pere-altea@hotmail.com>
Fri, 23 Aug 2024 09:49:23 +0000 (11:49 +0200)
Modified read_meta and write_meta to keep current bdev_label cached,
instead of reading it all over again.

Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
(cherry picked from commit 22c3eb548bf6270e28ee07891c4cecfa3514d4e1)

src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index f8ab4720b649efb0676130730375e30bbb6e25ca..72681123381e05a8338d1048197aed571f32ba50 100644 (file)
@@ -5994,28 +5994,33 @@ int BlueStore::_set_cache_sizes()
 
 int BlueStore::write_meta(const std::string& key, const std::string& value)
 {
-  bluestore_bdev_label_t label;
   string p = path + "/block";
-  int r = _read_bdev_label(cct, p, &label);
-  if (r < 0) {
-    return ObjectStore::write_meta(key, value);
+  if (!bdev_label_valid) {
+    int r = _read_bdev_label(cct, p, &bdev_label);
+    if (r == 0) {
+      bdev_label_valid = true;
+    }
+  }
+  if (bdev_label_valid) {
+    bdev_label.meta[key] = value;
+    int r = _write_bdev_label(cct, p, bdev_label);
+    ceph_assert(r == 0);
   }
-  label.meta[key] = value;
-  r = _write_bdev_label(cct, p, label);
-  ceph_assert(r == 0);
   return ObjectStore::write_meta(key, value);
 }
 
 int BlueStore::read_meta(const std::string& key, std::string *value)
 {
-  bluestore_bdev_label_t label;
-  string p = path + "/block";
-  int r = _read_bdev_label(cct, p, &label);
-  if (r < 0) {
-    return ObjectStore::read_meta(key, value);
+  if (!bdev_label_valid) {
+    string p = path + "/block";
+    int r = _read_bdev_label(cct, p, &bdev_label);
+    if (r < 0) {
+      return ObjectStore::read_meta(key, value);
+    }
+    bdev_label_valid = true;
   }
-  auto i = label.meta.find(key);
-  if (i == label.meta.end()) {
+  auto i = bdev_label.meta.find(key);
+  if (i == bdev_label.meta.end()) {
     return ObjectStore::read_meta(key, value);
   }
   *value = i->second;
index 95c30307ab64b67e24bd5d07fb1d29c5a15e9fec..d29531a021e9361b17e08b3b57f4a7a35caec249 100644 (file)
@@ -2439,6 +2439,10 @@ private:
   double max_defer_interval = 0; ///< Time to wait between last deferred submit
   std::atomic<uint32_t> config_changed = {0}; ///< Counter to determine if there is a configuration change.
 
+  // caching of bdev_label
+  bool                   bdev_label_valid = false; // indicator if
+  bluestore_bdev_label_t bdev_label;               // this value is valid
+
   typedef std::map<uint64_t, volatile_statfs> osd_pools_map;
 
   ceph::mutex vstatfs_lock = ceph::make_mutex("BlueStore::vstatfs_lock");