From 4121c66281efc6d23e3bdbcc8787f7712823232c Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 27 Aug 2024 01:46:47 +0300 Subject: [PATCH] Autodetect block_size/bitmap_granularity/immediate_commit when creating pools --- src/cmd/cli_pool_create.cpp | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/cmd/cli_pool_create.cpp b/src/cmd/cli_pool_create.cpp index 5e263eee..1f3dcbce 100644 --- a/src/cmd/cli_pool_create.cpp +++ b/src/cmd/cli_pool_create.cpp @@ -193,6 +193,7 @@ resume_4: auto kv = parent->cli->st_cli.parse_etcd_kv(ocr["response_range"]["kvs"][0]); osd_stats.push_back(kv.value); } + guess_block_size(osd_stats); state_node_tree = filter_state_node_tree_by_stats(state_node_tree, osd_stats); } @@ -455,6 +456,80 @@ resume_8: return json11::Json::object { { "osds", accepted_osds }, { "nodes", accepted_nodes } }; } + // Autodetect block size for the pool if not specified + void guess_block_size(std::vector & osd_stats) + { + json11::Json::object upd; + if (!cfg["block_size"].uint64_value()) + { + uint64_t osd_bs = 0; + for (auto & os: osd_stats) + { + if (!os["data_block_size"].is_null()) + { + if (osd_bs == 0) + osd_bs = os["data_block_size"].uint64_value(); + else if (osd_bs != os["data_block_size"].uint64_value()) + osd_bs = UINT32_MAX; + } + } + if (osd_bs && osd_bs != UINT32_MAX && osd_bs != parent->cli->st_cli.global_block_size) + { + fprintf(stderr, "Auto-selecting block_size=%s because all pool OSDs use it\n", format_size(osd_bs).c_str()); + upd["block_size"] = osd_bs; + } + } + if (!cfg["bitmap_granularity"].uint64_value()) + { + uint64_t osd_bg = 0; + for (auto & os: osd_stats) + { + if (!os["bitmap_granularity"].is_null()) + { + if (osd_bg == 0) + osd_bg = os["bitmap_granularity"].uint64_value(); + else if (osd_bg != os["bitmap_granularity"].uint64_value()) + osd_bg = UINT32_MAX; + } + } + if (osd_bg && osd_bg != UINT32_MAX && osd_bg != parent->cli->st_cli.global_bitmap_granularity) + { + fprintf(stderr, "Auto-selecting bitmap_granularity=%s because all pool OSDs use it\n", format_size(osd_bg).c_str()); + upd["bitmap_granularity"] = osd_bg; + } + } + if (cfg["immediate_commit"].is_null()) + { + uint32_t osd_imm = UINT32_MAX; + for (auto & os: osd_stats) + { + if (!os["immediate_commit"].is_null()) + { + uint32_t imm = etcd_state_client_t::parse_immediate_commit(os["immediate_commit"].string_value(), IMMEDIATE_NONE); + if (osd_imm == UINT32_MAX) + osd_imm = imm; + else if (osd_imm != imm) + osd_imm = UINT32_MAX-1; + } + } + if (osd_imm < UINT32_MAX-1 && osd_imm != parent->cli->st_cli.global_immediate_commit) + { + const char *imm_str = osd_imm == IMMEDIATE_NONE ? "none" : (osd_imm == IMMEDIATE_ALL ? "all" : "small"); + fprintf(stderr, "Auto-selecting immediate_commit=%s because all pool OSDs use it\n", imm_str); + upd["immediate_commit"] = imm_str; + } + } + if (upd.size()) + { + json11::Json::object cfg_obj = cfg.object_items(); + for (auto & kv: upd) + { + cfg_obj[kv.first] = kv.second; + } + cfg = cfg_obj; + } + } + // Returns new state_node_tree based on given state_node_tree with osds // filtered out by stats parameters (block_size, bitmap_granularity) in // given osd_stats and current pool config.