// Copyright (C) Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Polkadot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Polkadot. If not, see .
use crate::{
prometheus::Registry, HeadSupportsParachains, InitializedOverseerBuilder, MetricsTrait,
Overseer, OverseerMetrics, OverseerSignal, OverseerSubsystemContext, SpawnGlue,
KNOWN_LEAVES_CACHE_SIZE,
};
use orchestra::{FromOrchestra, SpawnedSubsystem, Subsystem, SubsystemContext};
use polkadot_node_subsystem_types::{errors::SubsystemError, messages::*};
use schnellru::{ByLength, LruMap};
// Generated dummy messages
use crate::messages::*;
/// A dummy subsystem that implements [`Subsystem`] for all
/// types of messages. Used for tests or as a placeholder.
#[derive(Clone, Copy, Debug)]
pub struct DummySubsystem;
impl Subsystem for DummySubsystem
where
Context: SubsystemContext,
{
fn start(self, mut ctx: Context) -> SpawnedSubsystem {
let future = Box::pin(async move {
loop {
match ctx.recv().await {
Err(_) => return Ok(()),
Ok(FromOrchestra::Signal(OverseerSignal::Conclude)) => return Ok(()),
Ok(overseer_msg) => {
gum::debug!(
target: "dummy-subsystem",
"Discarding a message sent from overseer {:?}",
overseer_msg
);
continue
},
}
}
});
SpawnedSubsystem { name: "dummy-subsystem", future }
}
}
/// Create an overseer with all subsystem being `Sub`.
///
/// Preferred way of initializing a dummy overseer for subsystem tests.
pub fn dummy_overseer_builder(
spawner: Spawner,
supports_parachains: SupportsParachains,
registry: Option<&Registry>,
) -> Result<
InitializedOverseerBuilder<
SpawnGlue,
SupportsParachains,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
>,
SubsystemError,
>
where
SpawnGlue: orchestra::Spawner + 'static,
SupportsParachains: HeadSupportsParachains,
{
one_for_all_overseer_builder(spawner, supports_parachains, DummySubsystem, registry)
}
/// Create an overseer with all subsystem being `Sub`.
pub fn one_for_all_overseer_builder(
spawner: Spawner,
supports_parachains: SupportsParachains,
subsystem: Sub,
registry: Option<&Registry>,
) -> Result<
InitializedOverseerBuilder<
SpawnGlue,
SupportsParachains,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
>,
SubsystemError,
>
where
SpawnGlue: orchestra::Spawner + 'static,
SupportsParachains: HeadSupportsParachains,
Sub: Clone
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>
+ Subsystem, SubsystemError>,
{
let metrics = ::register(registry)?;
let builder = Overseer::builder()
.availability_distribution(subsystem.clone())
.availability_recovery(subsystem.clone())
.availability_store(subsystem.clone())
.bitfield_distribution(subsystem.clone())
.bitfield_signing(subsystem.clone())
.candidate_backing(subsystem.clone())
.candidate_validation(subsystem.clone())
.pvf_checker(subsystem.clone())
.chain_api(subsystem.clone())
.collation_generation(subsystem.clone())
.collator_protocol(subsystem.clone())
.network_bridge_tx(subsystem.clone())
.network_bridge_rx(subsystem.clone())
.provisioner(subsystem.clone())
.runtime_api(subsystem.clone())
.statement_distribution(subsystem.clone())
.approval_distribution(subsystem.clone())
.approval_voting(subsystem.clone())
.gossip_support(subsystem.clone())
.dispute_coordinator(subsystem.clone())
.dispute_distribution(subsystem.clone())
.chain_selection(subsystem.clone())
.prospective_parachains(subsystem.clone())
.activation_external_listeners(Default::default())
.span_per_active_leaf(Default::default())
.active_leaves(Default::default())
.known_leaves(LruMap::new(ByLength::new(KNOWN_LEAVES_CACHE_SIZE)))
.spawner(SpawnGlue(spawner))
.metrics(metrics)
.supports_parachains(supports_parachains);
Ok(builder)
}