Skip to content

Commit

Permalink
Fix - Uses fetch_add() to accumulate usage counters in `LoadedProgr…
Browse files Browse the repository at this point in the history
…ams` (solana-labs#34319)

Uses fetch_add() to accumulate usage counters.
  • Loading branch information
Lichtso authored Dec 5, 2023
1 parent 70896b8 commit f70d548
Showing 1 changed file with 19 additions and 22 deletions.
41 changes: 19 additions & 22 deletions program-runtime/src/loaded_programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -609,13 +609,11 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
if matches!(existing.program, LoadedProgramType::Unloaded(_)) {
// The unloaded program is getting reloaded
// Copy over the usage counter to the new entry
let mut usage_count = existing.tx_usage_counter.load(Ordering::Relaxed);
saturating_add_assign!(
usage_count,
entry.tx_usage_counter.load(Ordering::Relaxed)
entry.tx_usage_counter.fetch_add(
existing.tx_usage_counter.load(Ordering::Relaxed),
Ordering::Relaxed,
);
entry.tx_usage_counter.store(usage_count, Ordering::Relaxed);
entry.ix_usage_counter.store(
entry.ix_usage_counter.fetch_add(
existing.ix_usage_counter.load(Ordering::Relaxed),
Ordering::Relaxed,
);
Expand Down Expand Up @@ -807,7 +805,7 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
}));
let mut extracting = extracted.lock().unwrap();
extracting.loaded.entries = keys
.filter_map(|(key, (match_criteria, count))| {
.filter_map(|(key, (match_criteria, usage_count))| {
let mut reloading = false;
if let Some(second_level) = self.entries.get(&key) {
for entry in second_level.iter().rev() {
Expand All @@ -830,7 +828,7 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
|| entry.deployment_slot == current_slot
|| is_ancestor
{
if current_slot >= entry.effective_slot {
let entry_to_return = if current_slot >= entry.effective_slot {
if !Self::is_entry_usable(entry, current_slot, &match_criteria)
|| !Self::matches_environment(entry, environments)
{
Expand All @@ -842,27 +840,26 @@ impl<FG: ForkGraph> LoadedPrograms<FG> {
break;
}

let mut usage_count =
entry.tx_usage_counter.load(Ordering::Relaxed);
saturating_add_assign!(usage_count, count);
entry.tx_usage_counter.store(usage_count, Ordering::Relaxed);
return Some((key, entry.clone()));
entry.clone()
} else if entry.is_implicit_delay_visibility_tombstone(current_slot) {
// Found a program entry on the current fork, but it's not effective
// yet. It indicates that the program has delayed visibility. Return
// the tombstone to reflect that.
return Some((
key,
Arc::new(LoadedProgram::new_tombstone(
entry.deployment_slot,
LoadedProgramType::DelayVisibility,
)),
));
}
Arc::new(LoadedProgram::new_tombstone(
entry.deployment_slot,
LoadedProgramType::DelayVisibility,
))
} else {
continue;
};
entry_to_return
.tx_usage_counter
.fetch_add(usage_count, Ordering::Relaxed);
return Some((key, entry_to_return));
}
}
}
extracting.missing.insert(key, (count, reloading));
extracting.missing.insert(key, (usage_count, reloading));
None
})
.collect::<HashMap<Pubkey, Arc<LoadedProgram>>>();
Expand Down

0 comments on commit f70d548

Please sign in to comment.