Rework snapshot download logic to be more forgiving when ` --expected-shred-version` is not provided

This commit is contained in:
Michael Vines 2020-09-16 12:15:19 -07:00 committed by mergify[bot]
parent 32dcce0ac1
commit 98cfe92745
1 changed files with 33 additions and 33 deletions

View File

@ -81,34 +81,6 @@ fn hash_validator(hash: String) -> Result<(), String> {
.map_err(|e| format!("{:?}", e))
}
fn get_shred_rpc_peers(
cluster_info: &ClusterInfo,
expected_shred_version: Option<u16>,
) -> Vec<ContactInfo> {
let rpc_peers = cluster_info.all_rpc_peers();
match expected_shred_version {
Some(expected_shred_version) => {
// Filter out rpc peers that don't match the expected shred version
rpc_peers
.into_iter()
.filter(|contact_info| contact_info.shred_version == expected_shred_version)
.collect::<Vec<_>>()
}
None => {
if !rpc_peers
.iter()
.all(|contact_info| contact_info.shred_version == rpc_peers[0].shred_version)
{
eprintln!(
"Multiple shred versions observed in gossip. Restart with --expected-shred-version"
);
exit(1);
}
rpc_peers
}
}
}
fn is_trusted_validator(id: &Pubkey, trusted_validators: &Option<HashSet<Pubkey>>) -> bool {
if let Some(trusted_validators) = trusted_validators {
trusted_validators.contains(id)
@ -168,6 +140,7 @@ fn start_gossip_node(
fn get_rpc_node(
cluster_info: &ClusterInfo,
entrypoint_gossip: &SocketAddr,
validator_config: &ValidatorConfig,
blacklisted_rpc_nodes: &mut HashSet<Pubkey>,
snapshot_not_required: bool,
@ -175,14 +148,40 @@ fn get_rpc_node(
) -> (ContactInfo, Option<(Slot, Hash)>) {
let mut blacklist_timeout = Instant::now();
loop {
info!(
"Searching for an RPC service, shred version={:?}...",
validator_config.expected_shred_version
);
sleep(Duration::from_secs(1));
info!("\n{}", cluster_info.contact_info_trace());
let rpc_peers = get_shred_rpc_peers(&cluster_info, validator_config.expected_shred_version);
let shred_version = validator_config
.expected_shred_version
.unwrap_or_else(|| cluster_info.my_shred_version());
if shred_version == 0 {
if let Some(entrypoint) =
cluster_info.lookup_contact_info_by_gossip_addr(entrypoint_gossip)
{
if entrypoint.shred_version == 0 {
eprintln!(
"Entrypoint shred version is zero. Restart with --expected-shred-version"
);
exit(1);
}
}
info!(
"Waiting to adopt entrypoint shred version, contact info for {:?} not found...",
entrypoint_gossip
);
continue;
}
info!(
"Searching for an RPC service with shred version {}...",
shred_version
);
let rpc_peers = cluster_info
.all_rpc_peers()
.into_iter()
.filter(|contact_info| contact_info.shred_version == shred_version)
.collect::<Vec<_>>();
let rpc_peers_total = rpc_peers.len();
// Filter out blacklisted nodes
@ -1360,6 +1359,7 @@ pub fn main() {
let (rpc_contact_info, snapshot_hash) = get_rpc_node(
&gossip.as_ref().unwrap().0,
&cluster_entrypoint.gossip,
&validator_config,
&mut blacklisted_rpc_nodes,
no_snapshot_fetch,