From 24e41411e65b1b4a06c917ce2d6466aee669f456 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Tue, 31 Jan 2023 11:04:14 -0300 Subject: [PATCH] geyser: backport ReplicaBlockInfoV2 --- core/src/replay_stage.rs | 3 ++ .../src/geyser_plugin_interface.rs | 14 +++++++++ .../src/block_metadata_notifier.rs | 29 +++++++++++++++---- .../src/block_metadata_notifier_interface.rs | 3 ++ runtime/src/bank.rs | 6 ++++ 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 3d92fbdcb7..910f989cc4 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -2628,11 +2628,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) }