measures processing time of each kind of gossip packets (#13366)

This commit is contained in:
behzad nouri 2020-11-05 15:34:34 +00:00 committed by GitHub
parent 5e7565fefe
commit 118ce47b97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 66 additions and 0 deletions

View File

@ -199,6 +199,30 @@ impl Counter {
} }
} }
struct ScopedTimer<'a> {
clock: Instant,
metric: &'a AtomicU64,
}
impl<'a> From<&'a Counter> for ScopedTimer<'a> {
// Output should be assigned to a *named* variable,
// otherwise it is immediately dropped.
#[must_use]
fn from(counter: &'a Counter) -> Self {
Self {
clock: Instant::now(),
metric: &counter.0,
}
}
}
impl Drop for ScopedTimer<'_> {
fn drop(&mut self) {
let micros = self.clock.elapsed().as_micros();
self.metric.fetch_add(micros as u64, Ordering::Relaxed);
}
}
#[derive(Default)] #[derive(Default)]
struct GossipStats { struct GossipStats {
entrypoint: Counter, entrypoint: Counter,
@ -216,6 +240,12 @@ struct GossipStats {
new_push_requests2: Counter, new_push_requests2: Counter,
new_push_requests_num: Counter, new_push_requests_num: Counter,
filter_pull_response: Counter, filter_pull_response: Counter,
handle_batch_ping_messages_time: Counter,
handle_batch_pong_messages_time: Counter,
handle_batch_prune_messages_time: Counter,
handle_batch_pull_requests_time: Counter,
handle_batch_pull_responses_time: Counter,
handle_batch_push_messages_time: Counter,
process_gossip_packets_time: Counter, process_gossip_packets_time: Counter,
process_pull_response: Counter, process_pull_response: Counter,
process_pull_response_count: Counter, process_pull_response_count: Counter,
@ -1810,6 +1840,7 @@ impl ClusterInfo {
} }
fn handle_batch_prune_messages(&self, messages: Vec<(Pubkey, PruneData)>) { fn handle_batch_prune_messages(&self, messages: Vec<(Pubkey, PruneData)>) {
let _st = ScopedTimer::from(&self.stats.handle_batch_prune_messages_time);
if messages.is_empty() { if messages.is_empty() {
return; return;
} }
@ -1864,6 +1895,7 @@ impl ClusterInfo {
response_sender: &PacketSender, response_sender: &PacketSender,
feature_set: Option<&FeatureSet>, feature_set: Option<&FeatureSet>,
) { ) {
let _st = ScopedTimer::from(&self.stats.handle_batch_pull_requests_time);
if requests.is_empty() { if requests.is_empty() {
return; return;
} }
@ -2084,6 +2116,7 @@ impl ClusterInfo {
stakes: &HashMap<Pubkey, u64>, stakes: &HashMap<Pubkey, u64>,
epoch_time_ms: u64, epoch_time_ms: u64,
) { ) {
let _st = ScopedTimer::from(&self.stats.handle_batch_pull_responses_time);
if responses.is_empty() { if responses.is_empty() {
return; return;
} }
@ -2233,6 +2266,7 @@ impl ClusterInfo {
) where ) where
I: IntoIterator<Item = (SocketAddr, Ping)>, I: IntoIterator<Item = (SocketAddr, Ping)>,
{ {
let _st = ScopedTimer::from(&self.stats.handle_batch_ping_messages_time);
if let Some(response) = self.handle_ping_messages(pings, recycler) { if let Some(response) = self.handle_ping_messages(pings, recycler) {
let _ = response_sender.send(response); let _ = response_sender.send(response);
} }
@ -2264,6 +2298,7 @@ impl ClusterInfo {
where where
I: IntoIterator<Item = (SocketAddr, Pong)>, I: IntoIterator<Item = (SocketAddr, Pong)>,
{ {
let _st = ScopedTimer::from(&self.stats.handle_batch_pong_messages_time);
let mut pongs = pongs.into_iter().peekable(); let mut pongs = pongs.into_iter().peekable();
if pongs.peek().is_some() { if pongs.peek().is_some() {
let mut ping_cache = self.ping_cache.write().unwrap(); let mut ping_cache = self.ping_cache.write().unwrap();
@ -2281,6 +2316,7 @@ impl ClusterInfo {
stakes: &HashMap<Pubkey, u64>, stakes: &HashMap<Pubkey, u64>,
response_sender: &PacketSender, response_sender: &PacketSender,
) { ) {
let _st = ScopedTimer::from(&self.stats.handle_batch_push_messages_time);
if messages.is_empty() { if messages.is_empty() {
return; return;
} }
@ -2588,6 +2624,36 @@ impl ClusterInfo {
self.stats.process_gossip_packets_time.clear(), self.stats.process_gossip_packets_time.clear(),
i64 i64
), ),
(
"handle_batch_ping_messages_time",
self.stats.handle_batch_ping_messages_time.clear(),
i64
),
(
"handle_batch_pong_messages_time",
self.stats.handle_batch_pong_messages_time.clear(),
i64
),
(
"handle_batch_prune_messages_time",
self.stats.handle_batch_prune_messages_time.clear(),
i64
),
(
"handle_batch_pull_requests_time",
self.stats.handle_batch_pull_requests_time.clear(),
i64
),
(
"handle_batch_pull_responses_time",
self.stats.handle_batch_pull_responses_time.clear(),
i64
),
(
"handle_batch_push_messages_time",
self.stats.handle_batch_push_messages_time.clear(),
i64
),
( (
"process_pull_resp", "process_pull_resp",
self.stats.process_pull_response.clear(), self.stats.process_pull_response.clear(),