@@ -223,8 +223,7 @@ impl PollingBlockIngestor {
223223 current_provider : & mut Option < String > ,
224224 ) {
225225 // Resolve by name; resets to first provider if the tracked one left the list.
226- let idx = resolve_provider_idx ( providers, current_provider, & self . logger ) ;
227- let eth_adapter = providers[ idx] . clone ( ) ;
226+ let eth_adapter = resolve_provider ( providers, current_provider, & self . logger ) . clone ( ) ;
228227 // Pin the name so the next iteration knows which provider is active.
229228 let provider_name = eth_adapter. provider ( ) . to_string ( ) ;
230229 let logger = self . logger . new ( o ! ( "provider" => provider_name. clone( ) ) ) ;
@@ -237,31 +236,28 @@ impl PollingBlockIngestor {
237236 }
238237}
239238
240- /// Returns the index of the currently-tracked provider in `providers`.
239+ /// Returns the currently-tracked provider from `providers`.
241240///
242241/// If the tracked provider is no longer in the list (it became invalid and was removed by
243- /// `ProviderManager`), logs a warning, resets the state to the first available provider,
244- /// and returns 0 .
245- fn resolve_provider_idx < A : crate :: EthereumAdapterTrait > (
246- providers : & [ Arc < A > ] ,
242+ /// `ProviderManager`), logs a warning, resets the state, and returns the first available
243+ /// provider .
244+ fn resolve_provider < ' a , A : crate :: EthereumAdapterTrait > (
245+ providers : & ' a [ Arc < A > ] ,
247246 current_provider : & mut Option < String > ,
248247 logger : & Logger ,
249- ) -> usize {
250- let name = match current_provider. as_ref ( ) {
251- None => return 0 ,
252- Some ( name) => name,
253- } ;
254- if let Some ( idx) = providers. iter ( ) . position ( |p| p. provider ( ) == name) {
255- idx
256- } else {
248+ ) -> & ' a Arc < A > {
249+ if let Some ( name) = current_provider. as_ref ( ) {
250+ if let Some ( found) = providers. iter ( ) . find ( |p| p. provider ( ) == name) {
251+ return found;
252+ }
257253 warn ! (
258254 logger,
259255 "Current RPC provider is no longer available, resetting to first provider" ;
260256 "provider" => name,
261257 ) ;
262258 * current_provider = None ;
263- 0
264259 }
260+ & providers[ 0 ]
265261}
266262
267263async fn on_poll_failure < A : crate :: EthereumAdapterTrait > (
@@ -501,8 +497,8 @@ mod tests {
501497 MockEthAdapter :: new( "p2" , true ) ,
502498 ] ;
503499 let mut current_provider = Some ( "p0" . to_string ( ) ) ;
504- let idx = resolve_provider_idx ( & providers, & mut current_provider, & discard_logger ( ) ) ;
505- assert_eq ! ( idx , 0 ) ;
500+ let resolved = resolve_provider ( & providers, & mut current_provider, & discard_logger ( ) ) ;
501+ assert_eq ! ( resolved . provider ( ) , "p1" ) ;
506502 assert_eq ! ( current_provider, None ) ;
507503 }
508504
@@ -568,9 +564,9 @@ mod tests {
568564 MockEthAdapter :: new( "p2" , true ) ,
569565 ] ;
570566 let mut current_provider = Some ( "p1" . to_string ( ) ) ;
571- let idx = resolve_provider_idx ( & providers, & mut current_provider, & discard_logger ( ) ) ;
567+ let resolved = resolve_provider ( & providers, & mut current_provider, & discard_logger ( ) ) ;
572568 // p1 is now at index 0 — must not drift to p2
573- assert_eq ! ( idx , 0 ) ;
569+ assert_eq ! ( resolved . provider ( ) , "p1" ) ;
574570 assert_eq ! ( current_provider, Some ( "p1" . to_string( ) ) ) ;
575571 }
576572
@@ -597,8 +593,8 @@ mod tests {
597593 MockEthAdapter :: new( "p0" , true ) ,
598594 MockEthAdapter :: new( "p2" , true ) ,
599595 ] ;
600- let idx = resolve_provider_idx ( & providers_iter2, & mut current_provider, & logger) ;
601- assert_eq ! ( idx , 0 ) ; // reset to first (p0)
596+ let resolved = resolve_provider ( & providers_iter2, & mut current_provider, & logger) ;
597+ assert_eq ! ( resolved . provider ( ) , "p0" ) ; // reset to first
602598 assert_eq ! ( current_provider, None ) ;
603599 }
604600
@@ -625,9 +621,9 @@ mod tests {
625621 MockEthAdapter :: new( "p0" , true ) ,
626622 MockEthAdapter :: new( "p1" , true ) ,
627623 ] ;
628- let idx = resolve_provider_idx ( & providers_iter2, & mut current_provider, & logger) ;
629- // Must resolve to p1 (index 1) , not drift back to p0 (index 0) .
630- assert_eq ! ( idx , 1 ) ;
624+ let resolved = resolve_provider ( & providers_iter2, & mut current_provider, & logger) ;
625+ // Must resolve to p1, not drift back to p0.
626+ assert_eq ! ( resolved . provider ( ) , "p1" ) ;
631627 assert_eq ! ( current_provider, Some ( "p1" . to_string( ) ) ) ;
632628 }
633629}
0 commit comments