From f2b0d562b049d8e14319952c5798434cee423071 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 28 Jun 2021 15:32:28 -0600 Subject: [PATCH] Cli epoch-info: generate epoch-completed time from block times (#18258) * Generate epoch-completed time from block times * Add annotation when block times not available --- cli-output/src/cli_output.rs | 38 +++++++++++++++++++++++++++++------- cli/src/cluster_query.rs | 6 ++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/cli-output/src/cli_output.rs b/cli-output/src/cli_output.rs index 964b03e7c..f5357f673 100644 --- a/cli-output/src/cli_output.rs +++ b/cli-output/src/cli_output.rs @@ -233,6 +233,10 @@ pub struct CliEpochInfo { pub epoch_info: EpochInfo, #[serde(skip)] pub average_slot_time_ms: u64, + #[serde(skip)] + pub start_block_time: Option, + #[serde(skip)] + pub current_block_time: Option, } impl QuietDisplay for CliEpochInfo {} @@ -277,21 +281,41 @@ impl fmt::Display for CliEpochInfo { remaining_slots_in_epoch ), )?; + let (time_elapsed, annotation) = if let (Some(start_block_time), Some(current_block_time)) = + (self.start_block_time, self.current_block_time) + { + ( + Duration::from_secs((current_block_time - start_block_time) as u64), + None, + ) + } else { + ( + slot_to_duration(self.epoch_info.slot_index, self.average_slot_time_ms), + Some("* estimated based on current slot durations"), + ) + }; + let time_remaining = slot_to_duration(remaining_slots_in_epoch, self.average_slot_time_ms); writeln_name_value( f, "Epoch Completed Time:", &format!( - "{}/{} ({} remaining)", - slot_to_human_time(self.epoch_info.slot_index, self.average_slot_time_ms), - slot_to_human_time(self.epoch_info.slots_in_epoch, self.average_slot_time_ms), - slot_to_human_time(remaining_slots_in_epoch, self.average_slot_time_ms) + "{}{}/{} ({} remaining)", + humantime::format_duration(time_elapsed).to_string(), + if annotation.is_some() { "*" } else { "" }, + humantime::format_duration(time_elapsed + time_remaining).to_string(), + humantime::format_duration(time_remaining).to_string(), ), - ) + )?; + if let Some(annotation) = annotation { + writeln!(f)?; + writeln!(f, "{}", annotation)?; + } + Ok(()) } } -fn slot_to_human_time(slot: Slot, slot_time_ms: u64) -> String { - humantime::format_duration(Duration::from_secs((slot * slot_time_ms) / 1000)).to_string() +fn slot_to_duration(slot: Slot, slot_time_ms: u64) -> Duration { + Duration::from_secs((slot * slot_time_ms) / 1000) } #[derive(Serialize, Deserialize, Default)] diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 9a7fff174..1a375f3d8 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -1074,9 +1074,15 @@ pub fn process_get_epoch_info(rpc_client: &RpcClient, config: &CliConfig) -> Pro (secs as u64).saturating_mul(1000).checked_div(slots) }) .unwrap_or(clock::DEFAULT_MS_PER_SLOT); + let start_block_time = rpc_client + .get_block_time(epoch_info.absolute_slot - epoch_info.slot_index) + .ok(); + let current_block_time = rpc_client.get_block_time(epoch_info.absolute_slot).ok(); let epoch_info = CliEpochInfo { epoch_info, average_slot_time_ms, + start_block_time, + current_block_time, }; Ok(config.output_format.formatted_string(&epoch_info)) }