Ensure accounts are unlocked (#3458)
This commit is contained in:
@ -223,24 +223,22 @@ impl BankingStage {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_and_record_transactions(
|
fn process_and_record_transactions_locked(
|
||||||
bank: &Bank,
|
bank: &Bank,
|
||||||
txs: &[Transaction],
|
txs: &[Transaction],
|
||||||
poh: &Arc<Mutex<PohRecorder>>,
|
poh: &Arc<Mutex<PohRecorder>>,
|
||||||
|
lock_results: &[bank::Result<()>],
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let now = Instant::now();
|
|
||||||
// Once accounts are locked, other threads cannot encode transactions that will modify the
|
|
||||||
// same account state
|
|
||||||
let lock_results = bank.lock_accounts(txs);
|
|
||||||
let lock_time = now.elapsed();
|
|
||||||
|
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
// Use a shorter maximum age when adding transactions into the pipeline. This will reduce
|
// Use a shorter maximum age when adding transactions into the pipeline. This will reduce
|
||||||
// the likelihood of any single thread getting starved and processing old ids.
|
// the likelihood of any single thread getting starved and processing old ids.
|
||||||
// TODO: Banking stage threads should be prioritized to complete faster then this queue
|
// TODO: Banking stage threads should be prioritized to complete faster then this queue
|
||||||
// expires.
|
// expires.
|
||||||
let (loaded_accounts, results) =
|
let (loaded_accounts, results) = bank.load_and_execute_transactions(
|
||||||
bank.load_and_execute_transactions(txs, lock_results, MAX_RECENT_BLOCKHASHES / 2);
|
txs,
|
||||||
|
lock_results.to_vec(),
|
||||||
|
MAX_RECENT_BLOCKHASHES / 2,
|
||||||
|
);
|
||||||
let load_execute_time = now.elapsed();
|
let load_execute_time = now.elapsed();
|
||||||
|
|
||||||
let record_time = {
|
let record_time = {
|
||||||
@ -255,21 +253,45 @@ impl BankingStage {
|
|||||||
now.elapsed()
|
now.elapsed()
|
||||||
};
|
};
|
||||||
|
|
||||||
let now = Instant::now();
|
|
||||||
// Once the accounts are new transactions can enter the pipeline to process them
|
|
||||||
bank.unlock_accounts(&txs, &results);
|
|
||||||
let unlock_time = now.elapsed();
|
|
||||||
debug!(
|
debug!(
|
||||||
"bank: {} lock: {}us load_execute: {}us record: {}us commit: {}us unlock: {}us txs_len: {}",
|
"bank: {} load_execute: {}us record: {}us commit: {}us txs_len: {}",
|
||||||
bank.slot(),
|
bank.slot(),
|
||||||
duration_as_us(&lock_time),
|
|
||||||
duration_as_us(&load_execute_time),
|
duration_as_us(&load_execute_time),
|
||||||
duration_as_us(&record_time),
|
duration_as_us(&record_time),
|
||||||
duration_as_us(&commit_time),
|
duration_as_us(&commit_time),
|
||||||
|
txs.len(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn process_and_record_transactions(
|
||||||
|
bank: &Bank,
|
||||||
|
txs: &[Transaction],
|
||||||
|
poh: &Arc<Mutex<PohRecorder>>,
|
||||||
|
) -> Result<()> {
|
||||||
|
let now = Instant::now();
|
||||||
|
// Once accounts are locked, other threads cannot encode transactions that will modify the
|
||||||
|
// same account state
|
||||||
|
let lock_results = bank.lock_accounts(txs);
|
||||||
|
let lock_time = now.elapsed();
|
||||||
|
|
||||||
|
let results = Self::process_and_record_transactions_locked(bank, txs, poh, &lock_results);
|
||||||
|
|
||||||
|
let now = Instant::now();
|
||||||
|
// Once the accounts are new transactions can enter the pipeline to process them
|
||||||
|
bank.unlock_accounts(&txs, &lock_results);
|
||||||
|
let unlock_time = now.elapsed();
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
"bank: {} lock: {}us unlock: {}us txs_len: {}",
|
||||||
|
bank.slot(),
|
||||||
|
duration_as_us(&lock_time),
|
||||||
duration_as_us(&unlock_time),
|
duration_as_us(&unlock_time),
|
||||||
txs.len(),
|
txs.len(),
|
||||||
);
|
);
|
||||||
Ok(())
|
|
||||||
|
results
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends transactions to the bank.
|
/// Sends transactions to the bank.
|
||||||
|
Reference in New Issue
Block a user