Skip to content

Commit

Permalink
Fix BankForks::new_rw_arc memory leak (#1893)
Browse files Browse the repository at this point in the history
(cherry picked from commit d441c0f)

# Conflicts:
#	core/benches/banking_stage.rs
#	core/benches/consumer.rs
#	core/src/banking_stage/consume_worker.rs
#	core/src/banking_stage/consumer.rs
#	core/tests/unified_scheduler.rs
#	ledger/benches/blockstore_processor.rs
#	ledger/src/blockstore_processor.rs
#	program-runtime/src/loaded_programs.rs
#	programs/sbf/tests/programs.rs
#	runtime/src/bank.rs
#	runtime/src/bank/tests.rs
#	runtime/src/bank_forks.rs
#	svm/src/transaction_processor.rs
#	svm/tests/conformance.rs
#	svm/tests/integration_test.rs
#	unified-scheduler-pool/src/lib.rs
  • Loading branch information
andreisilviudragnea authored and mergify[bot] committed Jul 9, 2024
1 parent 1fab40d commit c43488f
Show file tree
Hide file tree
Showing 26 changed files with 5,094 additions and 208 deletions.
16 changes: 9 additions & 7 deletions bench-tps/src/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1149,7 +1149,7 @@ pub fn fund_keypairs<T: 'static + BenchTpsClient + Send + Sync + ?Sized>(
mod tests {
use {
super::*,
solana_runtime::{bank::Bank, bank_client::BankClient},
solana_runtime::{bank::Bank, bank_client::BankClient, bank_forks::BankForks},
solana_sdk::{
commitment_config::CommitmentConfig,
feature_set::FeatureSet,
Expand All @@ -1160,16 +1160,18 @@ mod tests {
},
};

fn bank_with_all_features(genesis_config: &GenesisConfig) -> Arc<Bank> {
fn bank_with_all_features(
genesis_config: &GenesisConfig,
) -> (Arc<Bank>, Arc<RwLock<BankForks>>) {
let mut bank = Bank::new_for_tests(genesis_config);
bank.feature_set = Arc::new(FeatureSet::all_enabled());
bank.wrap_with_bank_forks_for_tests().0
bank.wrap_with_bank_forks_for_tests()
}

#[test]
fn test_bench_tps_bank_client() {
let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
let bank = bank_with_all_features(&genesis_config);
let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
let client = Arc::new(BankClient::new_shared(bank));

let config = Config {
Expand All @@ -1190,7 +1192,7 @@ mod tests {
#[test]
fn test_bench_tps_fund_keys() {
let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
let bank = bank_with_all_features(&genesis_config);
let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
let client = Arc::new(BankClient::new_shared(bank));
let keypair_count = 20;
let lamports = 20;
Expand All @@ -1215,7 +1217,7 @@ mod tests {
let (mut genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
let fee_rate_governor = FeeRateGovernor::new(11, 0);
genesis_config.fee_rate_governor = fee_rate_governor;
let bank = bank_with_all_features(&genesis_config);
let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
let client = Arc::new(BankClient::new_shared(bank));
let keypair_count = 20;
let lamports = 20;
Expand All @@ -1233,7 +1235,7 @@ mod tests {
#[test]
fn test_bench_tps_create_durable_nonce() {
let (genesis_config, id) = create_genesis_config(sol_to_lamports(10_000.0));
let bank = bank_with_all_features(&genesis_config);
let (bank, _bank_forks) = bank_with_all_features(&genesis_config);
let client = Arc::new(BankClient::new_shared(bank));
let keypair_count = 10;
let lamports = 10_000_000;
Expand Down
4 changes: 4 additions & 0 deletions core/benches/banking_stage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,10 +398,14 @@ fn simulate_process_entries(
let bank_fork = BankForks::new_rw_arc(bank);
let bank = bank_fork.read().unwrap().get_with_scheduler(slot).unwrap();
bank.clone_without_scheduler()
<<<<<<< HEAD
.loaded_programs_cache
.write()
.unwrap()
.set_fork_graph(bank_fork.clone());
=======
.set_fork_graph_in_program_cache(Arc::downgrade(&bank_fork));
>>>>>>> d441c0f577 (Fix BankForks::new_rw_arc memory leak (#1893))

for i in 0..(num_accounts / 2) {
bank.transfer(initial_lamports, mint_keypair, &keypairs[i * 2].pubkey())
Expand Down
10 changes: 9 additions & 1 deletion core/benches/consumer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use {
poh_recorder::{create_test_recorder, PohRecorder},
poh_service::PohService,
},
solana_runtime::bank::Bank,
solana_runtime::{bank::Bank, bank_forks::BankForks},
solana_sdk::{
account::Account, feature_set::apply_cost_tracker_during_replay, signature::Keypair,
signer::Signer, stake_history::Epoch, system_program, system_transaction,
Expand Down Expand Up @@ -85,6 +85,7 @@ fn create_consumer(poh_recorder: &RwLock<PohRecorder>) -> Consumer {

struct BenchFrame {
bank: Arc<Bank>,
_bank_forks: Arc<RwLock<BankForks>>,
ledger_path: TempDir,
exit: Arc<AtomicBool>,
poh_recorder: Arc<RwLock<PohRecorder>>,
Expand Down Expand Up @@ -114,8 +115,13 @@ fn setup(apply_cost_tracker_during_replay: bool) -> BenchFrame {
// set cost tracker limits to MAX so it will not filter out TXs
bank.write_cost_tracker()
.unwrap()
<<<<<<< HEAD
.set_limits(std::u64::MAX, std::u64::MAX, std::u64::MAX);
let bank = bank.wrap_with_bank_forks_for_tests().0;
=======
.set_limits(u64::MAX, u64::MAX, u64::MAX);
let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
>>>>>>> d441c0f577 (Fix BankForks::new_rw_arc memory leak (#1893))

let ledger_path = TempDir::new().unwrap();
let blockstore = Arc::new(
Expand All @@ -126,6 +132,7 @@ fn setup(apply_cost_tracker_during_replay: bool) -> BenchFrame {

BenchFrame {
bank,
_bank_forks: bank_forks,
ledger_path,
exit,
poh_recorder,
Expand All @@ -151,6 +158,7 @@ fn bench_process_and_record_transactions(

let BenchFrame {
bank,
_bank_forks,
ledger_path: _ledger_path,
exit,
poh_recorder,
Expand Down
6 changes: 3 additions & 3 deletions core/src/banking_stage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1050,7 +1050,7 @@ mod tests {
drop(poh_recorder);

let mut blockhash = start_hash;
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
bank.process_transaction(&fund_tx).unwrap();
//receive entries + ticks
loop {
Expand Down Expand Up @@ -1194,7 +1194,7 @@ mod tests {
.map(|(_bank, (entry, _tick_height))| entry)
.collect();

let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
for entry in entries {
bank.process_entry_transactions(entry.transactions)
.iter()
Expand All @@ -1218,7 +1218,7 @@ mod tests {
mint_keypair,
..
} = create_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let ledger_path = get_tmp_ledger_path_auto_delete!();
{
let blockstore = Blockstore::open(ledger_path.path())
Expand Down
11 changes: 10 additions & 1 deletion core/src/banking_stage/consume_worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,14 @@ mod tests {
get_tmp_ledger_path_auto_delete, leader_schedule_cache::LeaderScheduleCache,
},
solana_poh::poh_recorder::{PohRecorder, WorkingBankEntry},
<<<<<<< HEAD
solana_runtime::prioritization_fee_cache::PrioritizationFeeCache,
=======
solana_runtime::{
bank_forks::BankForks, prioritization_fee_cache::PrioritizationFeeCache,
vote_sender_types::ReplayVoteReceiver,
},
>>>>>>> d441c0f577 (Fix BankForks::new_rw_arc memory leak (#1893))
solana_sdk::{
genesis_config::GenesisConfig, poh_config::PohConfig, pubkey::Pubkey,
signature::Keypair, system_transaction,
Expand All @@ -645,6 +652,7 @@ mod tests {
mint_keypair: Keypair,
genesis_config: GenesisConfig,
bank: Arc<Bank>,
_bank_forks: Arc<RwLock<BankForks>>,
_ledger_path: TempDir,
_entry_receiver: Receiver<WorkingBankEntry>,
poh_recorder: Arc<RwLock<PohRecorder>>,
Expand All @@ -661,7 +669,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);

let ledger_path = get_tmp_ledger_path_auto_delete!();
let blockstore = Blockstore::open(ledger_path.path())
Expand Down Expand Up @@ -704,6 +712,7 @@ mod tests {
mint_keypair,
genesis_config,
bank,
_bank_forks: bank_forks,
_ledger_path: ledger_path,
_entry_receiver: entry_receiver,
poh_recorder,
Expand Down
53 changes: 37 additions & 16 deletions core/src/banking_stage/consumer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,7 @@ mod tests {
solana_poh::poh_recorder::{PohRecorder, Record, WorkingBankEntry},
solana_program_runtime::timings::ProgramTiming,
solana_rpc::transaction_status_service::TransactionStatusService,
solana_runtime::prioritization_fee_cache::PrioritizationFeeCache,
solana_runtime::{bank_forks::BankForks, prioritization_fee_cache::PrioritizationFeeCache},
solana_sdk::{
account::AccountSharedData,
account_utils::StateMut,
Expand Down Expand Up @@ -965,6 +965,7 @@ mod tests {
) -> (
Vec<Transaction>,
Arc<Bank>,
Arc<RwLock<BankForks>>,
Arc<RwLock<PohRecorder>>,
Receiver<WorkingBankEntry>,
GenesisConfigInfo,
Expand All @@ -979,7 +980,7 @@ mod tests {
} = &genesis_config_info;
let blockstore =
Blockstore::open(ledger_path).expect("Expected to be able to open database ledger");
let bank = Bank::new_no_wallclock_throttle_for_tests(genesis_config).0;
let (bank, bank_forks) = Bank::new_no_wallclock_throttle_for_tests(genesis_config);
let exit = Arc::new(AtomicBool::default());
let (poh_recorder, entry_receiver, record_receiver) = PohRecorder::new(
bank.tick_height(),
Expand Down Expand Up @@ -1008,6 +1009,7 @@ mod tests {
(
transactions,
bank,
bank_forks,
poh_recorder,
entry_receiver,
genesis_config_info,
Expand Down Expand Up @@ -1035,7 +1037,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let pubkey = solana_sdk::pubkey::new_rand();

let transactions = sanitize_transactions(vec![system_transaction::transfer(
Expand Down Expand Up @@ -1163,7 +1165,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let pubkey = Pubkey::new_unique();

// setup nonce account with a durable nonce different from the current
Expand Down Expand Up @@ -1319,7 +1321,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let pubkey = solana_sdk::pubkey::new_rand();

let transactions = {
Expand Down Expand Up @@ -1412,11 +1414,16 @@ mod tests {
..
} = create_slow_genesis_config(10_000);
let mut bank = Bank::new_for_tests(&genesis_config);
<<<<<<< HEAD
bank.ns_per_slot = std::u128::MAX;
if !apply_cost_tracker_during_replay_enabled {
bank.deactivate_feature(&feature_set::apply_cost_tracker_during_replay::id());
}
let bank = bank.wrap_with_bank_forks_for_tests().0;
=======
bank.ns_per_slot = u128::MAX;
let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
>>>>>>> d441c0f577 (Fix BankForks::new_rw_arc memory leak (#1893))
let pubkey = solana_sdk::pubkey::new_rand();

let ledger_path = get_tmp_ledger_path_auto_delete!();
Expand Down Expand Up @@ -1563,7 +1570,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let pubkey = solana_sdk::pubkey::new_rand();
let pubkey1 = solana_sdk::pubkey::new_rand();

Expand Down Expand Up @@ -1640,7 +1647,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(lamports);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
// set cost tracker limits to MAX so it will not filter out TXs
bank.write_cost_tracker()
.unwrap()
Expand Down Expand Up @@ -1701,7 +1708,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
// set cost tracker limits to MAX so it will not filter out TXs
bank.write_cost_tracker()
.unwrap()
Expand Down Expand Up @@ -1760,7 +1767,7 @@ mod tests {
mint_keypair,
..
} = create_slow_genesis_config(10_000);
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);

let pubkey = solana_sdk::pubkey::new_rand();

Expand Down Expand Up @@ -1841,7 +1848,7 @@ mod tests {
} = create_slow_genesis_config(solana_sdk::native_token::sol_to_lamports(1000.0));
genesis_config.rent.lamports_per_byte_year = 50;
genesis_config.rent.exemption_threshold = 2.0;
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let pubkey = solana_sdk::pubkey::new_rand();
let pubkey1 = solana_sdk::pubkey::new_rand();
let keypair1 = Keypair::new();
Expand Down Expand Up @@ -2109,7 +2116,7 @@ mod tests {
fn test_consume_buffered_packets() {
let ledger_path = get_tmp_ledger_path_auto_delete!();
{
let (transactions, bank, poh_recorder, _entry_receiver, _, poh_simulator) =
let (transactions, bank, _bank_forks, poh_recorder, _entry_receiver, _, poh_simulator) =
setup_conflicting_transactions(ledger_path.path());
let recorder: TransactionRecorder = poh_recorder.read().unwrap().new_recorder();
let num_conflicting_transactions = transactions.len();
Expand Down Expand Up @@ -2182,8 +2189,15 @@ mod tests {
fn test_consume_buffered_packets_sanitization_error() {
let ledger_path = get_tmp_ledger_path_auto_delete!();
{
let (mut transactions, bank, poh_recorder, _entry_receiver, _, poh_simulator) =
setup_conflicting_transactions(ledger_path.path());
let (
mut transactions,
bank,
_bank_forks,
poh_recorder,
_entry_receiver,
_,
poh_simulator,
) = setup_conflicting_transactions(ledger_path.path());
let duplicate_account_key = transactions[0].message.account_keys[0];
transactions[0]
.message
Expand Down Expand Up @@ -2238,7 +2252,7 @@ mod tests {
fn test_consume_buffered_packets_retryable() {
let ledger_path = get_tmp_ledger_path_auto_delete!();
{
let (transactions, bank, poh_recorder, _entry_receiver, _, poh_simulator) =
let (transactions, bank, _bank_forks, poh_recorder, _entry_receiver, _, poh_simulator) =
setup_conflicting_transactions(ledger_path.path());
let recorder = poh_recorder.read().unwrap().new_recorder();
let num_conflicting_transactions = transactions.len();
Expand Down Expand Up @@ -2334,8 +2348,15 @@ mod tests {
fn test_consume_buffered_packets_batch_priority_guard() {
let ledger_path = get_tmp_ledger_path_auto_delete!();
{
let (_, bank, poh_recorder, _entry_receiver, genesis_config_info, poh_simulator) =
setup_conflicting_transactions(ledger_path.path());
let (
_,
bank,
_bank_forks,
poh_recorder,
_entry_receiver,
genesis_config_info,
poh_simulator,
) = setup_conflicting_transactions(ledger_path.path());
let recorder = poh_recorder.read().unwrap().new_recorder();

// Setup transactions:
Expand Down
2 changes: 1 addition & 1 deletion core/src/banking_stage/decision_maker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ mod tests {
#[test]
fn test_make_consume_or_forward_decision() {
let genesis_config = create_genesis_config(2).genesis_config;
let bank = Bank::new_no_wallclock_throttle_for_tests(&genesis_config).0;
let (bank, _bank_forks) = Bank::new_no_wallclock_throttle_for_tests(&genesis_config);
let ledger_path = temp_dir();
let blockstore = Arc::new(Blockstore::open(ledger_path.as_path()).unwrap());
let (exit, poh_recorder, poh_service, _entry_receiver) =
Expand Down
Loading

0 comments on commit c43488f

Please sign in to comment.