solana/core/src/next_leader.rs

34 lines
1.0 KiB
Rust

use {
solana_gossip::{
cluster_info::ClusterInfo, legacy_contact_info::LegacyContactInfo as ContactInfo,
},
solana_poh::poh_recorder::PohRecorder,
solana_sdk::{clock::FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET, pubkey::Pubkey},
std::{net::SocketAddr, sync::RwLock},
};
pub(crate) fn next_leader_tpu_vote(
cluster_info: &ClusterInfo,
poh_recorder: &RwLock<PohRecorder>,
) -> Option<(Pubkey, SocketAddr)> {
next_leader(cluster_info, poh_recorder, ContactInfo::tpu_vote)
}
pub(crate) fn next_leader<F, E>(
cluster_info: &ClusterInfo,
poh_recorder: &RwLock<PohRecorder>,
port_selector: F,
) -> Option<(Pubkey, SocketAddr)>
where
F: FnOnce(&ContactInfo) -> Result<SocketAddr, E>,
{
let leader_pubkey = poh_recorder
.read()
.unwrap()
.leader_after_n_slots(FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET)?;
cluster_info
.lookup_contact_info(&leader_pubkey, port_selector)?
.map(|addr| (leader_pubkey, addr))
.ok()
}