Skip to content

Commit 3e8139e

Browse files
Do not run unneeded subsystems on collator and its alongside node (#3061)
Currently, collators and their alongside nodes spin up a full-scale overseer running a bunch of subsystems that are not needed if the node is not a validator. That was considered to be harmless; however, we've got problems with unused subsystems getting stalled for a reason not currently known, resulting in the overseer exiting and bringing down the whole node. This PR aims to only run needed subsystems on such nodes, replacing the rest with `DummySubsystem`. It also enables collator-optimized availability recovery subsystem implementation. Partially solves #1730.
1 parent 987edd8 commit 3e8139e

16 files changed

Lines changed: 430 additions & 221 deletions

File tree

cumulus/client/relay-chain-inprocess-interface/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ fn build_polkadot_full_node(
295295
workers_path: None,
296296
workers_names: None,
297297

298-
overseer_gen: polkadot_service::RealOverseerGen,
298+
overseer_gen: polkadot_service::CollatorOverseerGen,
299299
overseer_message_channel_capacity_override: None,
300300
malus_finality_delay: None,
301301
hwbench,

cumulus/test/service/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ async fn build_relay_chain_interface(
271271
polkadot_service::IsParachainNode::Collator(CollatorPair::generate().0)
272272
},
273273
None,
274+
polkadot_service::CollatorOverseerGen,
274275
)
275276
.map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?,
276277
cumulus_client_cli::RelayChainMode::ExternalRpc(rpc_target_urls) =>

polkadot/cli/src/command.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ pub fn run() -> Result<()> {
299299
match &cli.subcommand {
300300
None => run_node_inner(
301301
cli,
302-
service::RealOverseerGen,
302+
service::ValidatorOverseerGen,
303303
None,
304304
polkadot_node_metrics::logger_hook(),
305305
),

polkadot/cli/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ mod error;
2929
pub use service::{self, Block, CoreApi, IdentifyVariant, ProvideRuntimeApi, TFullClient};
3030

3131
#[cfg(feature = "malus")]
32-
pub use service::overseer::prepared_overseer_builder;
32+
pub use service::overseer::validator_overseer_builder;
3333

3434
#[cfg(feature = "cli")]
3535
pub use cli::*;

polkadot/node/core/pvf-checker/src/lib.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,24 @@ use self::{
4949

5050
/// PVF pre-checking subsystem.
5151
pub struct PvfCheckerSubsystem {
52-
enabled: bool,
5352
keystore: KeystorePtr,
5453
metrics: Metrics,
5554
}
5655

5756
impl PvfCheckerSubsystem {
58-
pub fn new(enabled: bool, keystore: KeystorePtr, metrics: Metrics) -> Self {
59-
PvfCheckerSubsystem { enabled, keystore, metrics }
57+
pub fn new(keystore: KeystorePtr, metrics: Metrics) -> Self {
58+
PvfCheckerSubsystem { keystore, metrics }
6059
}
6160
}
6261

6362
#[overseer::subsystem(PvfChecker, error=SubsystemError, prefix = self::overseer)]
6463
impl<Context> PvfCheckerSubsystem {
6564
fn start(self, ctx: Context) -> SpawnedSubsystem {
66-
if self.enabled {
67-
let future = run(ctx, self.keystore, self.metrics)
68-
.map_err(|e| SubsystemError::with_origin("pvf-checker", e))
69-
.boxed();
70-
71-
SpawnedSubsystem { name: "pvf-checker-subsystem", future }
72-
} else {
73-
polkadot_overseer::DummySubsystem.start(ctx)
74-
}
65+
let future = run(ctx, self.keystore, self.metrics)
66+
.map_err(|e| SubsystemError::with_origin("pvf-checker", e))
67+
.boxed();
68+
69+
SpawnedSubsystem { name: "pvf-checker-subsystem", future }
7570
}
7671
}
7772

polkadot/node/malus/src/variants/back_garbage_candidate.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@
1919
//! candidates.
2020
2121
use polkadot_cli::{
22-
prepared_overseer_builder,
2322
service::{
24-
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer,
25-
OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost,
26-
ProvideRuntimeApi,
23+
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs,
24+
HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle,
25+
ParachainHost, ProvideRuntimeApi,
2726
},
28-
Cli,
27+
validator_overseer_builder, Cli,
2928
};
3029
use polkadot_node_subsystem::SpawnGlue;
3130
use polkadot_node_subsystem_types::DefaultSubsystemClient;
@@ -63,6 +62,7 @@ impl OverseerGen for BackGarbageCandidates {
6362
&self,
6463
connector: OverseerConnector,
6564
args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
65+
ext_args: Option<ExtendedOverseerGenArgs>,
6666
) -> Result<
6767
(Overseer<SpawnGlue<Spawner>, Arc<DefaultSubsystemClient<RuntimeClient>>>, OverseerHandle),
6868
Error,
@@ -80,11 +80,14 @@ impl OverseerGen for BackGarbageCandidates {
8080
SpawnGlue(spawner),
8181
);
8282

83-
prepared_overseer_builder(args)?
84-
.replace_candidate_validation(move |cv_subsystem| {
85-
InterceptedSubsystem::new(cv_subsystem, validation_filter)
86-
})
87-
.build_with_connector(connector)
88-
.map_err(|e| e.into())
83+
validator_overseer_builder(
84+
args,
85+
ext_args.expect("Extended arguments required to build validator overseer are provided"),
86+
)?
87+
.replace_candidate_validation(move |cv_subsystem| {
88+
InterceptedSubsystem::new(cv_subsystem, validation_filter)
89+
})
90+
.build_with_connector(connector)
91+
.map_err(|e| e.into())
8992
}
9093
}

polkadot/node/malus/src/variants/dispute_finalized_candidates.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,12 @@
3333

3434
use futures::channel::oneshot;
3535
use polkadot_cli::{
36-
prepared_overseer_builder,
3736
service::{
38-
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer,
39-
OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost,
40-
ProvideRuntimeApi,
37+
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs,
38+
HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle,
39+
ParachainHost, ProvideRuntimeApi,
4140
},
42-
Cli,
41+
validator_overseer_builder, Cli,
4342
};
4443
use polkadot_node_subsystem::{messages::ApprovalVotingMessage, SpawnGlue};
4544
use polkadot_node_subsystem_types::{DefaultSubsystemClient, OverseerSignal};
@@ -237,6 +236,7 @@ impl OverseerGen for DisputeFinalizedCandidates {
237236
&self,
238237
connector: OverseerConnector,
239238
args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
239+
ext_args: Option<ExtendedOverseerGenArgs>,
240240
) -> Result<
241241
(Overseer<SpawnGlue<Spawner>, Arc<DefaultSubsystemClient<RuntimeClient>>>, OverseerHandle),
242242
Error,
@@ -257,9 +257,12 @@ impl OverseerGen for DisputeFinalizedCandidates {
257257
dispute_offset: self.dispute_offset,
258258
};
259259

260-
prepared_overseer_builder(args)?
261-
.replace_approval_voting(move |cb| InterceptedSubsystem::new(cb, ancestor_disputer))
262-
.build_with_connector(connector)
263-
.map_err(|e| e.into())
260+
validator_overseer_builder(
261+
args,
262+
ext_args.expect("Extended arguments required to build validator overseer are provided"),
263+
)?
264+
.replace_approval_voting(move |cb| InterceptedSubsystem::new(cb, ancestor_disputer))
265+
.build_with_connector(connector)
266+
.map_err(|e| e.into())
264267
}
265268
}

polkadot/node/malus/src/variants/dispute_valid_candidates.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
#![allow(missing_docs)]
2424

2525
use polkadot_cli::{
26-
prepared_overseer_builder,
2726
service::{
28-
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer,
29-
OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost,
30-
ProvideRuntimeApi,
27+
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs,
28+
HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle,
29+
ParachainHost, ProvideRuntimeApi,
3130
},
32-
Cli,
31+
validator_overseer_builder, Cli,
3332
};
3433
use polkadot_node_subsystem::SpawnGlue;
3534
use polkadot_node_subsystem_types::DefaultSubsystemClient;
@@ -80,6 +79,7 @@ impl OverseerGen for DisputeValidCandidates {
8079
&self,
8180
connector: OverseerConnector,
8281
args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
82+
ext_args: Option<ExtendedOverseerGenArgs>,
8383
) -> Result<
8484
(Overseer<SpawnGlue<Spawner>, Arc<DefaultSubsystemClient<RuntimeClient>>>, OverseerHandle),
8585
Error,
@@ -97,11 +97,14 @@ impl OverseerGen for DisputeValidCandidates {
9797
SpawnGlue(spawner.clone()),
9898
);
9999

100-
prepared_overseer_builder(args)?
101-
.replace_candidate_validation(move |cv_subsystem| {
102-
InterceptedSubsystem::new(cv_subsystem, validation_filter)
103-
})
104-
.build_with_connector(connector)
105-
.map_err(|e| e.into())
100+
validator_overseer_builder(
101+
args,
102+
ext_args.expect("Extended arguments required to build validator overseer are provided"),
103+
)?
104+
.replace_candidate_validation(move |cv_subsystem| {
105+
InterceptedSubsystem::new(cv_subsystem, validation_filter)
106+
})
107+
.build_with_connector(connector)
108+
.map_err(|e| e.into())
106109
}
107110
}

