diff --git a/data_substrate b/data_substrate index 887e352a..dc37e861 160000 --- a/data_substrate +++ b/data_substrate @@ -1 +1 @@ -Subproject commit 887e352ac7a00b782e1ed444e75277613c56c75b +Subproject commit dc37e861e4b3ffbcc3eb320754c62c889f325126 diff --git a/src/tools/eloqkv2rdb/eloqkv2rdb.cpp b/src/tools/eloqkv2rdb/eloqkv2rdb.cpp index 45aac4d4..543ad72a 100644 --- a/src/tools/eloqkv2rdb/eloqkv2rdb.cpp +++ b/src/tools/eloqkv2rdb/eloqkv2rdb.cpp @@ -19,8 +19,10 @@ * . * */ +#include #include #include +#include #include #include #include @@ -64,7 +66,6 @@ #include #include -#include #include #endif extern "C" @@ -818,6 +819,66 @@ struct ParseWorker std::thread thd_; }; +// Parses a human-readable size string ("512KB", "1MB", "2GB", "1TB") into a +// byte count. Shared by both the cloud and non-cloud RDB writers as the +// write-buffer flush threshold, so it must be available regardless of +// ROCKSDB_CLOUD_EXPORT. +inline bool ParseSizeBytes(const std::string &size_str, uint64_t &bytes) +{ + if (size_str.size() <= 2) + { + return false; + } + + std::string number_part = size_str.substr(0, size_str.size() - 2); + std::string unit_part = size_str.substr(size_str.size() - 2); + std::transform(unit_part.begin(), + unit_part.end(), + unit_part.begin(), + [](unsigned char c) { return std::toupper(c); }); + + uint64_t multiplier = 0; + if (unit_part == "KB") + { + multiplier = 1024ULL; + } + else if (unit_part == "MB") + { + multiplier = 1024ULL * 1024ULL; + } + else if (unit_part == "GB") + { + multiplier = 1024ULL * 1024ULL * 1024ULL; + } + else if (unit_part == "TB") + { + multiplier = 1024ULL * 1024ULL * 1024ULL * 1024ULL; + } + else + { + return false; + } + + if (number_part.empty() || + !std::all_of(number_part.begin(), + number_part.end(), + [](unsigned char c) { return std::isdigit(c); })) + { + return false; + } + + try + { + bytes = std::stoull(number_part) * multiplier; + } + catch (...) + { + return false; + } + + return bytes > 0; +} + #if ROCKSDB_CLOUD_EXPORT struct S3UrlComponents @@ -1248,62 +1309,6 @@ class ShardProgressPrinter size_t last_line_size_{0}; }; -inline bool ParseSizeBytes(const std::string &size_str, uint64_t &bytes) -{ - if (size_str.size() <= 2) - { - return false; - } - - std::string number_part = size_str.substr(0, size_str.size() - 2); - std::string unit_part = size_str.substr(size_str.size() - 2); - std::transform(unit_part.begin(), - unit_part.end(), - unit_part.begin(), - [](unsigned char c) { return std::toupper(c); }); - - uint64_t multiplier = 0; - if (unit_part == "KB") - { - multiplier = 1024ULL; - } - else if (unit_part == "MB") - { - multiplier = 1024ULL * 1024ULL; - } - else if (unit_part == "GB") - { - multiplier = 1024ULL * 1024ULL * 1024ULL; - } - else if (unit_part == "TB") - { - multiplier = 1024ULL * 1024ULL * 1024ULL * 1024ULL; - } - else - { - return false; - } - - if (number_part.empty() || - !std::all_of(number_part.begin(), - number_part.end(), - [](unsigned char c) { return std::isdigit(c); })) - { - return false; - } - - try - { - bytes = std::stoull(number_part) * multiplier; - } - catch (...) - { - return false; - } - - return bytes > 0; -} - // DSS value format constants and helpers. // Value layout: [version_ts(8B, MSB=has_ttl)][ttl(8B optional)][record_data] constexpr uint64_t kTtlMsb = 1ULL << 63; @@ -2343,6 +2348,7 @@ int main(int argc, char *argv[]) return -1; } +#if ROCKSDB_CLOUD_EXPORT if (FLAGS_thread_count > EloqKV::Tools::ShardProgressPrinter::kMaxScanThreads) { @@ -2352,7 +2358,6 @@ int main(int argc, char *argv[]) return -1; } -#if ROCKSDB_CLOUD_EXPORT if (!EloqKV::Tools::ValidateRequiredCloudFlags()) { return -1;