mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-24 15:55:49 +00:00
add dispute metrics, some chores (#3842)
* rename: MsgFilter -> MessageInterceptor * feat: add dispute metrics * fixup * test fixins * fix metrics * dummysubsystem export and trait fn fix * chore: fmt * undo unwanted changes * foo * pfmt * fixup * fixup * revert * some more * Update node/malus/Cargo.toml Co-authored-by: Andronik Ordian <write@reusable.software> * Update node/core/dispute-coordinator/src/metrics.rs Co-authored-by: Andronik Ordian <write@reusable.software> * Update node/core/dispute-coordinator/src/metrics.rs Co-authored-by: Andronik Ordian <write@reusable.software> * Update node/core/dispute-coordinator/src/metrics.rs Co-authored-by: Andronik Ordian <write@reusable.software> * add license header * fix lockfile * new with opts * fmt * Update node/core/dispute-coordinator/src/metrics.rs * feature gate Co-authored-by: Andronik Ordian <write@reusable.software>
This commit is contained in:
committed by
GitHub
parent
6fa18a2339
commit
cc8b861271
@@ -24,38 +24,52 @@ use polkadot_node_subsystem::*;
|
||||
pub use polkadot_node_subsystem::{messages::AllMessages, overseer, FromOverseer};
|
||||
use std::{future::Future, pin::Pin};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
/// Filter incoming and outgoing messages.
|
||||
pub trait MsgFilter: Send + Sync + Clone + 'static {
|
||||
pub trait MessageInterceptor<Sender>: Send + Sync + Clone + 'static
|
||||
where
|
||||
Sender: overseer::SubsystemSender<Self::Message> + Clone + 'static,
|
||||
{
|
||||
/// The message type the original subsystem handles incoming.
|
||||
type Message: Send + 'static;
|
||||
|
||||
/// Filter messages that are to be received by
|
||||
/// the subsystem.
|
||||
fn filter_in(&self, msg: FromOverseer<Self::Message>) -> Option<FromOverseer<Self::Message>> {
|
||||
///
|
||||
/// For non-trivial cases, the `sender` can be used to send
|
||||
/// multiple messages after doing some additional processing.
|
||||
fn intercept_incoming(
|
||||
&self,
|
||||
_sender: &mut Sender,
|
||||
msg: FromOverseer<Self::Message>,
|
||||
) -> Option<FromOverseer<Self::Message>> {
|
||||
Some(msg)
|
||||
}
|
||||
|
||||
/// Modify outgoing messages.
|
||||
fn filter_out(&self, msg: AllMessages) -> Option<AllMessages> {
|
||||
fn intercept_outgoing(&self, msg: AllMessages) -> Option<AllMessages> {
|
||||
Some(msg)
|
||||
}
|
||||
}
|
||||
|
||||
/// A sender with the outgoing messages filtered.
|
||||
#[derive(Clone)]
|
||||
pub struct FilteredSender<Sender, Fil> {
|
||||
pub struct InterceptedSender<Sender, Fil> {
|
||||
inner: Sender,
|
||||
message_filter: Fil,
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<Sender, Fil> overseer::SubsystemSender<AllMessages> for FilteredSender<Sender, Fil>
|
||||
impl<Sender, Fil> overseer::SubsystemSender<AllMessages> for InterceptedSender<Sender, Fil>
|
||||
where
|
||||
Sender: overseer::SubsystemSender<AllMessages>,
|
||||
Fil: MsgFilter,
|
||||
Sender: overseer::SubsystemSender<AllMessages>
|
||||
+ overseer::SubsystemSender<<Fil as MessageInterceptor<Sender>>::Message>,
|
||||
Fil: MessageInterceptor<Sender>,
|
||||
{
|
||||
async fn send_message(&mut self, msg: AllMessages) {
|
||||
if let Some(msg) = self.message_filter.filter_out(msg) {
|
||||
if let Some(msg) = self.message_filter.intercept_outgoing(msg) {
|
||||
self.inner.send_message(msg).await;
|
||||
}
|
||||
}
|
||||
@@ -71,26 +85,39 @@ where
|
||||
}
|
||||
|
||||
fn send_unbounded_message(&mut self, msg: AllMessages) {
|
||||
if let Some(msg) = self.message_filter.filter_out(msg) {
|
||||
if let Some(msg) = self.message_filter.intercept_outgoing(msg) {
|
||||
self.inner.send_unbounded_message(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A subsystem context, that filters the outgoing messages.
|
||||
pub struct FilteredContext<Context: overseer::SubsystemContext + SubsystemContext, Fil: MsgFilter> {
|
||||
inner: Context,
|
||||
message_filter: Fil,
|
||||
sender: FilteredSender<<Context as overseer::SubsystemContext>::Sender, Fil>,
|
||||
}
|
||||
|
||||
impl<Context, Fil> FilteredContext<Context, Fil>
|
||||
pub struct InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Fil: MsgFilter<Message = <Context as overseer::SubsystemContext>::Message>,
|
||||
Fil: MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
{
|
||||
inner: Context,
|
||||
message_filter: Fil,
|
||||
sender: InterceptedSender<<Context as overseer::SubsystemContext>::Sender, Fil>,
|
||||
}
|
||||
|
||||
impl<Context, Fil> InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Fil: MessageInterceptor<
|
||||
<Context as overseer::SubsystemContext>::Sender,
|
||||
Message = <Context as overseer::SubsystemContext>::Message,
|
||||
>,
|
||||
<Context as overseer::SubsystemContext>::Sender: overseer::SubsystemSender<
|
||||
<Fil as MessageInterceptor<<Context as overseer::SubsystemContext>::Sender>>::Message,
|
||||
>,
|
||||
{
|
||||
pub fn new(mut inner: Context, message_filter: Fil) -> Self {
|
||||
let sender = FilteredSender::<<Context as overseer::SubsystemContext>::Sender, Fil> {
|
||||
let sender = InterceptedSender::<<Context as overseer::SubsystemContext>::Sender, Fil> {
|
||||
inner: inner.sender().clone(),
|
||||
message_filter: message_filter.clone(),
|
||||
};
|
||||
@@ -99,15 +126,21 @@ where
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<Context, Fil> overseer::SubsystemContext for FilteredContext<Context, Fil>
|
||||
impl<Context, Fil> overseer::SubsystemContext for InterceptedContext<Context, Fil>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext,
|
||||
Fil: MsgFilter<Message = <Context as overseer::SubsystemContext>::Message>,
|
||||
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 = FilteredSender<<Context as overseer::SubsystemContext>::Sender, Fil>;
|
||||
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;
|
||||
@@ -117,7 +150,9 @@ where
|
||||
match self.inner.try_recv().await? {
|
||||
None => return Ok(None),
|
||||
Some(msg) =>
|
||||
if let Some(msg) = self.message_filter.filter_in(msg) {
|
||||
if let Some(msg) =
|
||||
self.message_filter.intercept_incoming(self.inner.sender(), msg)
|
||||
{
|
||||
return Ok(Some(msg))
|
||||
},
|
||||
}
|
||||
@@ -127,7 +162,7 @@ where
|
||||
async fn recv(&mut self) -> SubsystemResult<FromOverseer<Self::Message>> {
|
||||
loop {
|
||||
let msg = self.inner.recv().await?;
|
||||
if let Some(msg) = self.message_filter.filter_in(msg) {
|
||||
if let Some(msg) = self.message_filter.intercept_incoming(self.inner.sender(), msg) {
|
||||
return Ok(msg)
|
||||
}
|
||||
}
|
||||
@@ -155,27 +190,33 @@ where
|
||||
}
|
||||
|
||||
/// A subsystem to which incoming and outgoing filters are applied.
|
||||
pub struct FilteredSubsystem<Sub, Fil> {
|
||||
subsystem: Sub,
|
||||
message_filter: Fil,
|
||||
pub struct InterceptedSubsystem<Sub, Interceptor> {
|
||||
pub subsystem: Sub,
|
||||
pub message_interceptor: Interceptor,
|
||||
}
|
||||
|
||||
impl<Sub, Fil> FilteredSubsystem<Sub, Fil> {
|
||||
pub fn new(subsystem: Sub, message_filter: Fil) -> Self {
|
||||
Self { subsystem, message_filter }
|
||||
impl<Sub, Interceptor> InterceptedSubsystem<Sub, Interceptor> {
|
||||
pub fn new(subsystem: Sub, message_interceptor: Interceptor) -> Self {
|
||||
Self { subsystem, message_interceptor }
|
||||
}
|
||||
}
|
||||
|
||||
impl<Context, Sub, Fil> overseer::Subsystem<Context, SubsystemError> for FilteredSubsystem<Sub, Fil>
|
||||
impl<Context, Sub, Interceptor> overseer::Subsystem<Context, SubsystemError> for InterceptedSubsystem<Sub, Interceptor>
|
||||
where
|
||||
Context: overseer::SubsystemContext + SubsystemContext + Sync + Send,
|
||||
Sub: overseer::Subsystem<FilteredContext<Context, Fil>, SubsystemError>,
|
||||
FilteredContext<Context, Fil>: overseer::SubsystemContext + SubsystemContext,
|
||||
Fil: MsgFilter<Message = <Context as overseer::SubsystemContext>::Message>,
|
||||
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,
|
||||
>,
|
||||
{
|
||||
fn start(self, ctx: Context) -> SpawnedSubsystem {
|
||||
let ctx = FilteredContext::new(ctx, self.message_filter);
|
||||
overseer::Subsystem::<FilteredContext<Context, Fil>, SubsystemError>::start(
|
||||
let ctx = InterceptedContext::new(ctx, self.message_interceptor);
|
||||
overseer::Subsystem::<InterceptedContext<Context, Interceptor>, SubsystemError>::start(
|
||||
self.subsystem,
|
||||
ctx,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user