Gather recording booleans in a data structure (#134)
This commit is contained in:
parent
377e1f9112
commit
e027a8bd63
|
@ -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,
|
||||||
|
|
|
@ -57,9 +57,12 @@ use {
|
||||||
VersionedTransaction,
|
VersionedTransaction,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
solana_svm::transaction_results::{
|
solana_svm::{
|
||||||
|
transaction_processor::ExecutionRecordingConfig,
|
||||||
|
transaction_results::{
|
||||||
TransactionExecutionDetails, TransactionExecutionResult, TransactionResults,
|
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},
|
||||||
std::{
|
std::{
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,
|
||||||
|
ExecutionRecordingConfig {
|
||||||
enable_cpi_recording,
|
enable_cpi_recording,
|
||||||
true,
|
enable_log_recording: true,
|
||||||
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,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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,7 +628,8 @@ 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 =
|
||||||
|
if recording_config.enable_return_data_recording && !return_data.data.is_empty() {
|
||||||
Some(return_data)
|
Some(return_data)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
Loading…
Reference in New Issue