degesch: add exponential reconnect backoff
This commit is contained in:
parent
403dbc83ab
commit
b3acc4904f
30
degesch.c
30
degesch.c
@ -1116,6 +1116,7 @@ struct server
|
|||||||
|
|
||||||
enum server_state state; ///< Connection state
|
enum server_state state; ///< Connection state
|
||||||
struct connector *connector; ///< Connection establisher
|
struct connector *connector; ///< Connection establisher
|
||||||
|
unsigned reconnect_attempt; ///< Number of reconnect attempt
|
||||||
bool manual_disconnect; ///< Don't reconnect after disconnect
|
bool manual_disconnect; ///< Don't reconnect after disconnect
|
||||||
|
|
||||||
int socket; ///< Socket FD of the server
|
int socket; ///< Socket FD of the server
|
||||||
@ -1613,6 +1614,17 @@ static struct config_schema g_config_behaviour[] =
|
|||||||
.type = CONFIG_ITEM_BOOLEAN,
|
.type = CONFIG_ITEM_BOOLEAN,
|
||||||
.default_ = "off",
|
.default_ = "off",
|
||||||
.on_change = on_config_debug_mode_change },
|
.on_change = on_config_debug_mode_change },
|
||||||
|
|
||||||
|
{ .name = "reconnect_delay_growing",
|
||||||
|
.comment = "Growing factor for reconnect delay",
|
||||||
|
.type = CONFIG_ITEM_INTEGER,
|
||||||
|
.validate = config_validate_nonnegative,
|
||||||
|
.default_ = "2" },
|
||||||
|
{ .name = "reconnect_delay_max",
|
||||||
|
.comment = "Maximum reconnect delay in seconds",
|
||||||
|
.type = CONFIG_ITEM_INTEGER,
|
||||||
|
.validate = config_validate_nonnegative,
|
||||||
|
.default_ = "600" },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3467,7 +3479,18 @@ irc_queue_reconnect (struct server *s)
|
|||||||
return;
|
return;
|
||||||
int64_t delay = get_config_integer (s->config, "reconnect_delay");
|
int64_t delay = get_config_integer (s->config, "reconnect_delay");
|
||||||
|
|
||||||
// TODO: exponentional backoff
|
int64_t delay_factor = get_config_integer (s->ctx->config.root,
|
||||||
|
"behaviour.reconnect_delay_growing");
|
||||||
|
int64_t delay_max = get_config_integer (s->ctx->config.root,
|
||||||
|
"behaviour.reconnect_delay_max");
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < s->reconnect_attempt; i++)
|
||||||
|
delay *= delay_factor;
|
||||||
|
if (delay > delay_max || delay < 0)
|
||||||
|
delay = delay_max;
|
||||||
|
|
||||||
|
s->reconnect_attempt++;
|
||||||
|
|
||||||
// XXX: maybe add a state for when a connect is queued?
|
// XXX: maybe add a state for when a connect is queued?
|
||||||
hard_assert (s->state == IRC_DISCONNECTED);
|
hard_assert (s->state == IRC_DISCONNECTED);
|
||||||
log_server_status (s, s->buffer,
|
log_server_status (s, s->buffer,
|
||||||
@ -3671,7 +3694,10 @@ irc_disconnect (struct server *s)
|
|||||||
else if (s->manual_disconnect)
|
else if (s->manual_disconnect)
|
||||||
s->manual_disconnect = false;
|
s->manual_disconnect = false;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
s->reconnect_attempt = 0;
|
||||||
irc_queue_reconnect (s);
|
irc_queue_reconnect (s);
|
||||||
|
}
|
||||||
|
|
||||||
refresh_prompt (s->ctx);
|
refresh_prompt (s->ctx);
|
||||||
}
|
}
|
||||||
@ -4420,6 +4446,8 @@ irc_initiate_connect (struct server *s)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->reconnect_attempt = 0;
|
||||||
|
|
||||||
struct str_vector servers;
|
struct str_vector servers;
|
||||||
str_vector_init (&servers);
|
str_vector_init (&servers);
|
||||||
cstr_split_ignore_empty (addresses, ',', &servers);
|
cstr_split_ignore_empty (addresses, ',', &servers);
|
||||||
|
Loading…
Reference in New Issue
Block a user