rpc: add getSlotLeaders method (#16057) (#16078)

(cherry picked from commit e7fd7d46cf)

Co-authored-by: Justin Starry <justin@solana.com>
This commit is contained in:
mergify[bot]
2021-03-24 03:20:57 +00:00
committed by GitHub
parent 64a754f610
commit 3317a14bd5
8 changed files with 233 additions and 5 deletions

View File

@@ -204,6 +204,10 @@ impl LeaderScheduleCache {
}
}
pub fn get_epoch_leader_schedule(&self, epoch: Epoch) -> Option<Arc<LeaderSchedule>> {
self.cached_schedules.read().unwrap().0.get(&epoch).cloned()
}
fn get_epoch_schedule_else_compute(
&self,
epoch: Epoch,
@@ -214,8 +218,7 @@ impl LeaderScheduleCache {
return Some(fixed_schedule.leader_schedule.clone());
}
}
let epoch_schedule = self.cached_schedules.read().unwrap().0.get(&epoch).cloned();
let epoch_schedule = self.get_epoch_leader_schedule(epoch);
if epoch_schedule.is_some() {
epoch_schedule
} else if let Some(epoch_schedule) = self.compute_epoch_schedule(epoch, bank) {

View File

@@ -1,3 +1,5 @@
use std::collections::HashMap;
use crate::leader_schedule::LeaderSchedule;
use solana_runtime::bank::Bank;
use solana_sdk::{
@@ -21,6 +23,27 @@ pub fn leader_schedule(epoch: Epoch, bank: &Bank) -> Option<LeaderSchedule> {
})
}
/// Map of leader base58 identity pubkeys to the slot indices relative to the first epoch slot
pub type LeaderScheduleByIdentity = HashMap<String, Vec<usize>>;
pub fn leader_schedule_by_identity<'a>(
upcoming_leaders: impl Iterator<Item = (usize, &'a Pubkey)>,
) -> LeaderScheduleByIdentity {
let mut leader_schedule_by_identity = HashMap::new();
for (slot_index, identity_pubkey) in upcoming_leaders {
leader_schedule_by_identity
.entry(identity_pubkey)
.or_insert_with(Vec::new)
.push(slot_index);
}
leader_schedule_by_identity
.into_iter()
.map(|(identity_pubkey, slot_indices)| (identity_pubkey.to_string(), slot_indices))
.collect()
}
/// Return the leader for the given slot.
pub fn slot_leader_at(slot: Slot, bank: &Bank) -> Option<Pubkey> {
let (epoch, slot_index) = bank.get_epoch_and_slot_index(slot);