]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/ceph-bluestore-tool: Modify show-label for many devs 60543/head
authorAdam Kupczyk <akupczyk@ibm.com>
Fri, 11 Oct 2024 08:21:35 +0000 (08:21 +0000)
committerAdam Kupczyk <akupczyk@ibm.com>
Tue, 29 Oct 2024 15:07:44 +0000 (15:07 +0000)
It was possible to give multiple devices to cbt:
> ceph-bluestore-tool show-label --dev /dev/sda --dev /dev/sdb

But is any of devices cannot provide valid label, nothing was printed.

Now, always print results. Non readable labels are output as empty dictionaries.
Exit code:
- 0 if any label properly read
- 1 if all labels failed

Fixes: https://tracker.ceph.com/issues/68680
Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
(cherry picked from commit 8ebcb2dd46e5dc37a3e1ff6cc073351c4a2b5760)

src/os/bluestore/bluestore_tool.cc

index 44129db6785b2ee07889ec52c4ac87687efb3eea..b3636b5b5c2731eb04a6306d5daa9703e3ec0a17 100644 (file)
@@ -696,20 +696,25 @@ int main(int argc, char **argv)
   else if (action == "show-label") {
     JSONFormatter jf(true);
     jf.open_object_section("devices");
+    bool any_success = false;
     for (auto& i : devs) {
+      jf.open_object_section(i.c_str());
       bluestore_bdev_label_t label;
       int r = BlueStore::read_bdev_label(cct.get(), i, &label);
       if (r < 0) {
-       cerr << "unable to read label for " << i << ": "
-            << cpp_strerror(r) << std::endl;
-       exit(EXIT_FAILURE);
+        cerr << "unable to read label for " << i << ": "
+             << cpp_strerror(r) << std::endl;
+      } else {
+        any_success = true;
+        label.dump(&jf);
       }
-      jf.open_object_section(i.c_str());
-      label.dump(&jf);
       jf.close_section();
     }
     jf.close_section();
     jf.flush(cout);
+    if (!any_success) {
+      exit(EXIT_FAILURE);
+    }
   }
   else if (action == "set-label-key") {
     bluestore_bdev_label_t label;