diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index b172681094564..be3e64984427b 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -48,7 +48,10 @@ use sc_executor::{NativeExecutor, NativeExecutionDispatch, RuntimeInfo}; use std::{ collections::HashMap, io::{Read, Write, Seek}, - marker::PhantomData, sync::Arc, pin::Pin + marker::PhantomData, + pin::Pin, + sync::Arc, + sync::atomic::{AtomicU64, Ordering}, }; use wasm_timer::SystemTime; use sc_telemetry::{telemetry, SUBSTRATE_INFO}; @@ -96,8 +99,9 @@ pub struct ServiceBuilder, rpc_extensions: TRpc, remote_backend: Option>>, - marker: PhantomData<(TBl, TRtApi)>, block_announce_validator_builder: Option) -> Box + Send> + Send>>, + pub (crate) rejected_blocks_number: Arc, + marker: PhantomData<(TBl, TRtApi)>, } /// Full client type. @@ -312,6 +316,7 @@ impl ServiceBuilder<(), (), (), (), (), (), (), (), (), (), ()> { rpc_extensions: Default::default(), remote_backend: None, block_announce_validator_builder: None, + rejected_blocks_number: Arc::new(AtomicU64::new(0)), marker: PhantomData, }) } @@ -395,6 +400,7 @@ impl ServiceBuilder<(), (), (), (), (), (), (), (), (), (), ()> { rpc_extensions: Default::default(), remote_backend: Some(remote_blockchain), block_announce_validator_builder: None, + rejected_blocks_number: Arc::new(AtomicU64::new(0)), marker: PhantomData, }) } @@ -468,6 +474,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -512,6 +519,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -550,6 +558,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -614,6 +623,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -677,6 +687,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -705,6 +716,7 @@ impl rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -733,6 +745,7 @@ impl rpc_extensions: self.rpc_extensions, remote_backend: self.remote_backend, block_announce_validator_builder: Some(Box::new(block_announce_validator_builder)), + rejected_blocks_number: self.rejected_blocks_number, marker: self.marker, }) } @@ -851,6 +864,7 @@ ServiceBuilder< rpc_extensions, remote_backend, block_announce_validator_builder, + rejected_blocks_number, } = self; sp_session::generate_initial_session_keys( @@ -1065,6 +1079,7 @@ ServiceBuilder< &info, &transaction_pool_.status(), &net_status, + rejected_blocks_number.load(Ordering::Relaxed) ); ready(()) }); diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 612e9310d182b..a2f40dd71c9e7 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -36,7 +36,12 @@ use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use sp_core::storage::{StorageKey, well_known_keys, ChildInfo, Storage, StorageChild, StorageMap}; use sc_client_api::{StorageProvider, BlockBackend, UsageProvider}; -use std::{io::{Read, Write, Seek}, pin::Pin, collections::HashMap}; +use std::{ + collections::HashMap, + io::{Read, Write, Seek}, + pin::Pin, + sync::atomic::Ordering, +}; /// Build a chain spec json pub fn build_spec(spec: &dyn ChainSpec, raw: bool) -> error::Result { @@ -104,6 +109,7 @@ impl< let mut count = None::; let mut read_block_count = 0; let mut link = WaitLink::new(); + let rejected_blocks_number = self.rejected_blocks_number.clone(); // Importing blocks is implemented as a future, because we want the operation to be // interruptible. @@ -175,6 +181,7 @@ impl< "Stopping after #{} blocks because of an error", link.imported_blocks, ); + rejected_blocks_number.fetch_add(1, Ordering::Relaxed); return std::task::Poll::Ready(Ok(())); } diff --git a/client/service/src/metrics.rs b/client/service/src/metrics.rs index 6456f9b1ee0be..cb53e88c73d5d 100644 --- a/client/service/src/metrics.rs +++ b/client/service/src/metrics.rs @@ -50,6 +50,7 @@ struct PrometheusMetrics { block_height: GaugeVec, number_leaves: Gauge, ready_transactions_number: Gauge, + rejected_blocks_number: Gauge, // I/O network_per_sec_bytes: GaugeVec, @@ -125,6 +126,10 @@ impl PrometheusMetrics { "ready_transactions_number", "Number of transactions in the ready queue", )?, registry)?, + rejected_blocks_number: register(Gauge::new( + "rejected_blocks_number", "Number of blocks rejected as invalid", + )?, registry)?, + // I/ O network_per_sec_bytes: register(GaugeVec::new( Opts::new("network_per_sec_bytes", "Networking bytes per second"), @@ -313,6 +318,7 @@ impl MetricsService { info: &ClientInfo, txpool_status: &PoolStatus, net_status: &NetworkStatus, + rejected_blocks_number: u64, ) { let best_number = info.chain.best_number.saturated_into::(); @@ -387,6 +393,8 @@ impl MetricsService { metrics.ready_transactions_number.set(txpool_status.ready as u64); + metrics.rejected_blocks_number.set(rejected_blocks_number); + if let Some(best_seen_block) = best_seen_block { metrics.block_height.with_label_values(&["sync_target"]).set(best_seen_block); }