]> 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 <ifedotov@suse.com>
Thu, 3 Jun 2021 10:30:06 +0000 (13:30 +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 fc33289bf98ee659c2317c52767bbfc9bde004ab..a7300255154fdd6fc577a2853e67d76cfe873ce5 100644 (file)
@@ -675,6 +675,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;
@@ -688,24 +689,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,
@@ -718,8 +727,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;