]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/ceph-bluestore-tool: be more legible before requesting additional params
authorIgor Fedotov <ifedotov@suse.com>
Fri, 19 Feb 2021 11:23:00 +0000 (14:23 +0300)
committerIgor Fedotov <ifed@suse.com>
Fri, 16 Jul 2021 12:53:54 +0000 (15:53 +0300)
Request DB/WAL size specification when relevant devices are created
only.

Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit 94a91f54fe30a4dd113fbc1b02bc3f3d52c82a92)

src/os/bluestore/bluestore_tool.cc

index 2dc1016c38edd4a886f97cb462cf4e1253bd8877..f38209504ade3f85403d62899188a7cc827068cc 100644 (file)
@@ -676,6 +676,7 @@ int main(int argc, char **argv)
 
     parse_devices(cct.get(), devs, &cur_devs_map, &has_db, &has_wal);
 
+    const char* rlpath = nullptr;
     if (has_db && has_wal) {
       cerr << "can't allocate new device, both WAL and DB exist"
            << std::endl;
@@ -689,24 +690,32 @@ int main(int argc, char **argv)
            << std::endl;
       exit(EXIT_FAILURE);
     } else if(!dev_target.empty() &&
-             realpath(dev_target.c_str(), target_path) == nullptr) {
+             (rlpath = realpath(dev_target.c_str(), target_path)) == nullptr) {
       cerr << "failed to retrieve absolute path for " << dev_target
            << ": " << cpp_strerror(errno)
            << std::endl;
       exit(EXIT_FAILURE);
     }
 
-    // Create either DB or WAL volume
-    int r = EXIT_FAILURE;
-    if (need_db && cct->_conf->bluestore_block_db_size == 0) {
-      cerr << "DB size isn't specified, "
-              "please set Ceph bluestore-block-db-size config parameter "
-           << std::endl;
-    } else if (!need_db && cct->_conf->bluestore_block_wal_size == 0) {
-      cerr << "WAL size isn't specified, "
-              "please set Ceph bluestore-block-wal-size config parameter "
-           << std::endl;
-    } else {
+    // Attach either DB or WAL volume, create if needed
+    struct stat st;
+    int r = ::stat(rlpath, &st);
+    // check if we need additional size specification
+    if (r == ENOENT || (r == 0 && S_ISREG(st.st_mode) && st.st_size == 0)) {
+      r = 0;
+      if (need_db && cct->_conf->bluestore_block_db_size == 0) {
+       cerr << "Might need DB size specification, "
+               "please set Ceph bluestore-block-db-size config parameter "
+            << std::endl;
+       r = EXIT_FAILURE;
+      } else if (!need_db && cct->_conf->bluestore_block_wal_size == 0) {
+       cerr << "Might need WAL size specification, "
+               "please set Ceph bluestore-block-wal-size config parameter "
+            << std::endl;
+       r = EXIT_FAILURE;
+      }
+    }
+    if (r == 0) {
       BlueStore bluestore(cct.get(), path);
       r = bluestore.add_new_bluefs_device(
         need_db ? BlueFS::BDEV_NEWDB : BlueFS::BDEV_NEWWAL,
@@ -719,8 +728,8 @@ int main(int argc, char **argv)
              << cpp_strerror(r)
              << std::endl;
       }
-      return r;
     }
+    return r;
   } else if (action == "bluefs-bdev-migrate") {
     map<string, int> cur_devs_map;
     set<int> src_dev_ids;