polkadot/node/malus/src/variants/suggest_garbage_candidate.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
#![allow(missing_docs)]
2424

2525
use polkadot_cli::{
26-
prepared_overseer_builder,
2726
service::{
28-
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer,
29-
OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost,
30-
ProvideRuntimeApi,
27+
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs,
28+
HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle,
29+
ParachainHost, ProvideRuntimeApi,
3130
},
32-
Cli,
31+
validator_overseer_builder, Cli,
3332
};
3433
use polkadot_node_core_candidate_validation::find_validation_data;
3534
use polkadot_node_primitives::{AvailableData, BlockData, PoV};
@@ -266,6 +265,7 @@ impl OverseerGen for SuggestGarbageCandidates {
266265
&self,
267266
connector: OverseerConnector,
268267
args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
268+
ext_args: Option<ExtendedOverseerGenArgs>,
269269
) -> Result<
270270
(Overseer<SpawnGlue<Spawner>, Arc<DefaultSubsystemClient<RuntimeClient>>>, OverseerHandle),
271271
Error,
@@ -293,12 +293,13 @@ impl OverseerGen for SuggestGarbageCandidates {
293293
SpawnGlue(args.spawner.clone()),
294294
);
295295

296-
prepared_overseer_builder(args)?
297-
.replace_candidate_backing(move |cb| InterceptedSubsystem::new(cb, note_candidate))
298-
.replace_candidate_validation(move |cb| {
299-
InterceptedSubsystem::new(cb, validation_filter)
300-
})
301-
.build_with_connector(connector)
302-
.map_err(|e| e.into())
296+
validator_overseer_builder(
297+
args,
298+
ext_args.expect("Extended arguments required to build validator overseer are provided"),
299+
)?
300+
.replace_candidate_backing(move |cb| InterceptedSubsystem::new(cb, note_candidate))
301+
.replace_candidate_validation(move |cb| InterceptedSubsystem::new(cb, validation_filter))
302+
.build_with_connector(connector)
303+
.map_err(|e| e.into())
303304
}
304305
}

polkadot/node/malus/src/variants/support_disabled.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
//! to always return an empty set of disabled validators.
1919
2020
use polkadot_cli::{
21-
prepared_overseer_builder,
2221
service::{
23-
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer,
24-
OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost,
25-
ProvideRuntimeApi,
22+
AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs,
23+
HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle,
24+
ParachainHost, ProvideRuntimeApi,
2625
},
27-
Cli,
26+
validator_overseer_builder, Cli,
2827
};
2928
use polkadot_node_subsystem::SpawnGlue;
3029
use polkadot_node_subsystem_types::DefaultSubsystemClient;
@@ -50,6 +49,7 @@ impl OverseerGen for SupportDisabled {
5049
&self,
5150
connector: OverseerConnector,
5251
args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
52+
ext_args: Option<ExtendedOverseerGenArgs>,
5353
) -> Result<
5454
(Overseer<SpawnGlue<Spawner>, Arc<DefaultSubsystemClient<RuntimeClient>>>, OverseerHandle),
5555
Error,
@@ -59,12 +59,15 @@ impl OverseerGen for SupportDisabled {
5959
RuntimeClient::Api: ParachainHost<Block> + BabeApi<Block> + AuthorityDiscoveryApi<Block>,
6060
Spawner: 'static + SpawnNamed + Clone + Unpin,
6161
{
62-
prepared_overseer_builder(args)?
63-
.replace_runtime_api(move |ra_subsystem| {
64-
InterceptedSubsystem::new(ra_subsystem, IgnoreDisabled)
65-
})
66-
.build_with_connector(connector)
67-
.map_err(|e| e.into())
62+
validator_overseer_builder(
63+
args,
64+
ext_args.expect("Extended arguments required to build validator overseer are provided"),
65+
)?
66+
.replace_runtime_api(move |ra_subsystem| {
67+
InterceptedSubsystem::new(ra_subsystem, IgnoreDisabled)
68+
})
69+
.build_with_connector(connector)
70+
.map_err(|e| e.into())
6871
}
6972
}
7073

0 commit comments

Comments
 (0)