Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit da2078d

Browse files
sakridgewillhickey
authored andcommitted
Add limit to looping in banking-stage
1 parent 0895cb8 commit da2078d

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

core/src/banking_stage/consumer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,8 @@ impl Consumer {
554554
transaction_status_sender_enabled,
555555
&mut execute_and_commit_timings.execute_timings,
556556
None, // account_overrides
557-
self.log_messages_bytes_limit
557+
self.log_messages_bytes_limit,
558+
true,
558559
));
559560
execute_and_commit_timings.load_execute_us = load_execute_us;
560561

program-runtime/src/loaded_programs.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ impl Stats {
193193
("reloads", reloads, i64),
194194
("insertions", insertions, i64),
195195
("lost_insertions", lost_insertions, i64),
196-
("replacements", replacements, i64),
196+
("replace_entry", replacements, i64),
197197
("one_hit_wonders", one_hit_wonders, i64),
198198
("prunes_orphan", prunes_orphan, i64),
199199
("prunes_environment", prunes_environment, i64),
@@ -553,6 +553,7 @@ pub struct LoadedProgramsForTxBatch {
553553
entries: HashMap<Pubkey, Arc<LoadedProgram>>,
554554
slot: Slot,
555555
pub environments: ProgramRuntimeEnvironments,
556+
pub hit_max_limit: bool,
556557
}
557558

558559
impl LoadedProgramsForTxBatch {
@@ -561,6 +562,7 @@ impl LoadedProgramsForTxBatch {
561562
entries: HashMap::new(),
562563
slot,
563564
environments,
565+
hit_max_limit: false,
564566
}
565567
}
566568

@@ -736,10 +738,10 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
736738
key: Pubkey,
737739
entry: Arc<LoadedProgram>,
738740
current_slot: Slot,
739-
) -> Arc<LoadedProgram> {
741+
) -> (bool, Arc<LoadedProgram>) {
740742
let (was_occupied, entry) = self.replenish(key, entry, current_slot);
741743
debug_assert!(!was_occupied);
742-
entry
744+
(was_occupied, entry)
743745
}
744746

745747
pub fn prune_by_deployment_slot(&mut self, slot: Slot) {
@@ -985,7 +987,7 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
985987
slot: Slot,
986988
key: Pubkey,
987989
loaded_program: Arc<LoadedProgram>,
988-
) {
990+
) -> bool {
989991
let second_level = self.entries.entry(key).or_default();
990992
debug_assert_eq!(
991993
second_level.cooperative_loading_lock,
@@ -1008,8 +1010,9 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
10081010
{
10091011
self.stats.lost_insertions.fetch_add(1, Ordering::Relaxed);
10101012
}
1011-
self.assign_program(key, loaded_program, slot);
1013+
let (was_replaced, _) = self.assign_program(key, loaded_program, slot);
10121014
self.loading_task_waiter.notify();
1015+
was_replaced
10131016
}
10141017

10151018
pub fn merge(&mut self, tx_batch_cache: &LoadedProgramsForTxBatch) {
@@ -1232,11 +1235,13 @@ mod tests {
12321235
slot: Slot,
12331236
reason: LoadedProgramType,
12341237
) -> Arc<LoadedProgram> {
1235-
cache.assign_program(
1236-
key,
1237-
Arc::new(LoadedProgram::new_tombstone(slot, reason)),
1238-
u64::MAX,
1239-
)
1238+
cache
1239+
.assign_program(
1240+
key,
1241+
Arc::new(LoadedProgram::new_tombstone(slot, reason)),
1242+
u64::MAX,
1243+
)
1244+
.1
12401245
}
12411246

12421247
fn insert_unloaded_program<FG: ForkGraph>(

runtime/src/bank.rs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4378,6 +4378,7 @@ impl Bank {
43784378
&mut timings,
43794379
Some(&account_overrides),
43804380
None,
4381+
true,
43814382
);
43824383

43834384
let post_simulation_accounts = loaded_transactions
@@ -5047,6 +5048,7 @@ impl Bank {
50475048
fn replenish_program_cache(
50485049
&self,
50495050
program_accounts_map: &HashMap<Pubkey, (&Pubkey, u64)>,
5051+
limit_to_load_programs: bool,
50505052
) -> LoadedProgramsForTxBatch {
50515053
let mut missing_programs: Vec<(Pubkey, (LoadedProgramMatchCriteria, u64))> =
50525054
if self.check_program_modification_slot {
@@ -5092,11 +5094,16 @@ impl Bank {
50925094
}
50935095
// Submit our last completed loading task.
50945096
if let Some((key, program)) = program_to_store.take() {
5095-
loaded_programs_cache.finish_cooperative_loading_task(
5097+
if loaded_programs_cache.finish_cooperative_loading_task(
50965098
self.slot(),
50975099
key,
50985100
program,
5099-
);
5101+
) && limit_to_load_programs
5102+
{
5103+
let mut ret = LoadedProgramsForTxBatch::default();
5104+
ret.hit_max_limit = true;
5105+
return ret;
5106+
}
51005107
}
51015108
// Figure out which program needs to be loaded next.
51025109
let program_to_load = loaded_programs_cache.extract(
@@ -5128,7 +5135,7 @@ impl Bank {
51285135
loaded_programs_for_txs.unwrap()
51295136
}
51305137

5131-
#[allow(clippy::type_complexity)]
5138+
#[allow(clippy::too_many_arguments, clippy::type_complexity)]
51325139
pub fn load_and_execute_transactions(
51335140
&self,
51345141
batch: &TransactionBatch,
@@ -5139,6 +5146,7 @@ impl Bank {
51395146
timings: &mut ExecuteTimings,
51405147
account_overrides: Option<&AccountOverrides>,
51415148
log_messages_bytes_limit: Option<usize>,
5149+
limit_to_load_programs: bool,
51425150
) -> LoadAndExecuteTransactionsOutput {
51435151
let sanitized_txs = batch.sanitized_transactions();
51445152
debug!("processing transactions: {}", sanitized_txs.len());
@@ -5208,9 +5216,22 @@ impl Bank {
52085216
}
52095217

52105218
let programs_loaded_for_tx_batch = Rc::new(RefCell::new(
5211-
self.replenish_program_cache(&program_accounts_map),
5219+
self.replenish_program_cache(&program_accounts_map, limit_to_load_programs),
52125220
));
52135221

5222+
if programs_loaded_for_tx_batch.borrow().hit_max_limit {
5223+
return LoadAndExecuteTransactionsOutput {
5224+
loaded_transactions: vec![],
5225+
execution_results: vec![],
5226+
retryable_transaction_indexes: vec![],
5227+
executed_transactions_count: 0,
5228+
executed_non_vote_transactions_count: 0,
5229+
executed_with_successful_result_count: 0,
5230+
signature_count: 0,
5231+
error_counters,
5232+
};
5233+
}
5234+
52145235
let mut load_time = Measure::start("accounts_load");
52155236
let mut loaded_transactions = self.rc.accounts.load_accounts(
52165237
&self.ancestors,
@@ -6309,6 +6330,7 @@ impl Bank {
63096330
timings,
63106331
None,
63116332
log_messages_bytes_limit,
6333+
false,
63126334
);
63136335

63146336
let (last_blockhash, lamports_per_signature) =

0 commit comments

Comments
 (0)