Add timing measurement for gossip vote txn processing (#26163)
* add timing for gossip vote txn processing * fix build * fix too many arg error in clippy * atomic interval
This commit is contained in:
parent
090e11210a
commit
d5efbdb19b
|
@ -40,6 +40,7 @@ use {
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
signature::Signature,
|
signature::Signature,
|
||||||
slot_hashes,
|
slot_hashes,
|
||||||
|
timing::AtomicInterval,
|
||||||
transaction::Transaction,
|
transaction::Transaction,
|
||||||
},
|
},
|
||||||
std::{
|
std::{
|
||||||
|
@ -182,6 +183,47 @@ impl BankSendVotesStats {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
struct VoteProcessingTiming {
|
||||||
|
gossip_txn_processing_time_us: u64,
|
||||||
|
gossip_slot_confirming_time_us: u64,
|
||||||
|
last_report: AtomicInterval,
|
||||||
|
}
|
||||||
|
|
||||||
|
const VOTE_PROCESSING_REPORT_INTERVAL_MS: u64 = 1_000;
|
||||||
|
|
||||||
|
impl VoteProcessingTiming {
|
||||||
|
fn reset(&mut self) {
|
||||||
|
self.gossip_slot_confirming_time_us = 0;
|
||||||
|
self.gossip_slot_confirming_time_us = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, vote_txn_processing_time_us: u64, vote_slot_confirming_time_us: u64) {
|
||||||
|
self.gossip_txn_processing_time_us += vote_txn_processing_time_us;
|
||||||
|
self.gossip_slot_confirming_time_us += vote_slot_confirming_time_us;
|
||||||
|
|
||||||
|
if self
|
||||||
|
.last_report
|
||||||
|
.should_update(VOTE_PROCESSING_REPORT_INTERVAL_MS)
|
||||||
|
{
|
||||||
|
datapoint_info!(
|
||||||
|
"vote-processing-timing",
|
||||||
|
(
|
||||||
|
"vote_txn_processing_us",
|
||||||
|
self.gossip_txn_processing_time_us as i64,
|
||||||
|
i64
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"slot_confirming_time_us",
|
||||||
|
self.gossip_slot_confirming_time_us as i64,
|
||||||
|
i64
|
||||||
|
),
|
||||||
|
);
|
||||||
|
self.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ClusterInfoVoteListener {
|
pub struct ClusterInfoVoteListener {
|
||||||
thread_hdls: Vec<JoinHandle<()>>,
|
thread_hdls: Vec<JoinHandle<()>>,
|
||||||
}
|
}
|
||||||
|
@ -450,6 +492,7 @@ impl ClusterInfoVoteListener {
|
||||||
OptimisticConfirmationVerifier::new(bank_forks.read().unwrap().root());
|
OptimisticConfirmationVerifier::new(bank_forks.read().unwrap().root());
|
||||||
let mut last_process_root = Instant::now();
|
let mut last_process_root = Instant::now();
|
||||||
let cluster_confirmed_slot_sender = Some(cluster_confirmed_slot_sender);
|
let cluster_confirmed_slot_sender = Some(cluster_confirmed_slot_sender);
|
||||||
|
let mut vote_processing_time = Some(VoteProcessingTiming::default());
|
||||||
loop {
|
loop {
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
@ -480,6 +523,7 @@ impl ClusterInfoVoteListener {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&bank_notification_sender,
|
&bank_notification_sender,
|
||||||
&cluster_confirmed_slot_sender,
|
&cluster_confirmed_slot_sender,
|
||||||
|
&mut vote_processing_time,
|
||||||
);
|
);
|
||||||
match confirmed_slots {
|
match confirmed_slots {
|
||||||
Ok(confirmed_slots) => {
|
Ok(confirmed_slots) => {
|
||||||
|
@ -519,9 +563,11 @@ impl ClusterInfoVoteListener {
|
||||||
replay_votes_receiver,
|
replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn listen_and_confirm_votes(
|
fn listen_and_confirm_votes(
|
||||||
gossip_vote_txs_receiver: &VerifiedVoteTransactionsReceiver,
|
gossip_vote_txs_receiver: &VerifiedVoteTransactionsReceiver,
|
||||||
vote_tracker: &VoteTracker,
|
vote_tracker: &VoteTracker,
|
||||||
|
@ -532,6 +578,7 @@ impl ClusterInfoVoteListener {
|
||||||
replay_votes_receiver: &ReplayVoteReceiver,
|
replay_votes_receiver: &ReplayVoteReceiver,
|
||||||
bank_notification_sender: &Option<BankNotificationSender>,
|
bank_notification_sender: &Option<BankNotificationSender>,
|
||||||
cluster_confirmed_slot_sender: &Option<GossipDuplicateConfirmedSlotsSender>,
|
cluster_confirmed_slot_sender: &Option<GossipDuplicateConfirmedSlotsSender>,
|
||||||
|
vote_processing_time: &mut Option<VoteProcessingTiming>,
|
||||||
) -> Result<ThresholdConfirmedSlots> {
|
) -> Result<ThresholdConfirmedSlots> {
|
||||||
let mut sel = Select::new();
|
let mut sel = Select::new();
|
||||||
sel.recv(gossip_vote_txs_receiver);
|
sel.recv(gossip_vote_txs_receiver);
|
||||||
|
@ -560,6 +607,7 @@ impl ClusterInfoVoteListener {
|
||||||
verified_vote_sender,
|
verified_vote_sender,
|
||||||
bank_notification_sender,
|
bank_notification_sender,
|
||||||
cluster_confirmed_slot_sender,
|
cluster_confirmed_slot_sender,
|
||||||
|
vote_processing_time,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
remaining_wait_time = remaining_wait_time.saturating_sub(start.elapsed());
|
remaining_wait_time = remaining_wait_time.saturating_sub(start.elapsed());
|
||||||
|
@ -682,6 +730,7 @@ impl ClusterInfoVoteListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn filter_and_confirm_with_new_votes(
|
fn filter_and_confirm_with_new_votes(
|
||||||
vote_tracker: &VoteTracker,
|
vote_tracker: &VoteTracker,
|
||||||
gossip_vote_txs: Vec<Transaction>,
|
gossip_vote_txs: Vec<Transaction>,
|
||||||
|
@ -692,11 +741,13 @@ impl ClusterInfoVoteListener {
|
||||||
verified_vote_sender: &VerifiedVoteSender,
|
verified_vote_sender: &VerifiedVoteSender,
|
||||||
bank_notification_sender: &Option<BankNotificationSender>,
|
bank_notification_sender: &Option<BankNotificationSender>,
|
||||||
cluster_confirmed_slot_sender: &Option<GossipDuplicateConfirmedSlotsSender>,
|
cluster_confirmed_slot_sender: &Option<GossipDuplicateConfirmedSlotsSender>,
|
||||||
|
vote_processing_time: &mut Option<VoteProcessingTiming>,
|
||||||
) -> ThresholdConfirmedSlots {
|
) -> ThresholdConfirmedSlots {
|
||||||
let mut diff: HashMap<Slot, HashMap<Pubkey, bool>> = HashMap::new();
|
let mut diff: HashMap<Slot, HashMap<Pubkey, bool>> = HashMap::new();
|
||||||
let mut new_optimistic_confirmed_slots = vec![];
|
let mut new_optimistic_confirmed_slots = vec![];
|
||||||
|
|
||||||
// Process votes from gossip and ReplayStage
|
// Process votes from gossip and ReplayStage
|
||||||
|
let mut gossip_vote_txn_processing_time = Measure::start("gossip_vote_processing_time");
|
||||||
let votes = gossip_vote_txs
|
let votes = gossip_vote_txs
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(vote_parser::parse_vote_transaction)
|
.filter_map(vote_parser::parse_vote_transaction)
|
||||||
|
@ -719,8 +770,11 @@ impl ClusterInfoVoteListener {
|
||||||
cluster_confirmed_slot_sender,
|
cluster_confirmed_slot_sender,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
gossip_vote_txn_processing_time.stop();
|
||||||
|
let gossip_vote_txn_processing_time_us = gossip_vote_txn_processing_time.as_us();
|
||||||
|
|
||||||
// Process all the slots accumulated from replay and gossip.
|
// Process all the slots accumulated from replay and gossip.
|
||||||
|
let mut gossip_vote_slot_confirming_time = Measure::start("gossip_vote_slot_confirm_time");
|
||||||
for (slot, mut slot_diff) in diff {
|
for (slot, mut slot_diff) in diff {
|
||||||
let slot_tracker = vote_tracker.get_or_insert_slot_tracker(slot);
|
let slot_tracker = vote_tracker.get_or_insert_slot_tracker(slot);
|
||||||
{
|
{
|
||||||
|
@ -768,6 +822,16 @@ impl ClusterInfoVoteListener {
|
||||||
|
|
||||||
w_slot_tracker.gossip_only_stake += gossip_only_stake
|
w_slot_tracker.gossip_only_stake += gossip_only_stake
|
||||||
}
|
}
|
||||||
|
gossip_vote_slot_confirming_time.stop();
|
||||||
|
let gossip_vote_slot_confirming_time_us = gossip_vote_slot_confirming_time.as_us();
|
||||||
|
|
||||||
|
match vote_processing_time {
|
||||||
|
Some(ref mut vote_processing_time) => vote_processing_time.update(
|
||||||
|
gossip_vote_txn_processing_time_us,
|
||||||
|
gossip_vote_slot_confirming_time_us,
|
||||||
|
),
|
||||||
|
None => {}
|
||||||
|
}
|
||||||
new_optimistic_confirmed_slots
|
new_optimistic_confirmed_slots
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -949,6 +1013,7 @@ mod tests {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -980,6 +1045,7 @@ mod tests {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -1062,6 +1128,7 @@ mod tests {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -1219,6 +1286,7 @@ mod tests {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -1319,6 +1387,7 @@ mod tests {
|
||||||
&replay_votes_receiver,
|
&replay_votes_receiver,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
let slot_vote_tracker = vote_tracker.get_slot_vote_tracker(vote_slot).unwrap();
|
let slot_vote_tracker = vote_tracker.get_slot_vote_tracker(vote_slot).unwrap();
|
||||||
|
@ -1409,6 +1478,7 @@ mod tests {
|
||||||
&verified_vote_sender,
|
&verified_vote_sender,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Setup next epoch
|
// Setup next epoch
|
||||||
|
@ -1455,6 +1525,7 @@ mod tests {
|
||||||
&verified_vote_sender,
|
&verified_vote_sender,
|
||||||
&None,
|
&None,
|
||||||
&None,
|
&None,
|
||||||
|
&mut None,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue