* Refactor: Improve type safety and readability of transaction execution (#22215) * resolve conflicts Co-authored-by: Justin Starry <justin@solana.com>
This commit is contained in:
@ -804,22 +804,23 @@ impl BankingStage {
|
||||
fn record_transactions(
|
||||
bank_slot: Slot,
|
||||
txs: &[SanitizedTransaction],
|
||||
results: &[TransactionExecutionResult],
|
||||
execution_results: &[TransactionExecutionResult],
|
||||
recorder: &TransactionRecorder,
|
||||
) -> (Result<usize, PohRecorderError>, Vec<usize>) {
|
||||
let mut processed_generation = Measure::start("record::process_generation");
|
||||
let (processed_transactions, processed_transactions_indexes): (Vec<_>, Vec<_>) = results
|
||||
.iter()
|
||||
.zip(txs)
|
||||
.enumerate()
|
||||
.filter_map(|(i, ((r, _n), tx))| {
|
||||
if Bank::can_commit(r) {
|
||||
Some((tx.to_versioned_transaction(), i))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.unzip();
|
||||
let (processed_transactions, processed_transactions_indexes): (Vec<_>, Vec<_>) =
|
||||
execution_results
|
||||
.iter()
|
||||
.zip(txs)
|
||||
.enumerate()
|
||||
.filter_map(|(i, (execution_result, tx))| {
|
||||
if execution_result.was_executed() {
|
||||
Some((tx.to_versioned_transaction(), i))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.unzip();
|
||||
|
||||
processed_generation.stop();
|
||||
let num_to_commit = processed_transactions.len();
|
||||
@ -885,28 +886,25 @@ impl BankingStage {
|
||||
};
|
||||
|
||||
let mut execute_timings = ExecuteTimings::default();
|
||||
let (
|
||||
mut loaded_accounts,
|
||||
results,
|
||||
inner_instructions,
|
||||
transaction_logs,
|
||||
mut retryable_txs,
|
||||
tx_count,
|
||||
signature_count,
|
||||
) = bank.load_and_execute_transactions(
|
||||
batch,
|
||||
MAX_PROCESSING_AGE,
|
||||
transaction_status_sender.is_some(),
|
||||
transaction_status_sender.is_some(),
|
||||
&mut execute_timings,
|
||||
);
|
||||
let (mut loaded_accounts, execution_results, mut retryable_txs, tx_count, signature_count) =
|
||||
bank.load_and_execute_transactions(
|
||||
batch,
|
||||
MAX_PROCESSING_AGE,
|
||||
transaction_status_sender.is_some(),
|
||||
transaction_status_sender.is_some(),
|
||||
&mut execute_timings,
|
||||
);
|
||||
load_execute_time.stop();
|
||||
|
||||
let freeze_lock = bank.freeze_lock();
|
||||
|
||||
let mut record_time = Measure::start("record_time");
|
||||
let (num_to_commit, retryable_record_txs) =
|
||||
Self::record_transactions(bank.slot(), batch.sanitized_transactions(), &results, poh);
|
||||
let (num_to_commit, retryable_record_txs) = Self::record_transactions(
|
||||
bank.slot(),
|
||||
batch.sanitized_transactions(),
|
||||
&execution_results,
|
||||
poh,
|
||||
);
|
||||
inc_new_counter_info!(
|
||||
"banking_stage-record_transactions_num_to_commit",
|
||||
*num_to_commit.as_ref().unwrap_or(&0)
|
||||
@ -928,7 +926,7 @@ impl BankingStage {
|
||||
let tx_results = bank.commit_transactions(
|
||||
sanitized_txs,
|
||||
&mut loaded_accounts,
|
||||
&results,
|
||||
execution_results,
|
||||
tx_count,
|
||||
signature_count,
|
||||
&mut execute_timings,
|
||||
@ -945,8 +943,6 @@ impl BankingStage {
|
||||
tx_results.execution_results,
|
||||
TransactionBalancesSet::new(pre_balances, post_balances),
|
||||
TransactionTokenBalancesSet::new(pre_token_balances, post_token_balances),
|
||||
inner_instructions,
|
||||
transaction_logs,
|
||||
tx_results.rent_debits,
|
||||
);
|
||||
}
|
||||
@ -1609,6 +1605,7 @@ mod tests {
|
||||
poh_service::PohService,
|
||||
},
|
||||
solana_rpc::transaction_status_service::TransactionStatusService,
|
||||
solana_runtime::bank::TransactionExecutionDetails,
|
||||
solana_sdk::{
|
||||
hash::Hash,
|
||||
instruction::InstructionError,
|
||||
@ -1640,6 +1637,15 @@ mod tests {
|
||||
)
|
||||
}
|
||||
|
||||
fn new_execution_result(status: Result<(), TransactionError>) -> TransactionExecutionResult {
|
||||
TransactionExecutionResult::Executed(TransactionExecutionDetails {
|
||||
status,
|
||||
log_messages: None,
|
||||
inner_instructions: None,
|
||||
durable_nonce_fee: None,
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_banking_stage_shutdown1() {
|
||||
let genesis_config = create_genesis_config(2).genesis_config;
|
||||
@ -2027,19 +2033,16 @@ mod tests {
|
||||
system_transaction::transfer(&keypair2, &pubkey2, 1, genesis_config.hash()),
|
||||
]);
|
||||
|
||||
let mut results = vec![(Ok(()), None), (Ok(()), None)];
|
||||
let mut results = vec![new_execution_result(Ok(())); 2];
|
||||
let _ = BankingStage::record_transactions(bank.slot(), &txs, &results, &recorder);
|
||||
let (_bank, (entry, _tick_height)) = entry_receiver.recv().unwrap();
|
||||
assert_eq!(entry.transactions.len(), txs.len());
|
||||
|
||||
// InstructionErrors should still be recorded
|
||||
results[0] = (
|
||||
Err(TransactionError::InstructionError(
|
||||
1,
|
||||
SystemError::ResultWithNegativeLamports.into(),
|
||||
)),
|
||||
None,
|
||||
);
|
||||
results[0] = new_execution_result(Err(TransactionError::InstructionError(
|
||||
1,
|
||||
SystemError::ResultWithNegativeLamports.into(),
|
||||
)));
|
||||
let (res, retryable) =
|
||||
BankingStage::record_transactions(bank.slot(), &txs, &results, &recorder);
|
||||
res.unwrap();
|
||||
@ -2048,7 +2051,7 @@ mod tests {
|
||||
assert_eq!(entry.transactions.len(), txs.len());
|
||||
|
||||
// Other TransactionErrors should not be recorded
|
||||
results[0] = (Err(TransactionError::AccountNotFound), None);
|
||||
results[0] = TransactionExecutionResult::NotExecuted(TransactionError::AccountNotFound);
|
||||
let (res, retryable) =
|
||||
BankingStage::record_transactions(bank.slot(), &txs, &results, &recorder);
|
||||
res.unwrap();
|
||||
|
Reference in New Issue
Block a user