From 38ba41ebfb3519fcde3095a37a75fb7f2f53c2b5 Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Tue, 23 Jan 2024 12:31:53 +0000 Subject: [PATCH] os/bluestore: Make read_meta / write_meta cached Modified read_meta and write_meta to keep current bdev_label cached, instead of reading it all over again. Signed-off-by: Adam Kupczyk (cherry picked from commit 22c3eb548bf6270e28ee07891c4cecfa3514d4e1) --- src/os/bluestore/BlueStore.cc | 33 +++++++++++++++++++-------------- src/os/bluestore/BlueStore.h | 4 ++++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index f8ab4720b64..72681123381 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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; diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 95c30307ab6..d29531a021e 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2439,6 +2439,10 @@ private: double max_defer_interval = 0; ///< Time to wait between last deferred submit std::atomic 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 osd_pools_map; ceph::mutex vstatfs_lock = ceph::make_mutex("BlueStore::vstatfs_lock"); -- 2.39.5