From 96f05a7956b3d554e06330c6bb5743a6329d1c44 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 4 Aug 2020 14:03:59 -0400 Subject: [PATCH] rbd: delay determination of default pool name Wait until after the CLI has connected to the cluster and therefore has received all global configuration overrides. Signed-off-by: Jason Dillaman --- src/tools/rbd/Schedule.cc | 18 ++++++++++---- src/tools/rbd/Schedule.h | 2 ++ src/tools/rbd/Utils.cc | 24 ++++++++----------- src/tools/rbd/Utils.h | 6 +++-- src/tools/rbd/action/Migration.cc | 11 ++++----- .../rbd/action/MirrorSnapshotSchedule.cc | 4 ++++ src/tools/rbd/action/Perf.cc | 2 ++ src/tools/rbd/action/TrashPurgeSchedule.cc | 4 ++++ 8 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/tools/rbd/Schedule.cc b/src/tools/rbd/Schedule.cc index 596408199ee..d7fcf1253de 100644 --- a/src/tools/rbd/Schedule.cc +++ b/src/tools/rbd/Schedule.cc @@ -95,8 +95,6 @@ int get_level_spec_args(const po::variables_map &vm, if (vm.count(at::POOL_NAME)) { pool_name = vm[at::POOL_NAME].as(); - } else if (pool_name.empty()) { - pool_name = utils::get_default_pool_name(); } if (vm.count(at::NAMESPACE_NAME)) { @@ -118,8 +116,6 @@ int get_level_spec_args(const po::variables_map &vm, if (vm.count(at::POOL_NAME)) { pool_name = vm[at::POOL_NAME].as(); - } else { - pool_name = utils::get_default_pool_name(); } namespace_name = vm[at::NAMESPACE_NAME].as(); @@ -142,6 +138,20 @@ int get_level_spec_args(const po::variables_map &vm, return 0; } +void normalize_level_spec_args(std::map *args) { + std::map raw_args; + std::swap(raw_args, *args); + + auto default_pool_name = utils::get_default_pool_name(); + for (auto [key, value] : raw_args) { + if (key == "level_spec" && !value.empty() && value[0] == '/') { + value = default_pool_name + value; + } + + (*args)[key] = value; + } +} + void add_schedule_options(po::options_description *positional) { positional->add_options() ("interval", "schedule interval"); diff --git a/src/tools/rbd/Schedule.h b/src/tools/rbd/Schedule.h index c92b9357a3d..90e78eb7f68 100644 --- a/src/tools/rbd/Schedule.h +++ b/src/tools/rbd/Schedule.h @@ -20,6 +20,8 @@ void add_level_spec_options( boost::program_options::options_description *options, bool allow_image=true); int get_level_spec_args(const boost::program_options::variables_map &vm, std::map *args); +void normalize_level_spec_args(std::map *args); + void add_schedule_options( boost::program_options::options_description *positional); int get_schedule_args(const boost::program_options::variables_map &vm, diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index e9497fbe417..67df7030e1a 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -183,6 +183,12 @@ std::string get_positional_argument(const po::variables_map &vm, size_t index) { return ""; } +void normalize_pool_name(std::string* pool_name) { + if (pool_name->empty()) { + *pool_name = get_default_pool_name(); + } +} + std::string get_default_pool_name() { return g_ceph_context->_conf.get_val("rbd_default_pool"); } @@ -211,10 +217,6 @@ int get_pool_and_namespace_names( } } - if (default_empty_pool_name && pool_name->empty()) { - *pool_name = get_default_pool_name(); - } - if (!g_ceph_context->_conf.get_val("rbd_validate_names")) { validate_pool_name = false; } @@ -261,10 +263,6 @@ int get_pool_image_id(const po::variables_map &vm, } } - if (pool_name != nullptr && pool_name->empty()) { - *pool_name = get_default_pool_name(); - } - if (image_id != nullptr && image_id->empty()) { std::cerr << "rbd: image id was not specified" << std::endl; return -EINVAL; @@ -350,10 +348,6 @@ int get_pool_generic_snapshot_names(const po::variables_map &vm, } } - if (pool_name != nullptr && pool_name->empty()) { - *pool_name = get_default_pool_name(); - } - if (generic_name != nullptr && generic_name_required && generic_name->empty()) { std::string prefix = at::get_description_prefix(mod); @@ -363,7 +357,7 @@ int get_pool_generic_snapshot_names(const po::variables_map &vm, return -EINVAL; } - std::regex pattern("^[^@/]+?$"); + std::regex pattern("^[^@/]*?$"); if (spec_validation == SPEC_VALIDATION_FULL) { // validate pool name while creating/renaming/copying/cloning/importing/etc if ((pool_name != nullptr) && !std::regex_match (*pool_name, pattern)) { @@ -713,8 +707,10 @@ int init(const std::string &pool_name, const std::string& namespace_name, return 0; } -int init_io_ctx(librados::Rados &rados, const std::string &pool_name, +int init_io_ctx(librados::Rados &rados, std::string pool_name, const std::string& namespace_name, librados::IoCtx *io_ctx) { + normalize_pool_name(&pool_name); + int r = rados.ioctx_create(pool_name.c_str(), *io_ctx); if (r < 0) { if (r == -ENOENT && pool_name == get_default_pool_name()) { diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index 94500340613..a3f9baac7d3 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -99,7 +99,9 @@ int extract_spec(const std::string &spec, std::string *pool_name, std::string get_positional_argument( const boost::program_options::variables_map &vm, size_t index); +void normalize_pool_name(std::string* pool_name); std::string get_default_pool_name(); + int get_pool_and_namespace_names( const boost::program_options::variables_map &vm, bool default_empty_pool_name, bool validate_pool_name, @@ -157,9 +159,9 @@ void init_context(); int init_rados(librados::Rados *rados); -int init(const std::string &pool_name, const std::string& namespace_name, +int init(const std::string& pool_name, const std::string& namespace_name, librados::Rados *rados, librados::IoCtx *io_ctx); -int init_io_ctx(librados::Rados &rados, const std::string &pool_name, +int init_io_ctx(librados::Rados &rados, std::string pool_name, const std::string& namespace_name, librados::IoCtx *io_ctx); int set_namespace(const std::string& namespace_name, librados::IoCtx *io_ctx); diff --git a/src/tools/rbd/action/Migration.cc b/src/tools/rbd/action/Migration.cc index d47801ef76c..5a929a75939 100644 --- a/src/tools/rbd/action/Migration.cc +++ b/src/tools/rbd/action/Migration.cc @@ -189,12 +189,11 @@ int execute_prepare(const po::variables_map &vm, } librados::IoCtx dest_io_ctx; - if (!dest_pool_name.empty()) { - r = utils::init_io_ctx(rados, dest_pool_name, dest_namespace_name, - &dest_io_ctx); - if (r < 0) { - return r; - } + utils::normalize_pool_name(&dest_pool_name); + r = utils::init_io_ctx(rados, dest_pool_name, dest_namespace_name, + &dest_io_ctx); + if (r < 0) { + return r; } r = do_prepare(io_ctx, image_name, dest_pool_name.empty() ? io_ctx : diff --git a/src/tools/rbd/action/MirrorSnapshotSchedule.cc b/src/tools/rbd/action/MirrorSnapshotSchedule.cc index f8dbb5ec6b2..af684944017 100644 --- a/src/tools/rbd/action/MirrorSnapshotSchedule.cc +++ b/src/tools/rbd/action/MirrorSnapshotSchedule.cc @@ -143,6 +143,7 @@ int execute_add(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); r = utils::mgr_command(rados, "rbd mirror snapshot schedule add", args, &std::cout, &std::cerr); if (r < 0) { @@ -177,6 +178,7 @@ int execute_remove(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); r = utils::mgr_command(rados, "rbd mirror snapshot schedule remove", args, &std::cout, &std::cerr); if (r < 0) { @@ -215,6 +217,7 @@ int execute_list(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); std::stringstream out; r = utils::mgr_command(rados, "rbd mirror snapshot schedule list", args, &out, &std::cerr); @@ -279,6 +282,7 @@ int execute_status(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); std::stringstream out; r = utils::mgr_command(rados, "rbd mirror snapshot schedule status", args, &out, &std::cerr); diff --git a/src/tools/rbd/action/Perf.cc b/src/tools/rbd/action/Perf.cc index c3012102159..c38e0278065 100644 --- a/src/tools/rbd/action/Perf.cc +++ b/src/tools/rbd/action/Perf.cc @@ -621,6 +621,7 @@ int execute_iostat(const po::variables_map &vm, return r; } + utils::normalize_pool_name(&pool); std::string pool_spec = format_pool_spec(pool, pool_namespace); // no point to refreshing faster than the stats period @@ -684,6 +685,7 @@ int execute_iotop(const po::variables_map &vm, return r; } + utils::normalize_pool_name(&pool); iotop::MainWindow mainWindow(rados, format_pool_spec(pool, pool_namespace)); r = mainWindow.run(); if (r < 0) { diff --git a/src/tools/rbd/action/TrashPurgeSchedule.cc b/src/tools/rbd/action/TrashPurgeSchedule.cc index b6282f91e06..f090754c4b9 100644 --- a/src/tools/rbd/action/TrashPurgeSchedule.cc +++ b/src/tools/rbd/action/TrashPurgeSchedule.cc @@ -173,6 +173,7 @@ int execute_add(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); r = utils::mgr_command(rados, "rbd trash purge schedule add", args, &std::cout, &std::cerr); if (r < 0) { @@ -207,6 +208,7 @@ int execute_remove(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); r = utils::mgr_command(rados, "rbd trash purge schedule remove", args, &std::cout, &std::cerr); if (r < 0) { @@ -245,6 +247,7 @@ int execute_list(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); std::stringstream out; r = utils::mgr_command(rados, "rbd trash purge schedule list", args, &out, &std::cerr); @@ -309,6 +312,7 @@ int execute_status(const po::variables_map &vm, return r; } + normalize_level_spec_args(&args); std::stringstream out; r = utils::mgr_command(rados, "rbd trash purge schedule status", args, &out, &std::cerr); -- 2.39.5