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
This commit is contained in:
parent
639a61d639
commit
f2b0d562b0
|
@ -233,6 +233,10 @@ pub struct CliEpochInfo {
|
||||||
pub epoch_info: EpochInfo,
|
pub epoch_info: EpochInfo,
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
pub average_slot_time_ms: u64,
|
pub average_slot_time_ms: u64,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub start_block_time: Option<UnixTimestamp>,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub current_block_time: Option<UnixTimestamp>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QuietDisplay for CliEpochInfo {}
|
impl QuietDisplay for CliEpochInfo {}
|
||||||
|
@ -277,21 +281,41 @@ impl fmt::Display for CliEpochInfo {
|
||||||
remaining_slots_in_epoch
|
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(
|
writeln_name_value(
|
||||||
f,
|
f,
|
||||||
"Epoch Completed Time:",
|
"Epoch Completed Time:",
|
||||||
&format!(
|
&format!(
|
||||||
"{}/{} ({} remaining)",
|
"{}{}/{} ({} remaining)",
|
||||||
slot_to_human_time(self.epoch_info.slot_index, self.average_slot_time_ms),
|
humantime::format_duration(time_elapsed).to_string(),
|
||||||
slot_to_human_time(self.epoch_info.slots_in_epoch, self.average_slot_time_ms),
|
if annotation.is_some() { "*" } else { "" },
|
||||||
slot_to_human_time(remaining_slots_in_epoch, self.average_slot_time_ms)
|
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 {
|
fn slot_to_duration(slot: Slot, slot_time_ms: u64) -> Duration {
|
||||||
humantime::format_duration(Duration::from_secs((slot * slot_time_ms) / 1000)).to_string()
|
Duration::from_secs((slot * slot_time_ms) / 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Default)]
|
#[derive(Serialize, Deserialize, Default)]
|
||||||
|
|
|
@ -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)
|
(secs as u64).saturating_mul(1000).checked_div(slots)
|
||||||
})
|
})
|
||||||
.unwrap_or(clock::DEFAULT_MS_PER_SLOT);
|
.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 {
|
let epoch_info = CliEpochInfo {
|
||||||
epoch_info,
|
epoch_info,
|
||||||
average_slot_time_ms,
|
average_slot_time_ms,
|
||||||
|
start_block_time,
|
||||||
|
current_block_time,
|
||||||
};
|
};
|
||||||
Ok(config.output_format.formatted_string(&epoch_info))
|
Ok(config.output_format.formatted_string(&epoch_info))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue