Autodetect block_size/bitmap_granularity/immediate_commit when creating pools

This commit is contained in:
Vitaliy Filippov
2024-08-28 02:03:35 +03:00
parent b3716fbe23
commit 4121c66281
+75
View File
@@ -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<json11::Json> & 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.