Skip to content

Commit 469986d

Browse files
chain/ethereum: Return provider directly from resolve_provider
Simplify resolve_provider_idx into resolve_provider by returning a reference to the Arc<A> instead of a usize index, eliminating the separate indexing step at the call site.
1 parent e5ef4a1 commit 469986d

File tree

1 file changed

+21
-25
lines changed

1 file changed

+21
-25
lines changed

chain/ethereum/src/ingestor.rs

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

267263
async 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

Comments
 (0)