2023-01-25 19:02:21 -08:00
|
|
|
use {
|
|
|
|
super::PreBalanceInfo,
|
|
|
|
crate::leader_slot_banking_stage_timing_metrics::LeaderExecuteAndCommitTimings,
|
|
|
|
solana_ledger::{
|
|
|
|
blockstore_processor::TransactionStatusSender, token_balances::collect_token_balances,
|
|
|
|
},
|
2023-02-01 15:44:53 -08:00
|
|
|
solana_measure::{measure, measure_us},
|
2023-01-25 19:02:21 -08:00
|
|
|
solana_runtime::{
|
|
|
|
accounts::TransactionLoadResult,
|
|
|
|
bank::{
|
|
|
|
Bank, CommitTransactionCounts, TransactionBalancesSet, TransactionExecutionResult,
|
|
|
|
TransactionResults,
|
|
|
|
},
|
|
|
|
bank_utils,
|
|
|
|
transaction_batch::TransactionBatch,
|
|
|
|
vote_sender_types::ReplayVoteSender,
|
|
|
|
},
|
2023-02-01 15:44:53 -08:00
|
|
|
solana_sdk::saturating_add_assign,
|
2023-01-25 19:02:21 -08:00
|
|
|
solana_transaction_status::token_balances::TransactionTokenBalancesSet,
|
|
|
|
std::sync::Arc,
|
|
|
|
};
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
|
|
pub enum CommitTransactionDetails {
|
|
|
|
Committed { compute_units: u64 },
|
|
|
|
NotCommitted,
|
|
|
|
}
|
|
|
|
|
2023-02-09 13:22:42 -08:00
|
|
|
pub struct Committer {
|
|
|
|
transaction_status_sender: Option<TransactionStatusSender>,
|
|
|
|
replay_vote_sender: ReplayVoteSender,
|
|
|
|
}
|
2023-01-25 19:02:21 -08:00
|
|
|
|
|
|
|
impl Committer {
|
2023-02-09 13:22:42 -08:00
|
|
|
pub fn new(
|
|
|
|
transaction_status_sender: Option<TransactionStatusSender>,
|
|
|
|
replay_vote_sender: ReplayVoteSender,
|
|
|
|
) -> Self {
|
|
|
|
Self {
|
|
|
|
transaction_status_sender,
|
|
|
|
replay_vote_sender,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(super) fn transaction_status_sender_enabled(&self) -> bool {
|
|
|
|
self.transaction_status_sender.is_some()
|
|
|
|
}
|
|
|
|
|
2023-01-25 19:02:21 -08:00
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
|
|
pub(super) fn commit_transactions(
|
2023-02-09 13:22:42 -08:00
|
|
|
&self,
|
2023-01-25 19:02:21 -08:00
|
|
|
batch: &TransactionBatch,
|
|
|
|
loaded_transactions: &mut [TransactionLoadResult],
|
|
|
|
execution_results: Vec<TransactionExecutionResult>,
|
|
|
|
starting_transaction_index: Option<usize>,
|
|
|
|
bank: &Arc<Bank>,
|
|
|
|
pre_balance_info: &mut PreBalanceInfo,
|
|
|
|
execute_and_commit_timings: &mut LeaderExecuteAndCommitTimings,
|
|
|
|
signature_count: u64,
|
|
|
|
executed_transactions_count: usize,
|
|
|
|
executed_non_vote_transactions_count: usize,
|
|
|
|
executed_with_successful_result_count: usize,
|
|
|
|
) -> (u64, Vec<CommitTransactionDetails>) {
|
|
|
|
inc_new_counter_info!(
|
|
|
|
"banking_stage-record_transactions_num_to_commit",
|
|
|
|
executed_transactions_count
|
|
|
|
);
|
|
|
|
|
|
|
|
let (last_blockhash, lamports_per_signature) =
|
|
|
|
bank.last_blockhash_and_lamports_per_signature();
|
|
|
|
|
2023-02-01 15:44:53 -08:00
|
|
|
let (tx_results, commit_time_us) = measure_us!(bank.commit_transactions(
|
|
|
|
batch.sanitized_transactions(),
|
|
|
|
loaded_transactions,
|
|
|
|
execution_results,
|
|
|
|
last_blockhash,
|
|
|
|
lamports_per_signature,
|
|
|
|
CommitTransactionCounts {
|
|
|
|
committed_transactions_count: executed_transactions_count as u64,
|
|
|
|
committed_non_vote_transactions_count: executed_non_vote_transactions_count as u64,
|
|
|
|
committed_with_failure_result_count: executed_transactions_count
|
|
|
|
.saturating_sub(executed_with_successful_result_count)
|
|
|
|
as u64,
|
|
|
|
signature_count,
|
|
|
|
},
|
|
|
|
&mut execute_and_commit_timings.execute_timings,
|
|
|
|
));
|
2023-01-25 19:02:21 -08:00
|
|
|
execute_and_commit_timings.commit_us = commit_time_us;
|
|
|
|
|
|
|
|
let commit_transaction_statuses = tx_results
|
|
|
|
.execution_results
|
|
|
|
.iter()
|
|
|
|
.map(|execution_result| match execution_result.details() {
|
|
|
|
Some(details) => CommitTransactionDetails::Committed {
|
|
|
|
compute_units: details.executed_units,
|
|
|
|
},
|
|
|
|
None => CommitTransactionDetails::NotCommitted,
|
|
|
|
})
|
|
|
|
.collect();
|
|
|
|
|
2023-02-01 15:44:53 -08:00
|
|
|
let ((), find_and_send_votes_us) = measure_us!({
|
|
|
|
bank_utils::find_and_send_votes(
|
|
|
|
batch.sanitized_transactions(),
|
|
|
|
&tx_results,
|
2023-02-09 13:22:42 -08:00
|
|
|
Some(&self.replay_vote_sender),
|
2023-02-01 15:44:53 -08:00
|
|
|
);
|
2023-02-09 13:22:42 -08:00
|
|
|
self.collect_balances_and_send_status_batch(
|
2023-02-01 15:44:53 -08:00
|
|
|
tx_results,
|
|
|
|
bank,
|
|
|
|
batch,
|
|
|
|
pre_balance_info,
|
|
|
|
starting_transaction_index,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
execute_and_commit_timings.find_and_send_votes_us = find_and_send_votes_us;
|
2023-01-25 19:02:21 -08:00
|
|
|
(commit_time_us, commit_transaction_statuses)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn collect_balances_and_send_status_batch(
|
2023-02-09 13:22:42 -08:00
|
|
|
&self,
|
2023-01-25 19:02:21 -08:00
|
|
|
tx_results: TransactionResults,
|
|
|
|
bank: &Arc<Bank>,
|
|
|
|
batch: &TransactionBatch,
|
|
|
|
pre_balance_info: &mut PreBalanceInfo,
|
|
|
|
starting_transaction_index: Option<usize>,
|
|
|
|
) {
|
2023-02-09 13:22:42 -08:00
|
|
|
if let Some(transaction_status_sender) = &self.transaction_status_sender {
|
2023-01-25 19:02:21 -08:00
|
|
|
let txs = batch.sanitized_transactions().to_vec();
|
|
|
|
let post_balances = bank.collect_balances(batch);
|
|
|
|
let post_token_balances =
|
|
|
|
collect_token_balances(bank, batch, &mut pre_balance_info.mint_decimals);
|
|
|
|
let mut transaction_index = starting_transaction_index.unwrap_or_default();
|
|
|
|
let batch_transaction_indexes: Vec<_> = tx_results
|
|
|
|
.execution_results
|
|
|
|
.iter()
|
|
|
|
.map(|result| {
|
|
|
|
if result.was_executed() {
|
|
|
|
let this_transaction_index = transaction_index;
|
|
|
|
saturating_add_assign!(transaction_index, 1);
|
|
|
|
this_transaction_index
|
|
|
|
} else {
|
|
|
|
0
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.collect();
|
|
|
|
transaction_status_sender.send_transaction_status_batch(
|
|
|
|
bank.clone(),
|
|
|
|
txs,
|
|
|
|
tx_results.execution_results,
|
|
|
|
TransactionBalancesSet::new(
|
|
|
|
std::mem::take(&mut pre_balance_info.native),
|
|
|
|
post_balances,
|
|
|
|
),
|
|
|
|
TransactionTokenBalancesSet::new(
|
|
|
|
std::mem::take(&mut pre_balance_info.token),
|
|
|
|
post_token_balances,
|
|
|
|
),
|
|
|
|
tx_results.rent_debits,
|
|
|
|
batch_transaction_indexes,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|