Skip to content

Commit 0972eaa

Browse files
committed
graph: add provider check strategy to make api nicer
1 parent fc9d98b commit 0972eaa

File tree

5 files changed

+55
-30
lines changed

5 files changed

+55
-30
lines changed

chain/ethereum/src/network.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use anyhow::{anyhow, bail};
22
use graph::blockchain::ChainIdentifier;
33
use graph::components::network_provider::ChainName;
44
use graph::components::network_provider::NetworkDetails;
5+
use graph::components::network_provider::ProviderCheckStrategy;
56
use graph::components::network_provider::ProviderManager;
67
use graph::components::network_provider::ProviderName;
78
use graph::endpoint::EndpointMetrics;
@@ -117,7 +118,7 @@ impl EthereumNetworkAdapters {
117118
let provider = ProviderManager::new(
118119
Logger::root(Discard, o!()),
119120
vec![(chain_id.clone(), adapters)].into_iter(),
120-
&[],
121+
ProviderCheckStrategy::MarkAsValid,
121122
);
122123

123124
Self::new(chain_id, provider, call_only, None)
@@ -310,6 +311,7 @@ impl EthereumNetworkAdapters {
310311
#[cfg(test)]
311312
mod tests {
312313
use graph::cheap_clone::CheapClone;
314+
use graph::components::network_provider::ProviderCheckStrategy;
313315
use graph::components::network_provider::ProviderManager;
314316
use graph::components::network_provider::ProviderName;
315317
use graph::data::value::Word;
@@ -758,7 +760,7 @@ mod tests {
758760
.collect(),
759761
)]
760762
.into_iter(),
761-
&[],
763+
ProviderCheckStrategy::MarkAsValid,
762764
);
763765

764766
let no_retest_adapters =
@@ -850,7 +852,7 @@ mod tests {
850852
.iter()
851853
.cloned()
852854
.map(|a| (chain_id.clone(), vec![a])),
853-
&[],
855+
ProviderCheckStrategy::MarkAsValid,
854856
);
855857

856858
let always_retest_adapters =
@@ -874,7 +876,7 @@ mod tests {
874876
.iter()
875877
.cloned()
876878
.map(|a| (chain_id.clone(), vec![a])),
877-
&[],
879+
ProviderCheckStrategy::MarkAsValid,
878880
);
879881

880882
let no_retest_adapters =
@@ -915,7 +917,7 @@ mod tests {
915917
no_available_adapter.iter().cloned().collect(),
916918
)]
917919
.into_iter(),
918-
&[],
920+
ProviderCheckStrategy::MarkAsValid,
919921
);
920922

921923
let no_available_adapter = EthereumNetworkAdapters::new(chain_id, manager, vec![], None);

graph/src/components/network_provider/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub use self::genesis_hash_check::GenesisHashCheck;
1212
pub use self::network_details::NetworkDetails;
1313
pub use self::provider_check::ProviderCheck;
1414
pub use self::provider_check::ProviderCheckStatus;
15+
pub use self::provider_manager::ProviderCheckStrategy;
1516
pub use self::provider_manager::ProviderManager;
1617

1718
// Used to increase memory efficiency.

graph/src/components/network_provider/provider_manager.rs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ pub struct ProviderManager<T: NetworkDetails> {
3333
validation_retry_interval: Duration,
3434
}
3535

