From: Sage Weil Date: Mon, 16 Oct 2017 22:45:54 +0000 (-0500) Subject: ceph-bluestore-tool: implement 'set-label-key' and 'rm-label-key' X-Git-Tag: v13.0.1~508^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4b468c989f9e8609e7f640cfa4385c454ae6dc17;p=ceph-ci.git ceph-bluestore-tool: implement 'set-label-key' and 'rm-label-key' Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/bluestore_tool.cc b/src/os/bluestore/bluestore_tool.cc index c9a1ff2c432..8f057c3917d 100644 --- a/src/os/bluestore/bluestore_tool.cc +++ b/src/os/bluestore/bluestore_tool.cc @@ -130,6 +130,7 @@ int main(int argc, char **argv) string path; string action; string log_file; + string key, value; int log_level = 30; bool fsck_deep = false; po::options_description po_options("Options"); @@ -141,10 +142,12 @@ int main(int argc, char **argv) ("log-level", po::value(&log_level), "log level (30=most, 20=lots, 10=some, 1=little)") ("dev", po::value>(&devs), "device(s)") ("deep", po::value(&fsck_deep), "deep fsck (read all data)") + ("key,k", po::value(&key), "label metadata key name") + ("value,v", po::value(&value), "label metadata value") ; po::options_description po_positional("Positional options"); po_positional.add_options() - ("command", po::value(&action), "fsck, repair, bluefs-export, bluefs-bdev-sizes, bluefs-bdev-expand, show-label, prime-osd-dir") + ("command", po::value(&action), "fsck, repair, bluefs-export, bluefs-bdev-sizes, bluefs-bdev-expand, show-label, set-label-key, rm-label-key, prime-osd-dir") ; po::options_description po_all("All options"); po_all.add(po_options).add(po_positional); @@ -190,6 +193,21 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } } + if (action == "set-label-key" || + action == "rm-label-key") { + if (devs.size() != 1) { + cerr << "must specify the main bluestore device" << std::endl; + exit(EXIT_FAILURE); + } + if (key.size() == 0) { + cerr << "must specify a key name with -k" << std::endl; + exit(EXIT_FAILURE); + } + if (action == "set-label-key" && value.size() == 0) { + cerr << "must specify a value with -v" << std::endl; + exit(EXIT_FAILURE); + } + } if (action == "show-label") { if (devs.empty() && path.empty()) { cerr << "must specify bluestore path *or* raw device(s)" << std::endl; @@ -358,6 +376,42 @@ int main(int argc, char **argv) jf.close_section(); jf.flush(cout); } + else if (action == "set-label-key") { + bluestore_bdev_label_t label; + int r = BlueStore::_read_bdev_label(cct.get(), devs.front(), &label); + if (r < 0) { + cerr << "unable to read label for " << devs.front() << ": " + << cpp_strerror(r) << std::endl; + exit(EXIT_FAILURE); + } + label.meta[key] = value; + r = BlueStore::_write_bdev_label(cct.get(), devs.front(), label); + if (r < 0) { + cerr << "unable to write label for " << devs.front() << ": " + << cpp_strerror(r) << std::endl; + exit(EXIT_FAILURE); + } + } + else if (action == "rm-label-key") { + bluestore_bdev_label_t label; + int r = BlueStore::_read_bdev_label(cct.get(), devs.front(), &label); + if (r < 0) { + cerr << "unable to read label for " << devs.front() << ": " + << cpp_strerror(r) << std::endl; + exit(EXIT_FAILURE); + } + if (!label.meta.count(key)) { + cerr << "key '" << key << "' not present" << std::endl; + exit(EXIT_FAILURE); + } + label.meta.erase(key); + r = BlueStore::_write_bdev_label(cct.get(), devs.front(), label); + if (r < 0) { + cerr << "unable to write label for " << devs.front() << ": " + << cpp_strerror(r) << std::endl; + exit(EXIT_FAILURE); + } + } else if (action == "bluefs-bdev-sizes") { BlueFS *fs = open_bluefs(cct.get(), path, devs); fs->dump_block_extents(cout);