提交 c1e8d285 编写于 作者: J jp9000

libobs: Use exponential backoff for reconnecting

Implements exponential backoff for consecutive reconnects, which is
useful to prevent too many connections from trying to reconnect back to
a service at once over a short period of time in the case of potential
service downtime.  Exponential backoff causes each subsequent reconnect
attempt to double its timeout duration.
上级 691d3b4a
...@@ -466,6 +466,7 @@ struct obs_output { ...@@ -466,6 +466,7 @@ struct obs_output {
int reconnect_retry_sec; int reconnect_retry_sec;
int reconnect_retry_max; int reconnect_retry_max;
int reconnect_retries; int reconnect_retries;
int reconnect_retry_cur_sec;
bool reconnecting; bool reconnecting;
pthread_t reconnect_thread; pthread_t reconnect_thread;
os_event_t *reconnect_stop_event; os_event_t *reconnect_stop_event;
......
...@@ -1028,7 +1028,7 @@ static inline void signal_reconnect(struct obs_output *output) ...@@ -1028,7 +1028,7 @@ static inline void signal_reconnect(struct obs_output *output)
{ {
struct calldata params = {0}; struct calldata params = {0};
calldata_set_int(&params, "timeout_sec", calldata_set_int(&params, "timeout_sec",
output->reconnect_retry_sec); output->reconnect_retry_cur_sec);
calldata_set_ptr(&params, "output", output); calldata_set_ptr(&params, "output", output);
signal_handler_signal(output->context.signals, "reconnect", &params); signal_handler_signal(output->context.signals, "reconnect", &params);
calldata_free(&params); calldata_free(&params);
...@@ -1220,7 +1220,7 @@ void obs_output_end_data_capture(obs_output_t *output) ...@@ -1220,7 +1220,7 @@ void obs_output_end_data_capture(obs_output_t *output)
static void *reconnect_thread(void *param) static void *reconnect_thread(void *param)
{ {
struct obs_output *output = param; struct obs_output *output = param;
unsigned long ms = output->reconnect_retry_sec * 1000; unsigned long ms = output->reconnect_retry_cur_sec * 1000;
output->reconnect_thread_active = true; output->reconnect_thread_active = true;
...@@ -1238,8 +1238,10 @@ static void output_reconnect(struct obs_output *output) ...@@ -1238,8 +1238,10 @@ static void output_reconnect(struct obs_output *output)
{ {
int ret; int ret;
if (!output->reconnecting) if (!output->reconnecting) {
output->reconnect_retry_cur_sec = output->reconnect_retry_sec;
output->reconnect_retries = 0; output->reconnect_retries = 0;
}
if (output->reconnect_retries >= output->reconnect_retry_max) { if (output->reconnect_retries >= output->reconnect_retry_max) {
output->reconnecting = false; output->reconnecting = false;
...@@ -1252,6 +1254,10 @@ static void output_reconnect(struct obs_output *output) ...@@ -1252,6 +1254,10 @@ static void output_reconnect(struct obs_output *output)
os_event_reset(output->reconnect_stop_event); os_event_reset(output->reconnect_stop_event);
} }
if (output->reconnect_retries) {
output->reconnect_retry_cur_sec *= 2;
}
output->reconnect_retries++; output->reconnect_retries++;
ret = pthread_create(&output->reconnect_thread, NULL, ret = pthread_create(&output->reconnect_thread, NULL,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册