@@ -69,21 +69,36 @@ impl FlashblocksReceiverService {
6969
7070 pub async fn run ( self ) {
7171 let mut backoff = self . websocket_config . backoff ( ) ;
72+ info ! ( "FlashblocksReceiverService starting reconnection loop" ) ;
7273 loop {
73- if let Err ( e) = self . connect_and_handle ( & mut backoff) . await {
74- let interval = backoff
75- . next_backoff ( )
76- . expect ( "max_elapsed_time not set, never None" ) ;
77- error ! (
78- "Flashblocks receiver connection error, retrying in {}ms: {}" ,
79- interval. as_millis( ) ,
80- e
81- ) ;
82- self . metrics . reconnect_attempts . increment ( 1 ) ;
83- self . metrics . connection_status . set ( 0 ) ;
84- tokio:: time:: sleep ( interval) . await ;
85- } else {
86- break ;
74+ match self . connect_and_handle ( & mut backoff) . await {
75+ Err ( e) => {
76+ // Get next backoff interval, or use max if None (defensive)
77+ let interval = backoff
78+ . next_backoff ( )
79+ . unwrap_or_else ( || {
80+ error ! ( "Backoff returned None despite max_elapsed_time=None, using max_interval as fallback" ) ;
81+ self . websocket_config . max_interval ( )
82+ } ) ;
83+ error ! (
84+ "Flashblocks receiver connection error, retrying in {}ms: {}" ,
85+ interval. as_millis( ) ,
86+ e
87+ ) ;
88+ self . metrics . reconnect_attempts . increment ( 1 ) ;
89+ self . metrics . connection_status . set ( 0 ) ;
90+ tokio:: time:: sleep ( interval) . await ;
91+ }
92+ Ok ( ( ) ) => {
93+ // This should never happen - connect_and_handle should loop forever
94+ // or return an error. If we get here, reconnect immediately.
95+ error ! (
96+ "Flashblocks receiver connection ended unexpectedly with Ok(()), this should never happen. Reconnecting immediately."
97+ ) ;
98+ self . metrics . reconnect_attempts . increment ( 1 ) ;
99+ self . metrics . connection_status . set ( 0 ) ;
100+ // Reconnect immediately without delay since this is unexpected
101+ }
87102 }
88103 }
89104 }
0 commit comments