diff --git a/Cargo.lock b/Cargo.lock index 4c51b59e52..d6d0b96953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6828,15 +6828,15 @@ dependencies = [ [[package]] name = "systemstat" -version = "0.1.11" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5dc96f7634f46ac7e485b8c051f5b89ec8ee5cc023236dd12fe4ae2fb52f80" +checksum = "a24aec24a9312c83999a28e3ef9db7e2afd5c64bf47725b758cdc1cafd5b0bd2" dependencies = [ "bytesize", - "chrono", "lazy_static", "libc", "nom", + "time 0.3.9", "winapi 0.3.9", ] diff --git a/client-test/Cargo.toml b/client-test/Cargo.toml index 90540d0984..80d8c10d30 100644 --- a/client-test/Cargo.toml +++ b/client-test/Cargo.toml @@ -28,7 +28,7 @@ solana-streamer = { path = "../streamer", version = "=1.14.16" } solana-test-validator = { path = "../test-validator", version = "=1.14.16" } solana-transaction-status = { path = "../transaction-status", version = "=1.14.16" } solana-version = { path = "../version", version = "=1.14.16" } -systemstat = "0.1.11" +systemstat = "0.2.3" tokio = { version = "~1.14.1", features = ["full"] } [dev-dependencies] diff --git a/core/Cargo.toml b/core/Cargo.toml index 186a1ed9c0..caf459cd9a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -75,7 +75,7 @@ solana-logger = { path = "../logger", version = "=1.14.16" } solana-program-runtime = { path = "../program-runtime", version = "=1.14.16" } solana-stake-program = { path = "../programs/stake", version = "=1.14.16" } static_assertions = "1.1.0" -systemstat = "0.1.11" +systemstat = "0.2.3" test-case = "2.1.0" [target."cfg(unix)".dependencies] diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index ba9158e124..b191147aee 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -2600,11 +2600,14 @@ impl ReplayStage { if let Some(ref block_metadata_notifier) = block_metadata_notifier { let block_metadata_notifier = block_metadata_notifier.read().unwrap(); block_metadata_notifier.notify_block_metadata( + bank.parent_slot(), + &bank.parent_hash().to_string(), bank.slot(), &bank.last_blockhash().to_string(), &bank.rewards, Some(bank.clock().unix_timestamp), Some(bank.block_height()), + bank.executed_transaction_count(), ) } bank_complete_time.stop(); diff --git a/geyser-plugin-interface/src/geyser_plugin_interface.rs b/geyser-plugin-interface/src/geyser_plugin_interface.rs index 4b49701b7f..01279b28f7 100644 --- a/geyser-plugin-interface/src/geyser_plugin_interface.rs +++ b/geyser-plugin-interface/src/geyser_plugin_interface.rs @@ -133,8 +133,22 @@ pub struct ReplicaBlockInfo<'a> { pub block_height: Option, } +/// Extending ReplicaBlockInfo by sending the transaction_entries_count. +#[derive(Clone, Debug)] +pub struct ReplicaBlockInfoV2<'a> { + pub parent_slot: u64, + pub parent_blockhash: &'a str, + pub slot: u64, + pub blockhash: &'a str, + pub rewards: &'a [Reward], + pub block_time: Option, + pub block_height: Option, + pub executed_transaction_count: u64, +} + pub enum ReplicaBlockInfoVersions<'a> { V0_0_1(&'a ReplicaBlockInfo<'a>), + V0_0_2(&'a ReplicaBlockInfoV2<'a>), } /// Errors returned by plugin calls diff --git a/geyser-plugin-manager/src/block_metadata_notifier.rs b/geyser-plugin-manager/src/block_metadata_notifier.rs index 3e9a85a9ea..743c1a52d0 100644 --- a/geyser-plugin-manager/src/block_metadata_notifier.rs +++ b/geyser-plugin-manager/src/block_metadata_notifier.rs @@ -5,7 +5,7 @@ use { }, log::*, solana_geyser_plugin_interface::geyser_plugin_interface::{ - ReplicaBlockInfo, ReplicaBlockInfoVersions, + ReplicaBlockInfoV2, ReplicaBlockInfoVersions, }, solana_measure::measure::Measure, solana_metrics::*, @@ -23,11 +23,14 @@ impl BlockMetadataNotifier for BlockMetadataNotifierImpl { /// Notify the block metadata fn notify_block_metadata( &self, + parent_slot: u64, + parent_blockhash: &str, slot: u64, blockhash: &str, rewards: &RwLock>, block_time: Option, block_height: Option, + executed_transaction_count: u64, ) { let mut plugin_manager = self.plugin_manager.write().unwrap(); if plugin_manager.plugins.is_empty() { @@ -37,9 +40,17 @@ impl BlockMetadataNotifier for BlockMetadataNotifierImpl { for plugin in plugin_manager.plugins.iter_mut() { let mut measure = Measure::start("geyser-plugin-update-slot"); - let block_info = - Self::build_replica_block_info(slot, blockhash, &rewards, block_time, block_height); - let block_info = ReplicaBlockInfoVersions::V0_0_1(&block_info); + let block_info = Self::build_replica_block_info( + parent_slot, + parent_blockhash, + slot, + blockhash, + &rewards, + block_time, + block_height, + executed_transaction_count, + ); + let block_info = ReplicaBlockInfoVersions::V0_0_2(&block_info); match plugin.notify_block_metadata(block_info) { Err(err) => { error!( @@ -84,18 +95,24 @@ impl BlockMetadataNotifierImpl { } fn build_replica_block_info<'a>( + parent_slot: u64, + parent_blockhash: &'a str, slot: u64, blockhash: &'a str, rewards: &'a [Reward], block_time: Option, block_height: Option, - ) -> ReplicaBlockInfo<'a> { - ReplicaBlockInfo { + executed_transaction_count: u64, + ) -> ReplicaBlockInfoV2<'a> { + ReplicaBlockInfoV2 { + parent_slot, + parent_blockhash, slot, blockhash, rewards, block_time, block_height, + executed_transaction_count, } } diff --git a/geyser-plugin-manager/src/block_metadata_notifier_interface.rs b/geyser-plugin-manager/src/block_metadata_notifier_interface.rs index 6d4b9f6ad2..663443c6e3 100644 --- a/geyser-plugin-manager/src/block_metadata_notifier_interface.rs +++ b/geyser-plugin-manager/src/block_metadata_notifier_interface.rs @@ -9,11 +9,14 @@ pub trait BlockMetadataNotifier { /// Notify the block metadata fn notify_block_metadata( &self, + parent_slot: u64, + parent_blockhash: &str, slot: u64, blockhash: &str, rewards: &RwLock>, block_time: Option, block_height: Option, + executed_transaction_count: u64, ); } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 6938379547..2227d0e771 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -6542,6 +6542,12 @@ impl Bank { self.transaction_count.load(Relaxed) } + /// Return the transaction count executed only in this bank + pub fn executed_transaction_count(&self) -> u64 { + self.transaction_count() + .saturating_sub(self.parent().map_or(0, |parent| parent.transaction_count())) + } + pub fn transaction_error_count(&self) -> u64 { self.transaction_error_count.load(Relaxed) }