diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 467c6110d0..fdc9614d86 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -173,6 +173,7 @@ pub enum CliCommand { Catchup { node_pubkey: Pubkey, node_json_rpc_url: Option, + follow: bool, }, ClusterVersion, CreateAddressWithSeed { @@ -1593,7 +1594,8 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { CliCommand::Catchup { node_pubkey, node_json_rpc_url, - } => process_catchup(&rpc_client, node_pubkey, node_json_rpc_url), + follow, + } => process_catchup(&rpc_client, node_pubkey, node_json_rpc_url, *follow), CliCommand::ClusterVersion => process_cluster_version(&rpc_client), CliCommand::CreateAddressWithSeed { from_pubkey, diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 4ba770f5f1..2b86503631 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -67,6 +67,12 @@ impl ClusterQuerySubCommands for App<'_, '_> { .takes_value(true) .validator(is_url) .help("JSON RPC URL for validator, which is useful for validators with a private RPC service") + ) + .arg( + Arg::with_name("follow") + .long("follow") + .takes_value(false) + .help("Continue reporting progress even after the validator has caught up"), ), ) .subcommand( @@ -269,10 +275,12 @@ pub fn parse_catchup( ) -> Result { let node_pubkey = pubkey_of_signer(matches, "node_pubkey", wallet_manager)?.unwrap(); let node_json_rpc_url = value_t!(matches, "node_json_rpc_url", String).ok(); + let follow = matches.is_present("follow"); Ok(CliCommandInfo { command: CliCommand::Catchup { node_pubkey, node_json_rpc_url, + follow, }, signers: vec![], }) @@ -428,6 +436,7 @@ pub fn process_catchup( rpc_client: &RpcClient, node_pubkey: &Pubkey, node_json_rpc_url: &Option, + follow: bool, ) -> ProcessResult { let sleep_interval = 5; @@ -477,7 +486,7 @@ pub fn process_catchup( loop { let rpc_slot = rpc_client.get_slot_with_commitment(CommitmentConfig::recent())?; let node_slot = node_client.get_slot_with_commitment(CommitmentConfig::recent())?; - if node_slot > std::cmp::min(previous_rpc_slot, rpc_slot) { + if !follow && node_slot > std::cmp::min(previous_rpc_slot, rpc_slot) { progress_bar.finish_and_clear(); return Ok(format!( "{} has caught up (us:{} them:{})", @@ -491,7 +500,7 @@ pub fn process_catchup( slot_distance, node_slot, rpc_slot, - if previous_rpc_slot == std::u64::MAX { + if slot_distance == 0 || previous_rpc_slot == std::u64::MAX { "".to_string() } else { let slots_per_second =