From 4e8a1a88959d69ef32f470ed82236c81a39e4102 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 12 Oct 2024 18:07:45 +0300 Subject: [PATCH] Run partprobe in add_partition() if /dev/disk/by-partuuid symlink is not present --- src/disk_tool/disk_tool_prepare.cpp | 16 ++++++++++++---- src/disk_tool/disk_tool_utils.cpp | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/disk_tool/disk_tool_prepare.cpp b/src/disk_tool/disk_tool_prepare.cpp index 1573555c..56308e9a 100644 --- a/src/disk_tool/disk_tool_prepare.cpp +++ b/src/disk_tool/disk_tool_prepare.cpp @@ -328,7 +328,7 @@ json11::Json disk_tool_t::add_partitions(vitastor_dev_info_t & devinfo, std::vec script += "+ "+size+" "+std::string(VITASTOR_PART_TYPE)+"\n"; } std::string out; - if (shell_exec({ "sfdisk", "--no-reread", "--force", devinfo.path }, script, &out, NULL) != 0) + if (shell_exec({ "sfdisk", "--no-reread", "--no-tell-kernel", "--force", devinfo.path }, script, &out, NULL) != 0) { fprintf(stderr, "Failed to add %zu partition(s) with sfdisk\n", sizes.size()); return {}; @@ -355,8 +355,9 @@ json11::Json disk_tool_t::add_partitions(vitastor_dev_info_t & devinfo, std::vec { for (const auto & part: new_parts) { + std::string link_path = "/dev/disk/by-partuuid/"+strtolower(part["uuid"].string_value()); struct stat st; - if (stat(part["node"].string_value().c_str(), &st) < 0) + if (lstat(link_path.c_str(), &st) < 0) { if (errno == ENOENT) { @@ -377,7 +378,7 @@ json11::Json disk_tool_t::add_partitions(vitastor_dev_info_t & devinfo, std::vec } else { - fprintf(stderr, "Failed to lstat %s: %s\n", part["node"].string_value().c_str(), strerror(errno)); + fprintf(stderr, "Failed to lstat %s: %s\n", link_path.c_str(), strerror(errno)); return {}; } } @@ -386,8 +387,9 @@ json11::Json disk_tool_t::add_partitions(vitastor_dev_info_t & devinfo, std::vec } // Wait until device symlinks in /dev/disk/by-partuuid/ appear bool exists = false; + const int max_iter = 300; // max 30 sec iter = 0; - while (!exists && iter < 300) // max 30 sec + while (!exists && iter < max_iter) { exists = true; for (const auto & part: new_parts) @@ -397,7 +399,13 @@ json11::Json disk_tool_t::add_partitions(vitastor_dev_info_t & devinfo, std::vec if (lstat(link_path.c_str(), &st) < 0) { if (errno == ENOENT) + { exists = false; + if (iter == 4) + { + fprintf(stderr, "Waiting for %s to appear for up to %d sec...\n", link_path.c_str(), max_iter/10); + } + } else { fprintf(stderr, "Failed to lstat %s: %s\n", link_path.c_str(), strerror(errno)); diff --git a/src/disk_tool/disk_tool_utils.cpp b/src/disk_tool/disk_tool_utils.cpp index 06022297..408eeef5 100644 --- a/src/disk_tool/disk_tool_utils.cpp +++ b/src/disk_tool/disk_tool_utils.cpp @@ -377,7 +377,7 @@ int fix_partition_type(std::string dev_by_uuid) script += "\n"; } std::string out; - return shell_exec({ "sfdisk", "--no-reread", "--force", parent_dev }, script, &out, NULL); + return shell_exec({ "sfdisk", "--no-reread", "--no-tell-kernel", "--force", parent_dev }, script, &out, NULL); } std::string csum_type_str(uint32_t data_csum_type)