From b97854e4d23ffea705ddfece8f0a41aa4c18e36d Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 31 Mar 2021 14:50:55 +0300 Subject: [PATCH] fix delay in message_lane_loop_is_able_to_recover_from_connection_errors (#850) --- bridges/relays/messages/src/message_lane_loop.rs | 1 + bridges/relays/utils/src/relay_loop.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bridges/relays/messages/src/message_lane_loop.rs b/bridges/relays/messages/src/message_lane_loop.rs index 159bd4c76959..b5f650f117c6 100644 --- a/bridges/relays/messages/src/message_lane_loop.rs +++ b/bridges/relays/messages/src/message_lane_loop.rs @@ -221,6 +221,7 @@ pub async fn run( ) -> Result<(), String> { let exit_signal = exit_signal.shared(); relay_utils::relay_loop(source_client, target_client) + .reconnect_delay(params.reconnect_delay) .with_metrics(format!( "{}_to_{}_MessageLane_{}", P::SOURCE_NAME, diff --git a/bridges/relays/utils/src/relay_loop.rs b/bridges/relays/utils/src/relay_loop.rs index d21f6d28ef5b..2e12f71459ab 100644 --- a/bridges/relays/utils/src/relay_loop.rs +++ b/bridges/relays/utils/src/relay_loop.rs @@ -37,6 +37,7 @@ pub trait Client: Clone + Send + Sync { /// Returns generic loop that may be customized and started. pub fn relay_loop(source_client: SC, target_client: TC) -> Loop { Loop { + reconnect_delay: RECONNECT_DELAY, source_client, target_client, loop_metric: None, @@ -45,6 +46,7 @@ pub fn relay_loop(source_client: SC, target_client: TC) -> Loop { + reconnect_delay: Duration, source_client: SC, target_client: TC, loop_metric: Option, @@ -58,6 +60,12 @@ pub struct LoopMetrics { } impl Loop { + /// Customize delay between reconnect attempts. + pub fn reconnect_delay(mut self, reconnect_delay: Duration) -> Self { + self.reconnect_delay = reconnect_delay; + self + } + /// Start building loop metrics using given prefix. /// /// Panics if `prefix` is empty. @@ -66,6 +74,7 @@ impl Loop { LoopMetrics { relay_loop: Loop { + reconnect_delay: self.reconnect_delay, source_client: self.source_client, target_client: self.target_client, loop_metric: None, @@ -100,7 +109,7 @@ impl Loop { match result { Ok(()) => break, Err(failed_client) => loop { - async_std::task::sleep(RECONNECT_DELAY).await; + async_std::task::sleep(self.reconnect_delay).await; if failed_client == FailedClient::Both || failed_client == FailedClient::Source { match self.source_client.reconnect().await { Ok(()) => (), @@ -108,7 +117,7 @@ impl Loop { log::warn!( target: "bridge", "Failed to reconnect to source client. Going to retry in {}s: {:?}", - RECONNECT_DELAY.as_secs(), + self.reconnect_delay.as_secs(), error, ); continue; @@ -122,7 +131,7 @@ impl Loop { log::warn!( target: "bridge", "Failed to reconnect to target client. Going to retry in {}s: {:?}", - RECONNECT_DELAY.as_secs(), + self.reconnect_delay.as_secs(), error, ); continue; @@ -189,6 +198,7 @@ impl LoopMetrics { } Ok(Loop { + reconnect_delay: self.relay_loop.reconnect_delay, source_client: self.relay_loop.source_client, target_client: self.relay_loop.target_client, loop_metric: self.loop_metric,