36+
/// The strategy used by the [ProviderManager] when checking providers.
37+
#[derive(Clone)]
38+
pub enum ProviderCheckStrategy<'a> {
39+
/// Marks a provider as valid without performing any checks on it.
40+
MarkAsValid,
41+
42+
/// Requires a provider to pass all specified checks to be considered valid.
43+
RequireAll(&'a [Arc<dyn ProviderCheck>]),
44+
}
45+
3646
#[derive(Debug, Error)]
3747
pub enum ProviderManagerError {
3848
#[error("provider validation timed out on chain '{0}'")]
@@ -90,8 +100,13 @@ impl<T: NetworkDetails> ProviderManager<T> {
90100
pub fn new(
91101
logger: Logger,
92102
adapters: impl IntoIterator<Item = (ChainName, Vec<T>)>,
93-
enabled_checks: &[Arc<dyn ProviderCheck>],
103+
strategy: ProviderCheckStrategy<'_>,
94104
) -> Self {
105+
let enabled_checks = match strategy {
106+
ProviderCheckStrategy::MarkAsValid => &[],
107+
ProviderCheckStrategy::RequireAll(checks) => checks,
108+
};
109+
95110
let mut validations: Vec<Validation> = Vec::new();
96111
let adapters = Self::adapters_by_chain_names(adapters, &mut validations, &enabled_checks);
97112

@@ -459,7 +474,8 @@ mod tests {
459474

460475
#[tokio::test]
461476
async fn no_providers() {
462-
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(discard(), [], &[]);
477+
let manager: ProviderManager<Arc<TestAdapter>> =
478+
ProviderManager::new(discard(), [], ProviderCheckStrategy::MarkAsValid);
463479

464480
assert_eq!(manager.len(&chain_name()), 0);
465481
assert_eq!(manager.providers_unchecked(&chain_name()).count(), 0);
@@ -474,7 +490,7 @@ mod tests {
474490
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
475491
discard(),
476492
[(other_chain_name(), vec![adapter_1.clone()])],
477-
&[],
493+
ProviderCheckStrategy::MarkAsValid,
478494
);
479495

480496
assert_eq!(manager.len(&chain_name()), 0);
@@ -506,7 +522,7 @@ mod tests {
506522
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
507523
discard(),
508524
[(chain_name(), vec![adapter_1.clone(), adapter_2.clone()])],
509-
&[],
525+
ProviderCheckStrategy::MarkAsValid,
510526
);
511527

512528
assert_eq!(manager.len(&chain_name()), 2);
@@ -529,7 +545,7 @@ mod tests {
529545
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
530546
discard(),
531547
[(chain_name(), vec![adapter_1.clone()])],
532-
&[check_1.clone()],
548+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
533549
);
534550

535551
assert_eq!(ids(manager.providers_unchecked(&chain_name())), vec![1]);
@@ -546,7 +562,7 @@ mod tests {
546562
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
547563
discard(),
548564
[(chain_name(), vec![adapter_1.clone()])],
549-
&[check_1.clone()],
565+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
550566
);
551567

552568
assert_eq!(
@@ -575,7 +591,7 @@ mod tests {
575591
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
576592
discard(),
577593
[(chain_name(), vec![adapter_1.clone()])],
578-
&[check_1.clone(), check_2.clone()],
594+
ProviderCheckStrategy::RequireAll(&[check_1.clone(), check_2.clone()]),
579595
);
580596

581597
assert_eq!(
@@ -609,7 +625,7 @@ mod tests {
609625
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
610626
discard(),
611627
[(chain_name(), vec![adapter_1.clone(), adapter_2.clone()])],
612-
&[check_1.clone(), check_2.clone()],
628+
ProviderCheckStrategy::RequireAll(&[check_1.clone(), check_2.clone()]),
613629
);
614630

615631
assert_eq!(
@@ -638,7 +654,7 @@ mod tests {
638654
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
639655
discard(),
640656
[(chain_name(), vec![adapter_1.clone(), adapter_2.clone()])],
641-
&[check_1.clone()],
657+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
642658
);
643659

644660
assert_eq!(
@@ -670,7 +686,7 @@ mod tests {
670686
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
671687
discard(),
672688
[(chain_name(), vec![adapter_1.clone(), adapter_2.clone()])],
673-
&[check_1.clone(), check_2.clone()],
689+
ProviderCheckStrategy::RequireAll(&[check_1.clone(), check_2.clone()]),
674690
);
675691

676692
assert_eq!(
@@ -701,7 +717,7 @@ mod tests {
701717
let mut manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
702718
discard(),
703719
[(chain_name(), vec![adapter_1.clone()])],
704-
&[check_1.clone()],
720+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
705721
);
706722

707723
manager.validation_max_duration = Duration::from_millis(100);
@@ -732,7 +748,7 @@ mod tests {
732748
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
733749
discard(),
734750
[(chain_name(), vec![adapter_1.clone()])],
735-
&[check_1.clone()],
751+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
736752
);
737753

738754
match manager.providers(&chain_name()).await {
@@ -757,7 +773,7 @@ mod tests {
757773
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
758774
discard(),
759775
[(chain_name(), vec![adapter_1.clone()])],
760-
&[check_1.clone()],
776+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
761777
);
762778

763779
match manager.providers(&chain_name()).await {
@@ -787,7 +803,7 @@ mod tests {
787803
let mut manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
788804
discard(),
789805
[(chain_name(), vec![adapter_1.clone()])],
790-
&[check_1.clone()],
806+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
791807
);
792808

793809
manager.validation_retry_interval = Duration::from_millis(100);
@@ -813,7 +829,7 @@ mod tests {
813829
let mut manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
814830
discard(),
815831
[(chain_name(), vec![adapter_1.clone()])],
816-
&[check_1.clone()],
832+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
817833
);
818834

819835
manager.validation_retry_interval = Duration::from_millis(100);
@@ -851,7 +867,7 @@ mod tests {
851867
chain_name(),
852868
vec![adapter_1.clone(), adapter_2.clone(), adapter_3.clone()],
853869
)],
854-
&[check_1.clone()],
870+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
855871
);
856872

857873
assert_eq!(
@@ -876,7 +892,7 @@ mod tests {
876892
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
877893
discard(),
878894
[(chain_name(), vec![adapter_1.clone()])],
879-
&[check_1.clone(), check_2.clone(), check_3.clone()],
895+
ProviderCheckStrategy::RequireAll(&[check_1.clone(), check_2.clone(), check_3.clone()]),
880896
);
881897

882898
assert!(manager.providers(&chain_name()).await.is_err());
@@ -893,7 +909,7 @@ mod tests {
893909
let manager: ProviderManager<Arc<TestAdapter>> = ProviderManager::new(
894910
discard(),
895911
[(chain_name(), vec![adapter_1.clone()])],
896-
&[check_1.clone()],
912+
ProviderCheckStrategy::RequireAll(&[check_1.clone()]),
897913
);
898914

899915
let fut = || {

graph/src/firehose/endpoints.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use tonic::{
3030
use super::{codec as firehose, interceptors::MetricsInterceptor, stream_client::StreamClient};
3131
use crate::components::network_provider::ChainName;
3232
use crate::components::network_provider::NetworkDetails;
33+
use crate::components::network_provider::ProviderCheckStrategy;
3334
use crate::components::network_provider::ProviderManager;
3435
use crate::components::network_provider::ProviderName;
3536

@@ -499,7 +500,11 @@ impl FirehoseEndpoints {
499500

500501
Self(
501502
chain_name.clone(),
502-
ProviderManager::new(crate::log::discard(), [(chain_name, adapters)], &[]),
503+
ProviderManager::new(
504+
crate::log::discard(),
505+
[(chain_name, adapters)],
506+
ProviderCheckStrategy::MarkAsValid,
507+
),
503508
)
504509
}
505510

node/src/network_setup.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use ethereum::{
55
use graph::components::network_provider::ChainName;
66
use graph::components::network_provider::NetworkDetails;
77
use graph::components::network_provider::ProviderCheck;
8+
use graph::components::network_provider::ProviderCheckStrategy;
89
use graph::components::network_provider::ProviderManager;
910
use graph::components::network_provider::ProviderName;
1011
use graph::{
@@ -118,17 +119,17 @@ impl Networks {
118119
rpc_provider_manager: ProviderManager::new(
119120
Logger::root(Discard, o!()),
120121
vec![].into_iter(),
121-
&[],
122+
ProviderCheckStrategy::MarkAsValid,
122123
),
123124
firehose_provider_manager: ProviderManager::new(
124125
Logger::root(Discard, o!()),
125126
vec![].into_iter(),
126-
&[],
127+
ProviderCheckStrategy::MarkAsValid,
127128
),
128129
substreams_provider_manager: ProviderManager::new(
129130
Logger::root(Discard, o!()),
130131
vec![].into_iter(),
131-
&[],
132+
ProviderCheckStrategy::MarkAsValid,
132133
),
133134
}
134135
}
@@ -315,21 +316,21 @@ impl Networks {
315316
rpc_provider_manager: ProviderManager::new(
316317
logger.clone(),
317318
eth_adapters,
318-
provider_checks,
319+
ProviderCheckStrategy::RequireAll(provider_checks),
319320
),
320321
firehose_provider_manager: ProviderManager::new(
321322
logger.clone(),
322323
firehose_adapters
323324
.into_iter()
324325
.map(|(chain_id, endpoints)| (chain_id, endpoints)),
325-
provider_checks,
326+
ProviderCheckStrategy::RequireAll(provider_checks),
326327
),
327328
substreams_provider_manager: ProviderManager::new(
328329
logger.clone(),
329330
substreams_adapters
330331
.into_iter()
331332
.map(|(chain_id, endpoints)| (chain_id, endpoints)),
332-
provider_checks,
333+
ProviderCheckStrategy::RequireAll(provider_checks),
333334
),
334335
};
335336

0 commit comments

Comments
 (0)