From c7b3352b792920c9be809e83c06e4d9f8dc1d94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 23 Mar 2023 10:07:40 +0100 Subject: [PATCH] Ensure candidate-backing and provisioner exit on missing Overseer (#6939) This ensures that both subsystems exit when the Overseer has exited because of some error. --- polkadot/node/core/backing/src/error.rs | 4 ++++ polkadot/node/core/backing/src/lib.rs | 3 ++- polkadot/node/core/provisioner/src/error.rs | 4 ++++ polkadot/node/core/provisioner/src/lib.rs | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) 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(..)) => {},