5
5
anyhow,
6
6
bail,
7
7
} ,
8
+ backoff:: {
9
+ ExponentialBackoffBuilder ,
10
+ backoff:: Backoff ,
11
+ } ,
8
12
futures_util:: {
9
13
SinkExt ,
10
14
stream:: {
@@ -112,7 +116,13 @@ struct RelayerSessionTask {
112
116
impl RelayerSessionTask {
113
117
pub async fn run ( & mut self ) {
114
118
let mut failure_count = 0 ;
115
- let retry_duration = Duration :: from_secs ( 1 ) ;
119
+ let initial_interval = Duration :: from_millis ( 100 ) ;
120
+ let max_interval = Duration :: from_secs ( 5 ) ;
121
+ let mut backoff = ExponentialBackoffBuilder :: new ( )
122
+ . with_initial_interval ( initial_interval)
123
+ . with_max_interval ( max_interval)
124
+ . with_max_elapsed_time ( None )
125
+ . build ( ) ;
116
126
117
127
loop {
118
128
match self . run_relayer_connection ( ) . await {
@@ -122,13 +132,14 @@ impl RelayerSessionTask {
122
132
}
123
133
Err ( e) => {
124
134
failure_count += 1 ;
135
+ let next_backoff = backoff. next_backoff ( ) . unwrap_or ( max_interval) ;
125
136
tracing:: error!(
126
137
"relayer session failed with error: {:?}, failure_count: {}; retrying in {:?}" ,
127
138
e,
128
139
failure_count,
129
- retry_duration
140
+ next_backoff
130
141
) ;
131
- tokio:: time:: sleep ( retry_duration ) . await ;
142
+ tokio:: time:: sleep ( next_backoff ) . await ;
132
143
}
133
144
}
134
145
}
@@ -405,15 +416,9 @@ mod lazer_exporter {
405
416
payload: Some ( buf) ,
406
417
special_fields: Default :: default ( ) ,
407
418
} ;
408
- for relayer_sender in relayer_senders. iter( ) {
409
- if let Err ( e) = relayer_sender
410
- . send( signed_lazer_transaction. clone( ) )
411
- . await
412
- {
413
- tracing:: error!( "Error sending transaction to Lazer relayer session: {e:?}" ) ;
414
- // TODO: Under what circumstances would the channel be hosed and is it worth retry?
415
- }
416
- }
419
+ futures:: future:: join_all( relayer_senders. iter( ) . map( |relayer_sender|
420
+ relayer_sender. send( signed_lazer_transaction. clone( ) ) )
421
+ ) . await ;
417
422
}
418
423
}
419
424
}
0 commit comments