Skip to content

Commit

Permalink
Cleanup BankForks access code in ShredFetchStage
Browse files Browse the repository at this point in the history
- BankForks is not an optional argument, so remove dated comment
- Given that BankForks is always present, no need for special values to
  initialize variables before the loop
- Root slot can be retrieved from root bank, no need for second call to
  BankForks (which would load the underlying atomic a second time)
- Use BankForks::highest_slot() instead of .slot() on .working_bank() to
  avoid the extra clone that .working_bank() performs
- Move several operations outside of BankForks read lock scope to
  minimize lock time
  • Loading branch information
Steven Czabaniuk committed Aug 30, 2023
1 parent 37887d4 commit 65c7292
Showing 1 changed file with 11 additions and 10 deletions.
21 changes: 11 additions & 10 deletions core/src/shred_fetch_stage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,25 +52,26 @@ impl ShredFetchStage {
.as_ref()
.map(|(_, cluster_info)| cluster_info.keypair().clone());

// In the case of bank_forks=None, setup to accept any slot range
let mut root_bank = bank_forks.read().unwrap().root_bank();
let mut last_root = 0;
let mut last_slot = std::u64::MAX;
let mut slots_per_epoch = 0;

// Only need root bank in order to check feature statuses later on;
// can demote to only fetching root slot once those features go away.
let (mut root_bank, mut last_slot) = {
let bank_forks_r = bank_forks.read().unwrap();
(bank_forks_r.root_bank(), bank_forks_r.highest_slot())
};
let mut last_root = root_bank.slot();
let mut slots_per_epoch = root_bank.get_slots_in_epoch(root_bank.epoch());
let mut stats = ShredFetchStats::default();

for mut packet_batch in recvr {
if last_updated.elapsed().as_millis() as u64 > DEFAULT_MS_PER_SLOT {
last_updated = Instant::now();
{
let bank_forks_r = bank_forks.read().unwrap();
last_root = bank_forks_r.root();
let working_bank = bank_forks_r.working_bank();
last_slot = working_bank.slot();
root_bank = bank_forks_r.root_bank();
slots_per_epoch = root_bank.get_slots_in_epoch(root_bank.epoch());
last_slot = bank_forks_r.highest_slot();
}
last_root = root_bank.slot();
slots_per_epoch = root_bank.get_slots_in_epoch(root_bank.epoch());
keypair = repair_context
.as_ref()
.map(|(_, cluster_info)| cluster_info.keypair().clone());
Expand Down

0 comments on commit 65c7292

Please sign in to comment.