Clients should not wait infinitely for etcd to start if it's unavailable

This commit is contained in:
Vitaliy Filippov
2024-08-28 02:03:35 +03:00
parent 4121c66281
commit f848c450a4
4 changed files with 17 additions and 9 deletions
+1
View File
@@ -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.on_reload_hook = [this]() { st_cli.load_global_config(); };
st_cli.parse_config(config); st_cli.parse_config(config);
st_cli.infinite_start = false;
st_cli.load_global_config(); st_cli.load_global_config();
scrap_buffer_size = SCRAP_BUFFER_SIZE; scrap_buffer_size = SCRAP_BUFFER_SIZE;
+15 -7
View File
@@ -121,6 +121,7 @@ void etcd_state_client_t::etcd_call(std::string api, json11::Json payload, int t
"Connection: keep-alive\r\n" "Connection: keep-alive\r\n"
"Keep-Alive: timeout="+std::to_string(etcd_keepalive_timeout)+"\r\n" "Keep-Alive: timeout="+std::to_string(etcd_keepalive_timeout)+"\r\n"
"\r\n"+req; "\r\n"+req;
retries--;
auto cb = [this, api, payload, timeout, retries, interval, callback, auto cb = [this, api, payload, timeout, retries, interval, callback,
cur_addr = selected_etcd_address](const http_response_t *response) 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) 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 else
etcd_call(api, payload, timeout, retries-1, interval, callback); etcd_call(api, payload, timeout, retries, interval, callback);
} }
else else
callback(err, data); callback(err, data);
@@ -558,15 +559,22 @@ void etcd_state_client_t::load_global_config()
{ {
etcd_call("/kv/range", json11::Json::object { etcd_call("/kv/range", json11::Json::object {
{ "key", base64_encode(etcd_prefix+"/config/global") } { "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 != "") if (err != "")
{ {
fprintf(stderr, "Error reading OSD configuration from etcd: %s\n", err.c_str()); fprintf(stderr, "Error reading configuration from etcd: %s\n", err.c_str());
tfd->set_timer(etcd_slow_timeout, false, [this](int timer_id) if (infinite_start)
{ {
load_global_config(); tfd->set_timer(etcd_slow_timeout, false, [this](int timer_id)
}); {
load_global_config();
});
}
else
{
exit(1);
}
return; return;
} }
json11::Json::object global_config; json11::Json::object global_config;
+1
View File
@@ -106,6 +106,7 @@ public:
int max_etcd_attempts = 5; int max_etcd_attempts = 5;
int etcd_quick_timeout = 1000; int etcd_quick_timeout = 1000;
int etcd_slow_timeout = 5000; int etcd_slow_timeout = 5000;
bool infinite_start = true;
uint64_t global_block_size = DEFAULT_BLOCK_SIZE; uint64_t global_block_size = DEFAULT_BLOCK_SIZE;
uint32_t global_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY; uint32_t global_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY;
uint32_t global_immediate_commit = IMMEDIATE_NONE; uint32_t global_immediate_commit = IMMEDIATE_NONE;
-2
View File
@@ -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->ringloop = new ring_loop_t(RINGLOOP_DEFAULT_SIZE);
p->epmgr = new epoll_manager_t(p->ringloop); p->epmgr = new epoll_manager_t(p->ringloop);
p->cli = new cluster_client_t(p->ringloop, p->epmgr->tfd, cfg_j); 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) p->loop_and_wait(action_cb, [&](const cli_result_t & r)
{ {
result = r; result = r;