Răsfoiți Sursa

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 ani în urmă
părinte
comite
c1e8d28548
2 a modificat fișierele cu 10 adăugiri și 3 ștergeri
  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,