Gather recording booleans in a data structure (#134)

This commit is contained in:
Lucas Steuernagel 2024-03-08 09:28:04 -03:00 committed by GitHub
parent 377e1f9112
commit e027a8bd63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 74 additions and 66 deletions

View File

@ -34,6 +34,7 @@ use {
solana_svm::{ solana_svm::{
account_loader::{validate_fee_payer, TransactionCheckResult}, account_loader::{validate_fee_payer, TransactionCheckResult},
transaction_error_metrics::TransactionErrorMetrics, transaction_error_metrics::TransactionErrorMetrics,
transaction_processor::ExecutionRecordingConfig,
}, },
std::{ std::{
sync::{atomic::Ordering, Arc}, sync::{atomic::Ordering, Arc},
@ -593,9 +594,7 @@ impl Consumer {
.load_and_execute_transactions( .load_and_execute_transactions(
batch, batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
transaction_status_sender_enabled, ExecutionRecordingConfig::new_single_setting(transaction_status_sender_enabled),
transaction_status_sender_enabled,
transaction_status_sender_enabled,
&mut execute_and_commit_timings.execute_timings, &mut execute_and_commit_timings.execute_timings,
None, // account_overrides None, // account_overrides
self.log_messages_bytes_limit, self.log_messages_bytes_limit,

View File

@ -57,8 +57,11 @@ use {
VersionedTransaction, VersionedTransaction,
}, },
}, },
solana_svm::transaction_results::{ solana_svm::{
TransactionExecutionDetails, TransactionExecutionResult, TransactionResults, transaction_processor::ExecutionRecordingConfig,
transaction_results::{
TransactionExecutionDetails, TransactionExecutionResult, TransactionResults,
},
}, },
solana_transaction_status::token_balances::TransactionTokenBalancesSet, solana_transaction_status::token_balances::TransactionTokenBalancesSet,
solana_vote::{vote_account::VoteAccountsHashMap, vote_sender_types::ReplayVoteSender}, solana_vote::{vote_account::VoteAccountsHashMap, vote_sender_types::ReplayVoteSender},
@ -163,9 +166,7 @@ pub fn execute_batch(
batch, batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
transaction_status_sender.is_some(), transaction_status_sender.is_some(),
transaction_status_sender.is_some(), ExecutionRecordingConfig::new_single_setting(transaction_status_sender.is_some()),
transaction_status_sender.is_some(),
transaction_status_sender.is_some(),
timings, timings,
log_messages_bytes_limit, log_messages_bytes_limit,
); );
@ -1972,6 +1973,7 @@ pub mod tests {
system_transaction, system_transaction,
transaction::{Transaction, TransactionError}, transaction::{Transaction, TransactionError},
}, },
solana_svm::transaction_processor::ExecutionRecordingConfig,
solana_vote::vote_account::VoteAccount, solana_vote::vote_account::VoteAccount,
solana_vote_program::{ solana_vote_program::{
self, self,
@ -3962,9 +3964,7 @@ pub mod tests {
&batch, &batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
false, ExecutionRecordingConfig::new_single_setting(false),
false,
false,
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
); );

View File

@ -48,6 +48,7 @@ use {
sysvar::{self, clock}, sysvar::{self, clock},
transaction::VersionedTransaction, transaction::VersionedTransaction,
}, },
solana_svm::transaction_processor::ExecutionRecordingConfig,
solana_svm::transaction_results::{ solana_svm::transaction_results::{
DurableNonceFee, InnerInstruction, TransactionExecutionDetails, TransactionExecutionResult, DurableNonceFee, InnerInstruction, TransactionExecutionDetails, TransactionExecutionResult,
TransactionResults, TransactionResults,
@ -104,9 +105,11 @@ fn process_transaction_and_record_inner(
&tx_batch, &tx_batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
true, ExecutionRecordingConfig {
true, enable_cpi_recording: true,
false, enable_log_recording: true,
enable_return_data_recording: false,
},
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
) )
@ -152,9 +155,7 @@ fn execute_transactions(
&batch, &batch,
std::usize::MAX, std::usize::MAX,
true, true,
true, ExecutionRecordingConfig::new_single_setting(true),
true,
true,
&mut timings, &mut timings,
None, None,
); );

View File

@ -269,6 +269,7 @@ pub struct BankRc {
#[cfg(RUSTC_WITH_SPECIALIZATION)] #[cfg(RUSTC_WITH_SPECIALIZATION)]
use solana_frozen_abi::abi_example::AbiExample; use solana_frozen_abi::abi_example::AbiExample;
use solana_svm::transaction_processor::ExecutionRecordingConfig;
#[cfg(RUSTC_WITH_SPECIALIZATION)] #[cfg(RUSTC_WITH_SPECIALIZATION)]
impl AbiExample for BankRc { impl AbiExample for BankRc {
@ -4297,9 +4298,11 @@ impl Bank {
// for processing. During forwarding, the transaction could expire if the // for processing. During forwarding, the transaction could expire if the
// delay is not accounted for. // delay is not accounted for.
MAX_PROCESSING_AGE - MAX_TRANSACTION_FORWARDING_DELAY, MAX_PROCESSING_AGE - MAX_TRANSACTION_FORWARDING_DELAY,
enable_cpi_recording, ExecutionRecordingConfig {
true, enable_cpi_recording,
true, enable_log_recording: true,
enable_return_data_recording: true,
},
&mut timings, &mut timings,
Some(&account_overrides), Some(&account_overrides),
None, None,
@ -4548,9 +4551,7 @@ impl Bank {
&self, &self,
batch: &TransactionBatch, batch: &TransactionBatch,
max_age: usize, max_age: usize,
enable_cpi_recording: bool, recording_config: ExecutionRecordingConfig,
enable_log_recording: bool,
enable_return_data_recording: bool,
timings: &mut ExecuteTimings, timings: &mut ExecuteTimings,
account_overrides: Option<&AccountOverrides>, account_overrides: Option<&AccountOverrides>,
log_messages_bytes_limit: Option<usize>, log_messages_bytes_limit: Option<usize>,
@ -4614,9 +4615,7 @@ impl Bank {
sanitized_txs, sanitized_txs,
&mut check_results, &mut check_results,
&mut error_counters, &mut error_counters,
enable_cpi_recording, recording_config,
enable_log_recording,
enable_return_data_recording,
timings, timings,
account_overrides, account_overrides,
self.builtin_programs.iter(), self.builtin_programs.iter(),
@ -5642,9 +5641,7 @@ impl Bank {
batch: &TransactionBatch, batch: &TransactionBatch,
max_age: usize, max_age: usize,
collect_balances: bool, collect_balances: bool,
enable_cpi_recording: bool, recording_config: ExecutionRecordingConfig,
enable_log_recording: bool,
enable_return_data_recording: bool,
timings: &mut ExecuteTimings, timings: &mut ExecuteTimings,
log_messages_bytes_limit: Option<usize>, log_messages_bytes_limit: Option<usize>,
) -> (TransactionResults, TransactionBalancesSet) { ) -> (TransactionResults, TransactionBalancesSet) {
@ -5665,9 +5662,7 @@ impl Bank {
} = self.load_and_execute_transactions( } = self.load_and_execute_transactions(
batch, batch,
max_age, max_age,
enable_cpi_recording, recording_config,
enable_log_recording,
enable_return_data_recording,
timings, timings,
None, None,
log_messages_bytes_limit, log_messages_bytes_limit,
@ -5735,9 +5730,11 @@ impl Bank {
&batch, &batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, // collect_balances false, // collect_balances
false, // enable_cpi_recording ExecutionRecordingConfig {
true, // enable_log_recording enable_cpi_recording: false,
true, // enable_return_data_recording enable_log_recording: true,
enable_return_data_recording: true,
},
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
Some(1000 * 1000), Some(1000 * 1000),
); );
@ -5773,9 +5770,7 @@ impl Bank {
batch, batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
false, ExecutionRecordingConfig::new_single_setting(false),
false,
false,
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
) )

View File

@ -3122,9 +3122,7 @@ fn test_interleaving_locks() {
&lock_result, &lock_result,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
false, ExecutionRecordingConfig::new_single_setting(false),
false,
false,
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
) )
@ -5948,9 +5946,7 @@ fn test_pre_post_transaction_balances() {
&lock_result, &lock_result,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
true, true,
false, ExecutionRecordingConfig::new_single_setting(false),
false,
false,
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
); );
@ -9230,9 +9226,11 @@ fn test_tx_log_order() {
&batch, &batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
false, ExecutionRecordingConfig {
true, enable_cpi_recording: false,
false, enable_log_recording: true,
enable_return_data_recording: false,
},
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
) )
@ -9338,9 +9336,11 @@ fn test_tx_return_data() {
&batch, &batch,
MAX_PROCESSING_AGE, MAX_PROCESSING_AGE,
false, false,
false, ExecutionRecordingConfig {
false, enable_cpi_recording: false,
true, enable_log_recording: false,
enable_return_data_recording: true,
},
&mut ExecuteTimings::default(), &mut ExecuteTimings::default(),
None, None,
) )

View File

@ -65,6 +65,24 @@ pub struct LoadAndExecuteSanitizedTransactionsOutput {
pub execution_results: Vec<TransactionExecutionResult>, pub execution_results: Vec<TransactionExecutionResult>,
} }
/// Configuration of the recording capabilities for transaction execution
#[derive(Copy, Clone)]
pub struct ExecutionRecordingConfig {
pub enable_cpi_recording: bool,
pub enable_log_recording: bool,
pub enable_return_data_recording: bool,
}
impl ExecutionRecordingConfig {
pub fn new_single_setting(option: bool) -> Self {
ExecutionRecordingConfig {
enable_return_data_recording: option,
enable_log_recording: option,
enable_cpi_recording: option,
}
}
}
pub trait TransactionProcessingCallback { pub trait TransactionProcessingCallback {
fn account_matches_owners(&self, account: &Pubkey, owners: &[Pubkey]) -> Option<usize>; fn account_matches_owners(&self, account: &Pubkey, owners: &[Pubkey]) -> Option<usize>;
@ -184,9 +202,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
sanitized_txs: &[SanitizedTransaction], sanitized_txs: &[SanitizedTransaction],
check_results: &mut [TransactionCheckResult], check_results: &mut [TransactionCheckResult],
error_counters: &mut TransactionErrorMetrics, error_counters: &mut TransactionErrorMetrics,
enable_cpi_recording: bool, recording_config: ExecutionRecordingConfig,
enable_log_recording: bool,
enable_return_data_recording: bool,
timings: &mut ExecuteTimings, timings: &mut ExecuteTimings,
account_overrides: Option<&AccountOverrides>, account_overrides: Option<&AccountOverrides>,
builtin_programs: impl Iterator<Item = &'a Pubkey>, builtin_programs: impl Iterator<Item = &'a Pubkey>,
@ -266,9 +282,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
loaded_transaction, loaded_transaction,
compute_budget, compute_budget,
nonce.as_ref().map(DurableNonceFee::from), nonce.as_ref().map(DurableNonceFee::from),
enable_cpi_recording, recording_config,
enable_log_recording,
enable_return_data_recording,
timings, timings,
error_counters, error_counters,
log_messages_bytes_limit, log_messages_bytes_limit,
@ -466,9 +480,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
loaded_transaction: &mut LoadedTransaction, loaded_transaction: &mut LoadedTransaction,
compute_budget: ComputeBudget, compute_budget: ComputeBudget,
durable_nonce_fee: Option<DurableNonceFee>, durable_nonce_fee: Option<DurableNonceFee>,
enable_cpi_recording: bool, recording_config: ExecutionRecordingConfig,
enable_log_recording: bool,
enable_return_data_recording: bool,
timings: &mut ExecuteTimings, timings: &mut ExecuteTimings,
error_counters: &mut TransactionErrorMetrics, error_counters: &mut TransactionErrorMetrics,
log_messages_bytes_limit: Option<usize>, log_messages_bytes_limit: Option<usize>,
@ -506,7 +518,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
tx.message(), tx.message(),
); );
let log_collector = if enable_log_recording { let log_collector = if recording_config.enable_log_recording {
match log_messages_bytes_limit { match log_messages_bytes_limit {
None => Some(LogCollector::new_ref()), None => Some(LogCollector::new_ref()),
Some(log_messages_bytes_limit) => Some(LogCollector::new_ref_with_limit(Some( Some(log_messages_bytes_limit) => Some(LogCollector::new_ref_with_limit(Some(
@ -585,7 +597,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
.ok() .ok()
}); });
let inner_instructions = if enable_cpi_recording { let inner_instructions = if recording_config.enable_cpi_recording {
Some(Self::inner_instructions_list_from_instruction_trace( Some(Self::inner_instructions_list_from_instruction_trace(
&transaction_context, &transaction_context,
)) ))
@ -616,11 +628,12 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
); );
saturating_add_assign!(timings.details.changed_account_count, touched_account_count); saturating_add_assign!(timings.details.changed_account_count, touched_account_count);
let return_data = if enable_return_data_recording && !return_data.data.is_empty() { let return_data =
Some(return_data) if recording_config.enable_return_data_recording && !return_data.data.is_empty() {
} else { Some(return_data)
None } else {
}; None
};
TransactionExecutionResult::Executed { TransactionExecutionResult::Executed {
details: TransactionExecutionDetails { details: TransactionExecutionDetails {