From 35b835c082001f486411b7868fa3be1792c1d579 Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Fri, 12 Jul 2024 08:04:41 +0000 Subject: [PATCH] os/bluestore: Modify read_meta() When bdev is not opened, do not fallback to file-backed values immediately. First try to open temporary open bdev. Signed-off-by: Adam Kupczyk (cherry picked from commit 811f2979f53201d7bf296e11e7ea62e493abe471) --- src/os/bluestore/BlueStore.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 74f0f5845ec6d..0f659d951b55a 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6029,13 +6029,29 @@ int BlueStore::write_meta(const std::string& key, const std::string& value) int BlueStore::read_meta(const std::string& key, std::string *value) { - if (!bdev || !bdev->supported_bdev_label()) { + BlockDevice* local_bdev = bdev; + auto close_bdev = make_scope_guard([&] { + if (!bdev && local_bdev) { + local_bdev->close(); + delete local_bdev; + } + }); + if (!local_bdev) { + string p = path + "/block"; + local_bdev = BlockDevice::create(cct, p, nullptr, nullptr, nullptr, nullptr); + int r = local_bdev->open(p); + if (r < 0) { + delete local_bdev; + local_bdev = nullptr; + } + } + if (!local_bdev || !local_bdev->supported_bdev_label()) { // skip bdev label section if not supported return ObjectStore::read_meta(key, value); } string p = path + "/block"; if (bdev_label_valid_locations.empty()) { - _read_multi_bdev_label(cct, bdev, p, fsid, &bdev_label, &bdev_label_valid_locations, + _read_multi_bdev_label(cct, local_bdev, p, fsid, &bdev_label, &bdev_label_valid_locations, &bdev_label_multi, &bdev_label_epoch); } if (!bdev_label_valid_locations.empty()) { -- 2.39.5