Find epoch start slot for estimated time elapsed (#25491)
* Find epoch start slot for estimated time elapsed * Only do stuff requiring additional queries when output != json
This commit is contained in:
parent
82eba41a7d
commit
a3d82b8d06
|
@ -1094,27 +1094,49 @@ pub fn process_get_epoch(rpc_client: &RpcClient, _config: &CliConfig) -> Process
|
||||||
|
|
||||||
pub fn process_get_epoch_info(rpc_client: &RpcClient, config: &CliConfig) -> ProcessResult {
|
pub fn process_get_epoch_info(rpc_client: &RpcClient, config: &CliConfig) -> ProcessResult {
|
||||||
let epoch_info = rpc_client.get_epoch_info()?;
|
let epoch_info = rpc_client.get_epoch_info()?;
|
||||||
let average_slot_time_ms = rpc_client
|
let mut cli_epoch_info = CliEpochInfo {
|
||||||
.get_recent_performance_samples(Some(60))
|
|
||||||
.ok()
|
|
||||||
.and_then(|samples| {
|
|
||||||
let (slots, secs) = samples.iter().fold((0, 0), |(slots, secs), sample| {
|
|
||||||
(slots + sample.num_slots, secs + sample.sample_period_secs)
|
|
||||||
});
|
|
||||||
(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,
|
epoch_info,
|
||||||
average_slot_time_ms,
|
average_slot_time_ms: 0,
|
||||||
start_block_time,
|
start_block_time: None,
|
||||||
current_block_time,
|
current_block_time: None,
|
||||||
};
|
};
|
||||||
Ok(config.output_format.formatted_string(&epoch_info))
|
match config.output_format {
|
||||||
|
OutputFormat::Json | OutputFormat::JsonCompact => {}
|
||||||
|
_ => {
|
||||||
|
let epoch_info = cli_epoch_info.epoch_info.clone();
|
||||||
|
let average_slot_time_ms = rpc_client
|
||||||
|
.get_recent_performance_samples(Some(60))
|
||||||
|
.ok()
|
||||||
|
.and_then(|samples| {
|
||||||
|
let (slots, secs) = samples.iter().fold((0, 0), |(slots, secs), sample| {
|
||||||
|
(slots + sample.num_slots, secs + sample.sample_period_secs)
|
||||||
|
});
|
||||||
|
(secs as u64).saturating_mul(1000).checked_div(slots)
|
||||||
|
})
|
||||||
|
.unwrap_or(clock::DEFAULT_MS_PER_SLOT);
|
||||||
|
let epoch_expected_start_slot = epoch_info.absolute_slot - epoch_info.slot_index;
|
||||||
|
let first_block_in_epoch = rpc_client
|
||||||
|
.get_blocks_with_limit(epoch_expected_start_slot, 1)
|
||||||
|
.ok()
|
||||||
|
.and_then(|slot_vec| slot_vec.get(0).cloned())
|
||||||
|
.unwrap_or(epoch_expected_start_slot);
|
||||||
|
let start_block_time =
|
||||||
|
rpc_client
|
||||||
|
.get_block_time(first_block_in_epoch)
|
||||||
|
.ok()
|
||||||
|
.map(|time| {
|
||||||
|
time + (((first_block_in_epoch - epoch_expected_start_slot)
|
||||||
|
* average_slot_time_ms)
|
||||||
|
/ 1000) as i64
|
||||||
|
});
|
||||||
|
let current_block_time = rpc_client.get_block_time(epoch_info.absolute_slot).ok();
|
||||||
|
|
||||||
|
cli_epoch_info.average_slot_time_ms = average_slot_time_ms;
|
||||||
|
cli_epoch_info.start_block_time = start_block_time;
|
||||||
|
cli_epoch_info.current_block_time = current_block_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(config.output_format.formatted_string(&cli_epoch_info))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_get_genesis_hash(rpc_client: &RpcClient) -> ProcessResult {
|
pub fn process_get_genesis_hash(rpc_client: &RpcClient) -> ProcessResult {
|
||||||
|
|
Loading…
Reference in New Issue