From 5010b0dd75ffd5d3e0664e58681e768a450027fe Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 30 Apr 2021 00:46:03 +0300 Subject: [PATCH] Use json11 instead of blockstore_config_t --- src/etcd_state_client.cpp | 4 +- src/etcd_state_client.h | 2 +- src/osd.cpp | 96 ++++++++++++++++++++++----------------- src/osd.h | 6 +-- src/osd_cluster.cpp | 23 +++------- src/osd_main.cpp | 4 +- 6 files changed, 69 insertions(+), 66 deletions(-) diff --git a/src/etcd_state_client.cpp b/src/etcd_state_client.cpp index 8d9cc5d4..e6843c56 100644 --- a/src/etcd_state_client.cpp +++ b/src/etcd_state_client.cpp @@ -85,7 +85,7 @@ void etcd_state_client_t::add_etcd_url(std::string addr) } } -void etcd_state_client_t::parse_config(json11::Json & config) +void etcd_state_client_t::parse_config(const json11::Json & config) { this->etcd_addresses.clear(); if (config["etcd_address"].is_string()) @@ -342,7 +342,7 @@ void etcd_state_client_t::load_pgs() }); } #else -void etcd_state_client_t::parse_config(json11::Json & config) +void etcd_state_client_t::parse_config(const json11::Json & config) { } diff --git a/src/etcd_state_client.h b/src/etcd_state_client.h index 7e0a9570..c74250c3 100644 --- a/src/etcd_state_client.h +++ b/src/etcd_state_client.h @@ -106,7 +106,7 @@ public: void load_global_config(); void load_pgs(); void parse_state(const etcd_kv_t & kv); - void parse_config(json11::Json & config); + void parse_config(const json11::Json & config); inode_watch_t* watch_inode(std::string name); void close_watch(inode_watch_t* watch); ~etcd_state_client_t(); diff --git a/src/osd.cpp b/src/osd.cpp index dcd0816e..a33a4d41 100644 --- a/src/osd.cpp +++ b/src/osd.cpp @@ -10,31 +10,39 @@ #include "osd.h" #include "http_client.h" -osd_t::osd_t(blockstore_config_t & config, ring_loop_t *ringloop) +static blockstore_config_t json_to_bs(const json11::Json::object & config) { - bs_block_size = strtoull(config["block_size"].c_str(), NULL, 10); - bs_bitmap_granularity = strtoull(config["bitmap_granularity"].c_str(), NULL, 10); - if (!bs_block_size) - bs_block_size = DEFAULT_BLOCK_SIZE; - if (!bs_bitmap_granularity) - bs_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY; - clean_entry_bitmap_size = bs_block_size / bs_bitmap_granularity / 8; + blockstore_config_t bs; + for (auto kv: config) + { + if (kv.second.is_string()) + bs[kv.first] = kv.second.string_value(); + else + bs[kv.first] = kv.second.dump(); + } + return bs; +} +osd_t::osd_t(const json11::Json & config, ring_loop_t *ringloop) +{ zero_buffer_size = 1<<20; zero_buffer = malloc_or_die(zero_buffer_size); memset(zero_buffer, 0, zero_buffer_size); - this->config = config; + this->config = config.object_items(); this->ringloop = ringloop; + if (this->config.find("log_level") == this->config.end()) + this->config["log_level"] = 1; + parse_config(this->config); + epmgr = new epoll_manager_t(ringloop); // FIXME: Use timerfd_interval based directly on io_uring this->tfd = epmgr->tfd; // FIXME: Create Blockstore from on-disk superblock config and check it against the OSD cluster config - this->bs = new blockstore_t(config, ringloop, tfd); - - parse_config(config); + auto bs_cfg = json_to_bs(this->config); + this->bs = new blockstore_t(bs_cfg, ringloop, tfd); this->tfd->set_timer(print_stats_interval*1000, true, [this](int timer_id) { @@ -66,63 +74,69 @@ osd_t::~osd_t() free(zero_buffer); } -void osd_t::parse_config(blockstore_config_t & config) +void osd_t::parse_config(const json11::Json & config) { - if (config.find("log_level") == config.end()) - config["log_level"] = "1"; - log_level = strtoull(config["log_level"].c_str(), NULL, 10); - // Initial startup configuration - json11::Json json_config = json11::Json(config); - st_cli.parse_config(json_config); - etcd_report_interval = strtoull(config["etcd_report_interval"].c_str(), NULL, 10); - if (etcd_report_interval <= 0) - etcd_report_interval = 30; - osd_num = strtoull(config["osd_num"].c_str(), NULL, 10); + st_cli.parse_config(config); + msgr.parse_config(config); + // OSD number + osd_num = config["osd_num"].uint64_value(); if (!osd_num) throw std::runtime_error("osd_num is required in the configuration"); msgr.osd_num = osd_num; + // Vital Blockstore parameters + bs_block_size = config["block_size"].uint64_value(); + if (!bs_block_size) + bs_block_size = DEFAULT_BLOCK_SIZE; + bs_bitmap_granularity = config["bitmap_granularity"].uint64_value(); + if (!bs_bitmap_granularity) + bs_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY; + clean_entry_bitmap_size = bs_block_size / bs_bitmap_granularity / 8; + // Bind address + bind_address = config["bind_address"].string_value(); + if (bind_address == "") + bind_address = "0.0.0.0"; + bind_port = config["bind_port"].uint64_value(); + if (bind_port <= 0 || bind_port > 65535) + bind_port = 0; + // OSD configuration + log_level = config["log_level"].uint64_value(); + etcd_report_interval = config["etcd_report_interval"].uint64_value(); + if (etcd_report_interval <= 0) + etcd_report_interval = 30; + readonly = config["readonly"] == "true" || config["readonly"] == "1" || config["readonly"] == "yes"; run_primary = config["run_primary"] != "false" && config["run_primary"] != "0" && config["run_primary"] != "no"; no_rebalance = config["no_rebalance"] == "true" || config["no_rebalance"] == "1" || config["no_rebalance"] == "yes"; no_recovery = config["no_recovery"] == "true" || config["no_recovery"] == "1" || config["no_recovery"] == "yes"; allow_test_ops = config["allow_test_ops"] == "true" || config["allow_test_ops"] == "1" || config["allow_test_ops"] == "yes"; - // Cluster configuration - bind_address = config["bind_address"]; - if (bind_address == "") - bind_address = "0.0.0.0"; - bind_port = stoull_full(config["bind_port"]); - if (bind_port <= 0 || bind_port > 65535) - bind_port = 0; if (config["immediate_commit"] == "all") immediate_commit = IMMEDIATE_ALL; else if (config["immediate_commit"] == "small") immediate_commit = IMMEDIATE_SMALL; - if (config.find("autosync_interval") != config.end()) + if (!config["autosync_interval"].is_null()) { - autosync_interval = strtoull(config["autosync_interval"].c_str(), NULL, 10); + // Allow to set it to 0 + autosync_interval = config["autosync_interval"].uint64_value(); if (autosync_interval > MAX_AUTOSYNC_INTERVAL) autosync_interval = DEFAULT_AUTOSYNC_INTERVAL; } - if (config.find("client_queue_depth") != config.end()) + if (!config["client_queue_depth"].is_null()) { - client_queue_depth = strtoull(config["client_queue_depth"].c_str(), NULL, 10); + client_queue_depth = config["client_queue_depth"].uint64_value(); if (client_queue_depth < 128) client_queue_depth = 128; } - recovery_queue_depth = strtoull(config["recovery_queue_depth"].c_str(), NULL, 10); + recovery_queue_depth = config["recovery_queue_depth"].uint64_value(); if (recovery_queue_depth < 1 || recovery_queue_depth > MAX_RECOVERY_QUEUE) recovery_queue_depth = DEFAULT_RECOVERY_QUEUE; - recovery_sync_batch = strtoull(config["recovery_sync_batch"].c_str(), NULL, 10); + recovery_sync_batch = config["recovery_sync_batch"].uint64_value(); if (recovery_sync_batch < 1 || recovery_sync_batch > MAX_RECOVERY_QUEUE) recovery_sync_batch = DEFAULT_RECOVERY_BATCH; - if (config["readonly"] == "true" || config["readonly"] == "1" || config["readonly"] == "yes") - readonly = true; - print_stats_interval = strtoull(config["print_stats_interval"].c_str(), NULL, 10); + print_stats_interval = config["print_stats_interval"].uint64_value(); if (!print_stats_interval) print_stats_interval = 3; - slow_log_interval = strtoull(config["slow_log_interval"].c_str(), NULL, 10); + slow_log_interval = config["slow_log_interval"].uint64_value(); if (!slow_log_interval) slow_log_interval = 10; - msgr.parse_config(json_config); } void osd_t::bind_socket() diff --git a/src/osd.h b/src/osd.h index 4cdd1f3d..c8c5f44b 100644 --- a/src/osd.h +++ b/src/osd.h @@ -92,7 +92,7 @@ class osd_t { // config - blockstore_config_t config; + json11::Json::object config; int etcd_report_interval = 30; bool readonly = false; @@ -167,7 +167,7 @@ class osd_t uint64_t recovery_stat_bytes[2][2] = { 0 }; // cluster connection - void parse_config(blockstore_config_t & config); + void parse_config(const json11::Json & config); void init_cluster(); void on_change_osd_state_hook(osd_num_t peer_osd); void on_change_pg_history_hook(pool_id_t pool_id, pg_num_t pg_num); @@ -268,7 +268,7 @@ class osd_t } public: - osd_t(blockstore_config_t & config, ring_loop_t *ringloop); + osd_t(const json11::Json & config, ring_loop_t *ringloop); ~osd_t(); void force_stop(int exitcode); bool shutdown(); diff --git a/src/osd_cluster.cpp b/src/osd_cluster.cpp index 57637d7a..18f38c6e 100644 --- a/src/osd_cluster.cpp +++ b/src/osd_cluster.cpp @@ -21,7 +21,7 @@ void osd_t::init_cluster() { // Test version of clustering code with 1 pool, 1 PG and 2 peers // Example: peers = 2:127.0.0.1:11204,3:127.0.0.1:11205 - std::string peerstr = config["peers"]; + std::string peerstr = config["peers"].string_value(); while (peerstr.size()) { int pos = peerstr.find(','); @@ -340,21 +340,10 @@ void osd_t::on_change_pg_history_hook(pool_id_t pool_id, pg_num_t pg_num) void osd_t::on_load_config_hook(json11::Json::object & global_config) { - blockstore_config_t osd_config = this->config; - for (auto & cfg_var: global_config) - { - if (this->config.find(cfg_var.first) == this->config.end()) - { - if (cfg_var.second.is_string()) - { - osd_config[cfg_var.first] = cfg_var.second.string_value(); - } - else - { - osd_config[cfg_var.first] = cfg_var.second.dump(); - } - } - } + json11::Json::object osd_config = this->config; + for (auto & kv: global_config) + if (osd_config.find(kv.first) == osd_config.end()) + osd_config[kv.first] = kv.second; parse_config(osd_config); bind_socket(); acquire_lease(); @@ -380,7 +369,7 @@ void osd_t::acquire_lease() etcd_lease_id = data["ID"].string_value(); create_osd_state(); }); - printf("[OSD %lu] reporting to etcd at %s every %d seconds\n", this->osd_num, config["etcd_address"].c_str(), etcd_report_interval); + printf("[OSD %lu] reporting to etcd at %s every %d seconds\n", this->osd_num, config["etcd_address"].string_value().c_str(), etcd_report_interval); tfd->set_timer(etcd_report_interval*1000, true, [this](int timer_id) { renew_lease(); diff --git a/src/osd_main.cpp b/src/osd_main.cpp index a39326c9..336c69be 100644 --- a/src/osd_main.cpp +++ b/src/osd_main.cpp @@ -29,13 +29,13 @@ int main(int narg, char *args[]) perror("BUG: too small packet size"); return 1; } - blockstore_config_t config; + json11::Json::object config; for (int i = 1; i < narg; i++) { if (args[i][0] == '-' && args[i][1] == '-' && i < narg-1) { char *opt = args[i]+2; - config[opt] = args[++i]; + config[std::string(opt)] = std::string(args[++i]); } } signal(SIGINT, handle_sigint);