mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 15:51:12 +00:00
refactor+feat: allow subsystems to send only declared messages, generate graphviz (#5314)
Closes #3774 Closes #3826
This commit is contained in:
committed by
GitHub
parent
26340b9054
commit
511891dcce
@@ -21,16 +21,18 @@
|
||||
//! messages on the overseer level.
|
||||
|
||||
use polkadot_node_subsystem::*;
|
||||
pub use polkadot_node_subsystem::{messages::AllMessages, overseer, FromOverseer};
|
||||
pub use polkadot_node_subsystem::{messages, messages::*, overseer, FromOverseer};
|
||||
use std::{future::Future, pin::Pin};
|
||||
|
||||
/// Filter incoming and outgoing messages.
|
||||
pub trait MessageInterceptor<Sender>: Send + Sync + Clone + 'static
|
||||
where
|
||||
Sender: overseer::SubsystemSender<Self::Message> + Clone + 'static,
|
||||
Sender: overseer::SubsystemSender<<Self::Message as overseer::AssociateOutgoing>::OutgoingMessages>
|
||||
+ Clone
|
||||
+ 'static,
|
||||
{
|
||||
/// The message type the original subsystem handles incoming.
|
||||
type Message: Send + 'static;
|
||||
type Message: overseer::AssociateOutgoing + Send + 'static;
|
||||
|
||||
/// Filter messages that are to be received by
|
||||
/// the subsystem.
|
||||
@@ -46,7 +48,10 @@ where
|
||||
}
|
||||
|
||||
/// Modify outgoing messages.
|
||||
fn intercept_outgoing(&self, msg: AllMessages) -> Option<AllMessages> {
|
||||
fn intercept_outgoing(
|
||||
&self,
|
||||
msg: <Self::Message as overseer::AssociateOutgoing>::OutgoingMessages,
|
||||
) -> Option<<Self::Message as overseer::AssociateOutgoing>::OutgoingMessages> {
|
||||
Some(msg)
|
||||
}
|
||||
}
|
||||
@@ -59,13 +64,26 @@ pub struct InterceptedSender<Sender, Fil> {
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<Sender, Fil> overseer::SubsystemSender<AllMessages> for InterceptedSender<Sender, Fil>
|
||||
impl<OutgoingMessage, Sender, Fil> overseer::SubsystemSender<OutgoingMessage> for InterceptedSender<Sender, Fil>
|
||||
where
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<<Fil as MessageInterceptor<Sender>>::Message>,
|
||||
OutgoingMessage: overseer::AssociateOutgoing + Send + 'static,
|
||||
Sender: overseer::SubsystemSender<OutgoingMessage>
|
||||
+ overseer::SubsystemSender<
|
||||
<
|
||||
<Fil as MessageInterceptor<Sender>>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages
|
||||
>,
|
||||
Fil: MessageInterceptor<Sender>,
|
||||
<Fil as MessageInterceptor<Sender>>::Message: overseer::AssociateOutgoing,
|
||||
<
|
||||
<Fil as MessageInterceptor<Sender>>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages:
|
||||
From<OutgoingMessage>,
|
||||
{
|
||||
async fn send_message(&mut self, msg: AllMessages) {
|
||||
async fn send_message(&mut self, msg: OutgoingMessage) {
|
||||
let msg = <
|
||||
<<Fil as MessageInterceptor<Sender>>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages as From<OutgoingMessage>>::from(msg);
|
||||
if let Some(msg) = self.message_filter.intercept_outgoing(msg) {
|
||||
self.inner.send_message(msg).await;
|
||||
}
|
||||
@@ -73,7 +91,7 @@ where
|
||||
|
||||
async fn send_messages<T>(&mut self, msgs: T)
|
||||
where
|
||||
T: IntoIterator<Item = AllMessages> + Send,
|
||||
T: IntoIterator<Item = OutgoingMessage> + Send,
|
||||
T::IntoIter: Send,
|
||||
{
|
||||
for msg in msgs {
|
||||
@@ -81,7 +99,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn send_unbounded_message(&mut self, msg: AllMessages) {
|
||||
fn send_unbounded_message(&mut self, msg: OutgoingMessage) {
|
||||
let msg = <
|
||||
<<Fil as MessageInterceptor<Sender>>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages as From<OutgoingMessage>>::from(msg);
|
||||
if let Some(msg) = self.message_filter.intercept_outgoing(msg) {
|
||||
self.inner.send_unbounded_message(msg);
|
||||
}
|
||||
@@ -91,11 +112,16 @@ where
|
||||
/// A subsystem context, that filters the outgoing messages.
|
||||
pub struct InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Context: overseer::SubsystemContext<Error=SubsystemError, Signal=OverseerSignal>,
|
||||
Fil: MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
<Context as overseer::SubsystemContext>::Sender:
|
||||
overseer::SubsystemSender<
|
||||
<
|
||||
<
|
||||
Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>
|
||||
>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages,
|
||||
>,
|
||||
{
|
||||
inner: Context,
|
||||
message_filter: Fil,
|
||||
@@ -104,14 +130,15 @@ where
|
||||
|
||||
impl<Context, Fil> InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Context: overseer::SubsystemContext<Error=SubsystemError,Signal=OverseerSignal>,
|
||||
Fil: MessageInterceptor<
|
||||
<Context as overseer::SubsystemContext>::Sender,
|
||||
Message = <Context as overseer::SubsystemContext>::Message,
|
||||
>,
|
||||
<Context as overseer::SubsystemContext>::Message: overseer::AssociateOutgoing,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
<<Context as overseer::SubsystemContext>::Message as overseer::AssociateOutgoing>::OutgoingMessages
|
||||
>
|
||||
{
|
||||
pub fn new(mut inner: Context, message_filter: Fil) -> Self {
|
||||
let sender = InterceptedSender::<<Context as overseer::SubsystemContext>::Sender, Fil> {
|
||||
@@ -125,22 +152,27 @@ where
|
||||
#[async_trait::async_trait]
|
||||
impl<Context, Fil> overseer::SubsystemContext for InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Context: overseer::SubsystemContext<Error=SubsystemError,Signal=OverseerSignal>,
|
||||
<Context as overseer::SubsystemContext>::Message:
|
||||
overseer::AssociateOutgoing,
|
||||
<Context as overseer::SubsystemContext>::Sender:
|
||||
overseer::SubsystemSender<
|
||||
<<Context as overseer::SubsystemContext>::Message as overseer::AssociateOutgoing>::OutgoingMessages
|
||||
>,
|
||||
InterceptedSender<<Context as overseer::SubsystemContext>::Sender, Fil>:
|
||||
overseer::SubsystemSender<
|
||||
<<Context as overseer::SubsystemContext>::Message as overseer::AssociateOutgoing>::OutgoingMessages
|
||||
>,
|
||||
Fil: MessageInterceptor<
|
||||
<Context as overseer::SubsystemContext>::Sender,
|
||||
Message = <Context as overseer::SubsystemContext>::Message,
|
||||
>,
|
||||
<Context as overseer::SubsystemContext>::AllMessages:
|
||||
From<<Context as overseer::SubsystemContext>::Message>,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
{
|
||||
type Message = <Context as overseer::SubsystemContext>::Message;
|
||||
type Sender = InterceptedSender<<Context as overseer::SubsystemContext>::Sender, Fil>;
|
||||
type Error = <Context as overseer::SubsystemContext>::Error;
|
||||
type AllMessages = <Context as overseer::SubsystemContext>::AllMessages;
|
||||
type Signal = <Context as overseer::SubsystemContext>::Signal;
|
||||
type Error = SubsystemError;
|
||||
type OutgoingMessages = <<Context as overseer::SubsystemContext>::Message as overseer::AssociateOutgoing>::OutgoingMessages;
|
||||
type Signal = OverseerSignal;
|
||||
|
||||
async fn try_recv(&mut self) -> Result<Option<FromOverseer<Self::Message>>, ()> {
|
||||
loop {
|
||||
@@ -200,16 +232,28 @@ impl<Sub, Interceptor> InterceptedSubsystem<Sub, Interceptor> {
|
||||
|
||||
impl<Context, Sub, Interceptor> overseer::Subsystem<Context, SubsystemError> for InterceptedSubsystem<Sub, Interceptor>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext + Sync + Send,
|
||||
Sub: overseer::Subsystem<InterceptedContext<Context, Interceptor>, SubsystemError>,
|
||||
InterceptedContext<Context, Interceptor>: overseer::SubsystemContext + SubsystemContext,
|
||||
Interceptor: MessageInterceptor<
|
||||
<Context as overseer::SubsystemContext>::Sender,
|
||||
Message = <Context as overseer::SubsystemContext>::Message,
|
||||
>,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Interceptor as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
Context:
|
||||
overseer::SubsystemContext<Error=SubsystemError,Signal=OverseerSignal> + Sync + Send,
|
||||
InterceptedContext<Context, Interceptor>:
|
||||
overseer::SubsystemContext<Error=SubsystemError,Signal=OverseerSignal>,
|
||||
Sub:
|
||||
overseer::Subsystem<InterceptedContext<Context, Interceptor>, SubsystemError>,
|
||||
Interceptor:
|
||||
MessageInterceptor<
|
||||
<Context as overseer::SubsystemContext>::Sender,
|
||||
Message = <Context as overseer::SubsystemContext>::Message,
|
||||
>,
|
||||
// <Context as overseer::SubsystemContext>::Sender:
|
||||
// overseer::SubsystemSender<
|
||||
// <Interceptor as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
// >,
|
||||
<Context as overseer::SubsystemContext>::Message:
|
||||
overseer::AssociateOutgoing,
|
||||
<Context as overseer::SubsystemContext>::Sender:
|
||||
overseer::SubsystemSender<
|
||||
<<Context as overseer::SubsystemContext>::Message as overseer::AssociateOutgoing
|
||||
>::OutgoingMessages
|
||||
>,
|
||||
{
|
||||
fn start(self, ctx: Context) -> SpawnedSubsystem {
|
||||
let ctx = InterceptedContext::new(ctx, self.message_interceptor);
|
||||
|
||||
@@ -19,8 +19,8 @@ use super::*;
|
||||
use polkadot_node_subsystem_test_helpers::*;
|
||||
|
||||
use polkadot_node_subsystem::{
|
||||
messages::{AllMessages, AvailabilityStoreMessage},
|
||||
overseer::{dummy::DummySubsystem, gen::TimeoutExt, Subsystem},
|
||||
messages::AvailabilityStoreMessage,
|
||||
overseer::{dummy::DummySubsystem, gen::TimeoutExt, Subsystem, AssociateOutgoing},
|
||||
SubsystemError,
|
||||
};
|
||||
|
||||
@@ -29,8 +29,7 @@ struct BlackHoleInterceptor;
|
||||
|
||||
impl<Sender> MessageInterceptor<Sender> for BlackHoleInterceptor
|
||||
where
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<AvailabilityStoreMessage>
|
||||
Sender: overseer::AvailabilityStoreSenderTrait
|
||||
+ Clone
|
||||
+ 'static,
|
||||
{
|
||||
@@ -53,8 +52,7 @@ struct PassInterceptor;
|
||||
|
||||
impl<Sender> MessageInterceptor<Sender> for PassInterceptor
|
||||
where
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<AvailabilityStoreMessage>
|
||||
Sender: overseer::AvailabilityStoreSenderTrait
|
||||
+ Clone
|
||||
+ 'static,
|
||||
{
|
||||
@@ -68,8 +66,8 @@ async fn overseer_send<T: Into<AllMessages>>(overseer: &mut TestSubsystemContext
|
||||
fn launch_harness<F, M, Sub, G>(test_gen: G)
|
||||
where
|
||||
F: Future<Output = TestSubsystemContextHandle<M>> + Send,
|
||||
M: Into<AllMessages> + std::fmt::Debug + Send + 'static,
|
||||
AllMessages: From<M>,
|
||||
M: AssociateOutgoing + std::fmt::Debug + Send + 'static,
|
||||
// <M as AssociateOutgoing>::OutgoingMessages: From<M>,
|
||||
Sub: Subsystem<TestSubsystemContext<M, sp_core::testing::TaskExecutor>, SubsystemError>,
|
||||
G: Fn(TestSubsystemContextHandle<M>) -> (F, Sub),
|
||||
{
|
||||
|
||||
@@ -131,11 +131,7 @@ where
|
||||
subsystem_sender: Sender,
|
||||
response_sender: oneshot::Sender<Result<ValidationResult, ValidationFailed>>,
|
||||
) where
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<CandidateValidationMessage>
|
||||
+ Clone
|
||||
+ Send
|
||||
+ 'static,
|
||||
Sender: overseer::CandidateValidationSenderTrait + Clone + Send + 'static,
|
||||
{
|
||||
let _candidate_descriptor = candidate_descriptor.clone();
|
||||
let mut subsystem_sender = subsystem_sender.clone();
|
||||
@@ -200,11 +196,7 @@ fn create_validation_response(
|
||||
|
||||
impl<Sender, Spawner> MessageInterceptor<Sender> for ReplaceValidationResult<Spawner>
|
||||
where
|
||||
Sender: overseer::SubsystemSender<CandidateValidationMessage>
|
||||
+ overseer::SubsystemSender<AllMessages>
|
||||
+ Clone
|
||||
+ Send
|
||||
+ 'static,
|
||||
Sender: overseer::CandidateValidationSenderTrait + Clone + Send + 'static,
|
||||
Spawner: SpawnNamed + Clone + 'static,
|
||||
{
|
||||
type Message = CandidateValidationMessage;
|
||||
@@ -336,7 +328,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn intercept_outgoing(&self, msg: AllMessages) -> Option<AllMessages> {
|
||||
fn intercept_outgoing(
|
||||
&self,
|
||||
msg: overseer::CandidateValidationOutgoingMessages,
|
||||
) -> Option<overseer::CandidateValidationOutgoingMessages> {
|
||||
Some(msg)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,11 +71,7 @@ struct NoteCandidate<Spawner> {
|
||||
|
||||
impl<Sender, Spawner> MessageInterceptor<Sender> for NoteCandidate<Spawner>
|
||||
where
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<CandidateBackingMessage>
|
||||
+ Clone
|
||||
+ Send
|
||||
+ 'static,
|
||||
Sender: overseer::CandidateBackingSenderTrait + Clone + Send + 'static,
|
||||
Spawner: SpawnNamed + Clone + 'static,
|
||||
{
|
||||
type Message = CandidateBackingMessage;
|
||||
@@ -219,20 +215,21 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn intercept_outgoing(&self, msg: AllMessages) -> Option<AllMessages> {
|
||||
fn intercept_outgoing(
|
||||
&self,
|
||||
msg: overseer::CandidateBackingOutgoingMessages,
|
||||
) -> Option<overseer::CandidateBackingOutgoingMessages> {
|
||||
let msg = match msg {
|
||||
AllMessages::CollatorProtocol(CollatorProtocolMessage::Seconded(
|
||||
relay_parent,
|
||||
statement,
|
||||
)) => {
|
||||
overseer::CandidateBackingOutgoingMessages::CollatorProtocolMessage(
|
||||
CollatorProtocolMessage::Seconded(relay_parent, statement),
|
||||
) => {
|
||||
// `parachain::collator-protocol: received an unexpected `CollationSeconded`: unknown statement statement=...`
|
||||
// TODO: Fix this error. We get this on colaltors because `malicious backing` creates a candidate that gets backed/included.
|
||||
// It is harmless for test parachain collators, but it will prevent cumulus based collators to make progress
|
||||
// as they wait for the relay chain to confirm the seconding of the collation.
|
||||
AllMessages::CollatorProtocol(CollatorProtocolMessage::Seconded(
|
||||
relay_parent,
|
||||
statement,
|
||||
))
|
||||
overseer::CandidateBackingOutgoingMessages::CollatorProtocolMessage(
|
||||
CollatorProtocolMessage::Seconded(relay_parent, statement),
|
||||
)
|
||||
},
|
||||
msg => msg,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user