浏览代码

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.
jp9000 10 年之前
父节点
当前提交
c1e8d28548
共有 2 个文件被更改,包括 10 次插入3 次删除
  1. 1 0
      libobs/obs-internal.h
  2. 9 3
      libobs/obs-output.c

+ 1 - 0
libobs/obs-internal.h

@@ -466,6 +466,7 @@ struct obs_output {
 	int                             reconnect_retry_sec;
 	int                             reconnect_retry_max;
 	int                             reconnect_retries;
+	int                             reconnect_retry_cur_sec;
 	bool                            reconnecting;
 	pthread_t                       reconnect_thread;
 	os_event_t                      *reconnect_stop_event;

+ 9 - 3
libobs/obs-output.c

@@ -1028,7 +1028,7 @@ static inline void signal_reconnect(struct obs_output *output)
 {
 	struct calldata params = {0};
 	calldata_set_int(&params, "timeout_sec",
-			output->reconnect_retry_sec);
+			output->reconnect_retry_cur_sec);
 	calldata_set_ptr(&params, "output", output);
 	signal_handler_signal(output->context.signals, "reconnect", &params);
 	calldata_free(&params);
@@ -1220,7 +1220,7 @@ void obs_output_end_data_capture(obs_output_t *output)
 static void *reconnect_thread(void *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;
 
@@ -1238,8 +1238,10 @@ static void output_reconnect(struct obs_output *output)
 {
 	int ret;
 
-	if (!output->reconnecting)
+	if (!output->reconnecting) {
+		output->reconnect_retry_cur_sec = output->reconnect_retry_sec;
 		output->reconnect_retries = 0;
+	}
 
 	if (output->reconnect_retries >= output->reconnect_retry_max) {
 		output->reconnecting = false;
@@ -1252,6 +1254,10 @@ static void output_reconnect(struct obs_output *output)
 		os_event_reset(output->reconnect_stop_event);
 	}
 
+	if (output->reconnect_retries) {
+		output->reconnect_retry_cur_sec *= 2;
+	}
+
 	output->reconnect_retries++;
 
 	ret = pthread_create(&output->reconnect_thread, NULL,