]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: delay determination of default pool name
authorJason Dillaman <dillaman@redhat.com>
Tue, 4 Aug 2020 18:03:59 +0000 (14:03 -0400)
committerMykola Golub <mgolub@suse.com>
Mon, 14 Jun 2021 12:14:31 +0000 (15:14 +0300)
Wait until after the CLI has connected to the cluster and therefore
has received all global configuration overrides.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 96f05a7956b3d554e06330c6bb5743a6329d1c44)

src/tools/rbd/Schedule.cc
src/tools/rbd/Schedule.h
src/tools/rbd/Utils.cc
src/tools/rbd/Utils.h
src/tools/rbd/action/Migration.cc
src/tools/rbd/action/MirrorSnapshotSchedule.cc
src/tools/rbd/action/Perf.cc
src/tools/rbd/action/TrashPurgeSchedule.cc

index 596408199ee23543a4fc0d52c7120397f9c6ff8c..d7fcf1253deb6b95a05428777eb8e220892fc48f 100644 (file)
@@ -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<std::string>();
-    } 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<std::string>();
-    } else {
-      pool_name = utils::get_default_pool_name();
     }
 
     namespace_name = vm[at::NAMESPACE_NAME].as<std::string>();
@@ -142,6 +138,20 @@ int get_level_spec_args(const po::variables_map &vm,
   return 0;
 }
 
+void normalize_level_spec_args(std::map<std::string, std::string> *args) {
+  std::map<std::string, std::string> 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");
index c92b9357a3d5606246905caf6b5976ad3f4626ba..90e78eb7f682c734cfd6d4ca0f17b2ebf058c931 100644 (file)
@@ -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<std::string, std::string> *args);
+void normalize_level_spec_args(std::map<std::string, std::string> *args);
+
 void add_schedule_options(
   boost::program_options::options_description *positional);
 int get_schedule_args(const boost::program_options::variables_map &vm,
index 69cb7c6baec3d5da9c29b0158cc32a64f04de6b6..f397ea50e2cdf2d54189e4a49e5aee3431f3acea 100644 (file)
@@ -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<std::string>("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<bool>("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)) {
@@ -697,8 +691,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()) {
index 14e46d5c47886ec8c06ce3e68135a78300990120..476c229bec0e0b78f2e29e85cb9c3e7fe0f5a344 100644 (file)
@@ -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,
@@ -154,9 +156,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::stringpool_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);
 
index d47801ef76c598fb514466625c615a16816e63c1..5a929a75939d2adde2a679e476b87b623bcb4cea 100644 (file)
@@ -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 :
index f8dbb5ec6b2d5fe083634d6ed3623d5a215ce77a..af684944017d118d13e235874c154471443351ba 100644 (file)
@@ -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);
index 64e9fd21067da05590399ac72451b3c165c274bc..86df223dc751bf65b34dcd40b39b8bfa4fdc5678 100644 (file)
@@ -617,6 +617,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
@@ -679,6 +680,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) {
index b6282f91e063c05fb08a4d9b6890c6524cc57b92..f090754c4b9713e5e1d153d6426a5fdebfec78d6 100644 (file)
@@ -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);