diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client.rs | 12 | ||||
-rw-r--r-- | src/config.rs | 17 | ||||
-rw-r--r-- | src/constants.rs | 7 |
3 files changed, 28 insertions, 8 deletions
diff --git a/src/client.rs b/src/client.rs index 45d3d85..21dbc2b 100644 --- a/src/client.rs +++ b/src/client.rs @@ -494,6 +494,9 @@ impl ControlChannelHandle { info!("Starting {}", hex::encode(digest)); let (shutdown_tx, shutdown_rx) = oneshot::channel(); + + let mut retry_backoff = run_control_chan_backoff(service.retry_interval.unwrap()); + let mut s = ControlChannel { digest, service, @@ -505,7 +508,6 @@ impl ControlChannelHandle { tokio::spawn( async move { - let mut backoff = run_control_chan_backoff(); let mut start = Instant::now(); while let Err(err) = s @@ -519,10 +521,10 @@ impl ControlChannelHandle { if start.elapsed() > Duration::from_secs(3) { // The client runs for at least 3 secs and then disconnects - // Retry immediately - backoff.reset(); - error!("{:#}. Retry...", err); - } else if let Some(duration) = backoff.next_backoff() { + retry_backoff.reset(); + } + + if let Some(duration) = retry_backoff.next_backoff() { error!("{:#}. Retry in {:?}...", err, duration); time::sleep(duration).await; } else { diff --git a/src/config.rs b/src/config.rs index 8b9cd3d..74015ed 100644 --- a/src/config.rs +++ b/src/config.rs @@ -13,6 +13,9 @@ use crate::transport::{DEFAULT_KEEPALIVE_INTERVAL, DEFAULT_KEEPALIVE_SECS, DEFAU const DEFAULT_HEARTBEAT_INTERVAL_SECS: u64 = 30; const DEFAULT_HEARTBEAT_TIMEOUT_SECS: u64 = 40; +/// Client +const DEFAULT_CLIENT_RETRY_INTERVAL_SECS: u64 = 1; + /// String with Debug implementation that emits "MASKED" /// Used to mask sensitive strings when logging #[derive(Serialize, Deserialize, Default, PartialEq, Eq, Clone)] @@ -53,6 +56,8 @@ impl Default for TransportType { } } +/// Per service config +/// All Option are optional in configuration but must be Some value in runtime #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)] #[serde(deny_unknown_fields)] pub struct ClientServiceConfig { @@ -63,6 +68,7 @@ pub struct ClientServiceConfig { pub local_addr: String, pub token: Option<MaskedString>, pub nodelay: Option<bool>, + pub retry_interval: Option<u64>, } impl ClientServiceConfig { @@ -92,6 +98,8 @@ fn default_service_type() -> ServiceType { Default::default() } +/// Per service config +/// All Option are optional in configuration but must be Some value in runtime #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)] #[serde(deny_unknown_fields)] pub struct ServerServiceConfig { @@ -185,6 +193,10 @@ fn default_heartbeat_timeout() -> u64 { DEFAULT_HEARTBEAT_TIMEOUT_SECS } +fn default_client_retry_interval() -> u64 { + DEFAULT_CLIENT_RETRY_INTERVAL_SECS +} + #[derive(Debug, Serialize, Deserialize, Default, PartialEq, Eq, Clone)] #[serde(deny_unknown_fields)] pub struct ClientConfig { @@ -195,6 +207,8 @@ pub struct ClientConfig { pub transport: TransportConfig, #[serde(default = "default_heartbeat_timeout")] pub heartbeat_timeout: u64, + #[serde(default = "default_client_retry_interval")] + pub retry_interval: u64, } fn default_heartbeat_interval() -> u64 { @@ -266,6 +280,9 @@ impl Config { bail!("The token of service {} is not set", name); } } + if s.retry_interval.is_none() { + s.retry_interval = Some(client.retry_interval); + } } Config::validate_transport_config(&client.transport, false)?; diff --git a/src/constants.rs b/src/constants.rs index 8de4dee..b9356ca 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -15,11 +15,12 @@ pub fn listen_backoff() -> ExponentialBackoff { } } -pub fn run_control_chan_backoff() -> ExponentialBackoff { +pub fn run_control_chan_backoff(interval: u64) -> ExponentialBackoff { ExponentialBackoff { - randomization_factor: 0.1, + randomization_factor: 0.2, max_elapsed_time: None, - max_interval: Duration::from_secs(1), + multiplier: 3.0, + max_interval: Duration::from_secs(interval), ..Default::default() } } |