diff --git a/polkadot/node/core/backing/src/error.rs b/polkadot/node/core/backing/src/error.rs index 36d4f859a0..bbe89c0afc 100644 --- a/polkadot/node/core/backing/src/error.rs +++ b/polkadot/node/core/backing/src/error.rs @@ -70,6 +70,10 @@ pub enum Error { #[error(transparent)] SubsystemError(#[from] SubsystemError), + + #[fatal] + #[error(transparent)] + OverseerExited(SubsystemError), } /// Utility for eating top level errors and log them. diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index 32a6bb7903..078eb1d8d6 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -199,7 +199,8 @@ async fn run_iteration( } } from_overseer = ctx.recv().fuse() => { - match from_overseer? { + // Map the error to ensure that the subsystem exits when the overseer is gone. + match from_overseer.map_err(Error::OverseerExited)? { FromOrchestra::Signal(OverseerSignal::ActiveLeaves(update)) => handle_active_leaves_update( &mut *ctx, update, diff --git a/polkadot/node/core/provisioner/src/error.rs b/polkadot/node/core/provisioner/src/error.rs index de520fc1fe..c049a326a7 100644 --- a/polkadot/node/core/provisioner/src/error.rs +++ b/polkadot/node/core/provisioner/src/error.rs @@ -75,6 +75,10 @@ pub enum Error { #[error(transparent)] SubsystemError(#[from] SubsystemError), + + #[fatal] + #[error(transparent)] + OverseerExited(SubsystemError), } /// Used by `get_onchain_disputes` to represent errors related to fetching on-chain disputes from the Runtime diff --git a/polkadot/node/core/provisioner/src/lib.rs b/polkadot/node/core/provisioner/src/lib.rs index be0b051a10..0c9853e901 100644 --- a/polkadot/node/core/provisioner/src/lib.rs +++ b/polkadot/node/core/provisioner/src/lib.rs @@ -144,7 +144,8 @@ async fn run_iteration( loop { futures::select! { from_overseer = ctx.recv().fuse() => { - match from_overseer? { + // Map the error to ensure that the subsystem exits when the overseer is gone. + match from_overseer.map_err(Error::OverseerExited)? { FromOrchestra::Signal(OverseerSignal::ActiveLeaves(update)) => handle_active_leaves_update(update, per_relay_parent, inherent_delays), FromOrchestra::Signal(OverseerSignal::BlockFinalized(..)) => {},