diff --git a/src/client/cluster_client.cpp b/src/client/cluster_client.cpp index f6e76721..d9d12ab2 100644 --- a/src/client/cluster_client.cpp +++ b/src/client/cluster_client.cpp @@ -58,6 +58,7 @@ cluster_client_t::cluster_client_t(ring_loop_t *ringloop, timerfd_manager_t *tfd st_cli.on_reload_hook = [this]() { st_cli.load_global_config(); }; st_cli.parse_config(config); + st_cli.infinite_start = false; st_cli.load_global_config(); scrap_buffer_size = SCRAP_BUFFER_SIZE; diff --git a/src/client/etcd_state_client.cpp b/src/client/etcd_state_client.cpp index 5416dc17..b9072c22 100644 --- a/src/client/etcd_state_client.cpp +++ b/src/client/etcd_state_client.cpp @@ -121,6 +121,7 @@ void etcd_state_client_t::etcd_call(std::string api, json11::Json payload, int t "Connection: keep-alive\r\n" "Keep-Alive: timeout="+std::to_string(etcd_keepalive_timeout)+"\r\n" "\r\n"+req; + retries--; auto cb = [this, api, payload, timeout, retries, interval, callback, cur_addr = selected_etcd_address](const http_response_t *response) { @@ -144,11 +145,11 @@ void etcd_state_client_t::etcd_call(std::string api, json11::Json payload, int t { tfd->set_timer(interval, false, [this, api, payload, timeout, retries, interval, callback](int) { - etcd_call(api, payload, timeout, retries-1, interval, callback); + etcd_call(api, payload, timeout, retries, interval, callback); }); } else - etcd_call(api, payload, timeout, retries-1, interval, callback); + etcd_call(api, payload, timeout, retries, interval, callback); } else callback(err, data); @@ -558,15 +559,22 @@ void etcd_state_client_t::load_global_config() { etcd_call("/kv/range", json11::Json::object { { "key", base64_encode(etcd_prefix+"/config/global") } - }, etcd_slow_timeout, max_etcd_attempts, 0, [this](std::string err, json11::Json data) + }, etcd_quick_timeout, max_etcd_attempts, 0, [this](std::string err, json11::Json data) { if (err != "") { - fprintf(stderr, "Error reading OSD configuration from etcd: %s\n", err.c_str()); - tfd->set_timer(etcd_slow_timeout, false, [this](int timer_id) + fprintf(stderr, "Error reading configuration from etcd: %s\n", err.c_str()); + if (infinite_start) { - load_global_config(); - }); + tfd->set_timer(etcd_slow_timeout, false, [this](int timer_id) + { + load_global_config(); + }); + } + else + { + exit(1); + } return; } json11::Json::object global_config; diff --git a/src/client/etcd_state_client.h b/src/client/etcd_state_client.h index 5f42e1cb..93102f69 100644 --- a/src/client/etcd_state_client.h +++ b/src/client/etcd_state_client.h @@ -106,6 +106,7 @@ public: int max_etcd_attempts = 5; int etcd_quick_timeout = 1000; int etcd_slow_timeout = 5000; + bool infinite_start = true; uint64_t global_block_size = DEFAULT_BLOCK_SIZE; uint32_t global_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY; uint32_t global_immediate_commit = IMMEDIATE_NONE; diff --git a/src/cmd/cli.cpp b/src/cmd/cli.cpp index 9c217bb9..47ff1c12 100644 --- a/src/cmd/cli.cpp +++ b/src/cmd/cli.cpp @@ -485,8 +485,6 @@ static int run(cli_tool_t *p, json11::Json::object cfg) p->ringloop = new ring_loop_t(RINGLOOP_DEFAULT_SIZE); p->epmgr = new epoll_manager_t(p->ringloop); p->cli = new cluster_client_t(p->ringloop, p->epmgr->tfd, cfg_j); - // Smaller timeout by default for more interactiveness - p->cli->st_cli.etcd_slow_timeout = p->cli->st_cli.etcd_quick_timeout; p->loop_and_wait(action_cb, [&](const cli_result_t & r) { result = r;