Rename "trusted" to "known" in validators/
(#21197)
* Replaced trusted with known validator * Format Convention
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
// Service to verify accounts hashes with other trusted validator nodes.
|
// Service to verify accounts hashes with other known validator nodes.
|
||||||
//
|
//
|
||||||
// Each interval, publish the snapshat hash which is the full accounts state
|
// Each interval, publish the snapshat hash which is the full accounts state
|
||||||
// hash on gossip. Monitor gossip for messages from validators in the `--known-validator`s
|
// hash on gossip. Monitor gossip for messages from validators in the `--known-validator`s
|
||||||
@ -40,8 +40,8 @@ impl AccountsHashVerifier {
|
|||||||
pending_snapshot_package: Option<PendingSnapshotPackage>,
|
pending_snapshot_package: Option<PendingSnapshotPackage>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
cluster_info: &Arc<ClusterInfo>,
|
cluster_info: &Arc<ClusterInfo>,
|
||||||
trusted_validators: Option<HashSet<Pubkey>>,
|
known_validators: Option<HashSet<Pubkey>>,
|
||||||
halt_on_trusted_validators_accounts_hash_mismatch: bool,
|
halt_on_known_validators_accounts_hash_mismatch: bool,
|
||||||
fault_injection_rate_slots: u64,
|
fault_injection_rate_slots: u64,
|
||||||
snapshot_config: Option<SnapshotConfig>,
|
snapshot_config: Option<SnapshotConfig>,
|
||||||
ledger_path: PathBuf,
|
ledger_path: PathBuf,
|
||||||
@ -68,8 +68,8 @@ impl AccountsHashVerifier {
|
|||||||
Self::process_accounts_package(
|
Self::process_accounts_package(
|
||||||
accounts_package,
|
accounts_package,
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
trusted_validators.as_ref(),
|
known_validators.as_ref(),
|
||||||
halt_on_trusted_validators_accounts_hash_mismatch,
|
halt_on_known_validators_accounts_hash_mismatch,
|
||||||
pending_snapshot_package.as_ref(),
|
pending_snapshot_package.as_ref(),
|
||||||
&mut hashes,
|
&mut hashes,
|
||||||
&exit,
|
&exit,
|
||||||
@ -94,8 +94,8 @@ impl AccountsHashVerifier {
|
|||||||
fn process_accounts_package(
|
fn process_accounts_package(
|
||||||
accounts_package: AccountsPackage,
|
accounts_package: AccountsPackage,
|
||||||
cluster_info: &ClusterInfo,
|
cluster_info: &ClusterInfo,
|
||||||
trusted_validators: Option<&HashSet<Pubkey>>,
|
known_validators: Option<&HashSet<Pubkey>>,
|
||||||
halt_on_trusted_validator_accounts_hash_mismatch: bool,
|
halt_on_known_validator_accounts_hash_mismatch: bool,
|
||||||
pending_snapshot_package: Option<&PendingSnapshotPackage>,
|
pending_snapshot_package: Option<&PendingSnapshotPackage>,
|
||||||
hashes: &mut Vec<(Slot, Hash)>,
|
hashes: &mut Vec<(Slot, Hash)>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
@ -109,8 +109,8 @@ impl AccountsHashVerifier {
|
|||||||
Self::push_accounts_hashes_to_cluster(
|
Self::push_accounts_hashes_to_cluster(
|
||||||
&accounts_package,
|
&accounts_package,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
trusted_validators,
|
known_validators,
|
||||||
halt_on_trusted_validator_accounts_hash_mismatch,
|
halt_on_known_validator_accounts_hash_mismatch,
|
||||||
hashes,
|
hashes,
|
||||||
exit,
|
exit,
|
||||||
fault_injection_rate_slots,
|
fault_injection_rate_slots,
|
||||||
@ -152,8 +152,8 @@ impl AccountsHashVerifier {
|
|||||||
fn push_accounts_hashes_to_cluster(
|
fn push_accounts_hashes_to_cluster(
|
||||||
accounts_package: &AccountsPackage,
|
accounts_package: &AccountsPackage,
|
||||||
cluster_info: &ClusterInfo,
|
cluster_info: &ClusterInfo,
|
||||||
trusted_validators: Option<&HashSet<Pubkey>>,
|
known_validators: Option<&HashSet<Pubkey>>,
|
||||||
halt_on_trusted_validator_accounts_hash_mismatch: bool,
|
halt_on_known_validator_accounts_hash_mismatch: bool,
|
||||||
hashes: &mut Vec<(Slot, Hash)>,
|
hashes: &mut Vec<(Slot, Hash)>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
fault_injection_rate_slots: u64,
|
fault_injection_rate_slots: u64,
|
||||||
@ -177,12 +177,12 @@ impl AccountsHashVerifier {
|
|||||||
hashes.remove(0);
|
hashes.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if halt_on_trusted_validator_accounts_hash_mismatch {
|
if halt_on_known_validator_accounts_hash_mismatch {
|
||||||
let mut slot_to_hash = HashMap::new();
|
let mut slot_to_hash = HashMap::new();
|
||||||
for (slot, hash) in hashes.iter() {
|
for (slot, hash) in hashes.iter() {
|
||||||
slot_to_hash.insert(*slot, *hash);
|
slot_to_hash.insert(*slot, *hash);
|
||||||
}
|
}
|
||||||
if Self::should_halt(cluster_info, trusted_validators, &mut slot_to_hash) {
|
if Self::should_halt(cluster_info, known_validators, &mut slot_to_hash) {
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,20 +226,20 @@ impl AccountsHashVerifier {
|
|||||||
|
|
||||||
fn should_halt(
|
fn should_halt(
|
||||||
cluster_info: &ClusterInfo,
|
cluster_info: &ClusterInfo,
|
||||||
trusted_validators: Option<&HashSet<Pubkey>>,
|
known_validators: Option<&HashSet<Pubkey>>,
|
||||||
slot_to_hash: &mut HashMap<Slot, Hash>,
|
slot_to_hash: &mut HashMap<Slot, Hash>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut verified_count = 0;
|
let mut verified_count = 0;
|
||||||
let mut highest_slot = 0;
|
let mut highest_slot = 0;
|
||||||
if let Some(trusted_validators) = trusted_validators {
|
if let Some(known_validators) = known_validators {
|
||||||
for trusted_validator in trusted_validators {
|
for known_validator in known_validators {
|
||||||
let is_conflicting = cluster_info.get_accounts_hash_for_node(trusted_validator, |accounts_hashes|
|
let is_conflicting = cluster_info.get_accounts_hash_for_node(known_validator, |accounts_hashes|
|
||||||
{
|
{
|
||||||
accounts_hashes.iter().any(|(slot, hash)| {
|
accounts_hashes.iter().any(|(slot, hash)| {
|
||||||
if let Some(reference_hash) = slot_to_hash.get(slot) {
|
if let Some(reference_hash) = slot_to_hash.get(slot) {
|
||||||
if *hash != *reference_hash {
|
if *hash != *reference_hash {
|
||||||
error!("Trusted validator {} produced conflicting hashes for slot: {} ({} != {})",
|
error!("Known validator {} produced conflicting hashes for slot: {} ({} != {})",
|
||||||
trusted_validator,
|
known_validator,
|
||||||
slot,
|
slot,
|
||||||
hash,
|
hash,
|
||||||
reference_hash,
|
reference_hash,
|
||||||
@ -303,11 +303,11 @@ mod tests {
|
|||||||
let cluster_info = new_test_cluster_info(contact_info);
|
let cluster_info = new_test_cluster_info(contact_info);
|
||||||
let cluster_info = Arc::new(cluster_info);
|
let cluster_info = Arc::new(cluster_info);
|
||||||
|
|
||||||
let mut trusted_validators = HashSet::new();
|
let mut known_validators = HashSet::new();
|
||||||
let mut slot_to_hash = HashMap::new();
|
let mut slot_to_hash = HashMap::new();
|
||||||
assert!(!AccountsHashVerifier::should_halt(
|
assert!(!AccountsHashVerifier::should_halt(
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
Some(&trusted_validators),
|
Some(&known_validators),
|
||||||
&mut slot_to_hash,
|
&mut slot_to_hash,
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -320,10 +320,10 @@ mod tests {
|
|||||||
cluster_info.flush_push_queue();
|
cluster_info.flush_push_queue();
|
||||||
}
|
}
|
||||||
slot_to_hash.insert(0, hash2);
|
slot_to_hash.insert(0, hash2);
|
||||||
trusted_validators.insert(validator1.pubkey());
|
known_validators.insert(validator1.pubkey());
|
||||||
assert!(AccountsHashVerifier::should_halt(
|
assert!(AccountsHashVerifier::should_halt(
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
Some(&trusted_validators),
|
Some(&known_validators),
|
||||||
&mut slot_to_hash,
|
&mut slot_to_hash,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -339,7 +339,7 @@ mod tests {
|
|||||||
let cluster_info = new_test_cluster_info(contact_info);
|
let cluster_info = new_test_cluster_info(contact_info);
|
||||||
let cluster_info = Arc::new(cluster_info);
|
let cluster_info = Arc::new(cluster_info);
|
||||||
|
|
||||||
let trusted_validators = HashSet::new();
|
let known_validators = HashSet::new();
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let mut hashes = vec![];
|
let mut hashes = vec![];
|
||||||
let full_snapshot_archive_interval_slots = 100;
|
let full_snapshot_archive_interval_slots = 100;
|
||||||
@ -370,7 +370,7 @@ mod tests {
|
|||||||
AccountsHashVerifier::process_accounts_package(
|
AccountsHashVerifier::process_accounts_package(
|
||||||
accounts_package,
|
accounts_package,
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
Some(&trusted_validators),
|
Some(&known_validators),
|
||||||
false,
|
false,
|
||||||
None,
|
None,
|
||||||
&mut hashes,
|
&mut hashes,
|
||||||
|
@ -1246,23 +1246,23 @@ mod tests {
|
|||||||
// 2) repair validator set only includes our own id
|
// 2) repair validator set only includes our own id
|
||||||
// then no repairs should be generated
|
// then no repairs should be generated
|
||||||
for pubkey in &[solana_sdk::pubkey::new_rand(), me.id] {
|
for pubkey in &[solana_sdk::pubkey::new_rand(), me.id] {
|
||||||
let trusted_validators = Some(vec![*pubkey].into_iter().collect());
|
let known_validators = Some(vec![*pubkey].into_iter().collect());
|
||||||
assert!(serve_repair.repair_peers(&trusted_validators, 1).is_empty());
|
assert!(serve_repair.repair_peers(&known_validators, 1).is_empty());
|
||||||
assert!(serve_repair
|
assert!(serve_repair
|
||||||
.repair_request(
|
.repair_request(
|
||||||
&cluster_slots,
|
&cluster_slots,
|
||||||
ShredRepairType::Shred(0, 0),
|
ShredRepairType::Shred(0, 0),
|
||||||
&mut LruCache::new(100),
|
&mut LruCache::new(100),
|
||||||
&mut RepairStats::default(),
|
&mut RepairStats::default(),
|
||||||
&trusted_validators,
|
&known_validators,
|
||||||
&mut OutstandingShredRepairs::default(),
|
&mut OutstandingShredRepairs::default(),
|
||||||
)
|
)
|
||||||
.is_err());
|
.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
// If trusted validator exists in gossip, should return repair successfully
|
// If known validator exists in gossip, should return repair successfully
|
||||||
let trusted_validators = Some(vec![contact_info2.id].into_iter().collect());
|
let known_validators = Some(vec![contact_info2.id].into_iter().collect());
|
||||||
let repair_peers = serve_repair.repair_peers(&trusted_validators, 1);
|
let repair_peers = serve_repair.repair_peers(&known_validators, 1);
|
||||||
assert_eq!(repair_peers.len(), 1);
|
assert_eq!(repair_peers.len(), 1);
|
||||||
assert_eq!(repair_peers[0].id, contact_info2.id);
|
assert_eq!(repair_peers[0].id, contact_info2.id);
|
||||||
assert!(serve_repair
|
assert!(serve_repair
|
||||||
@ -1271,12 +1271,12 @@ mod tests {
|
|||||||
ShredRepairType::Shred(0, 0),
|
ShredRepairType::Shred(0, 0),
|
||||||
&mut LruCache::new(100),
|
&mut LruCache::new(100),
|
||||||
&mut RepairStats::default(),
|
&mut RepairStats::default(),
|
||||||
&trusted_validators,
|
&known_validators,
|
||||||
&mut OutstandingShredRepairs::default(),
|
&mut OutstandingShredRepairs::default(),
|
||||||
)
|
)
|
||||||
.is_ok());
|
.is_ok());
|
||||||
|
|
||||||
// Using no trusted validators should default to all
|
// Using no known validators should default to all
|
||||||
// validator's available in gossip, excluding myself
|
// validator's available in gossip, excluding myself
|
||||||
let repair_peers: HashSet<Pubkey> = serve_repair
|
let repair_peers: HashSet<Pubkey> = serve_repair
|
||||||
.repair_peers(&None, 1)
|
.repair_peers(&None, 1)
|
||||||
|
@ -82,8 +82,8 @@ pub struct Sockets {
|
|||||||
pub struct TvuConfig {
|
pub struct TvuConfig {
|
||||||
pub max_ledger_shreds: Option<u64>,
|
pub max_ledger_shreds: Option<u64>,
|
||||||
pub shred_version: u16,
|
pub shred_version: u16,
|
||||||
pub halt_on_trusted_validators_accounts_hash_mismatch: bool,
|
pub halt_on_known_validators_accounts_hash_mismatch: bool,
|
||||||
pub trusted_validators: Option<HashSet<Pubkey>>,
|
pub known_validators: Option<HashSet<Pubkey>>,
|
||||||
pub repair_validators: Option<HashSet<Pubkey>>,
|
pub repair_validators: Option<HashSet<Pubkey>>,
|
||||||
pub accounts_hash_fault_injection_slots: u64,
|
pub accounts_hash_fault_injection_slots: u64,
|
||||||
pub accounts_db_caching_enabled: bool,
|
pub accounts_db_caching_enabled: bool,
|
||||||
@ -220,8 +220,8 @@ impl Tvu {
|
|||||||
pending_snapshot_package,
|
pending_snapshot_package,
|
||||||
exit,
|
exit,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
tvu_config.trusted_validators.clone(),
|
tvu_config.known_validators.clone(),
|
||||||
tvu_config.halt_on_trusted_validators_accounts_hash_mismatch,
|
tvu_config.halt_on_known_validators_accounts_hash_mismatch,
|
||||||
tvu_config.accounts_hash_fault_injection_slots,
|
tvu_config.accounts_hash_fault_injection_slots,
|
||||||
snapshot_config.clone(),
|
snapshot_config.clone(),
|
||||||
blockstore.ledger_path().to_path_buf(),
|
blockstore.ledger_path().to_path_buf(),
|
||||||
|
@ -130,10 +130,10 @@ pub struct ValidatorConfig {
|
|||||||
pub fixed_leader_schedule: Option<FixedSchedule>,
|
pub fixed_leader_schedule: Option<FixedSchedule>,
|
||||||
pub wait_for_supermajority: Option<Slot>,
|
pub wait_for_supermajority: Option<Slot>,
|
||||||
pub new_hard_forks: Option<Vec<Slot>>,
|
pub new_hard_forks: Option<Vec<Slot>>,
|
||||||
pub trusted_validators: Option<HashSet<Pubkey>>, // None = trust all
|
pub known_validators: Option<HashSet<Pubkey>>, // None = trust all
|
||||||
pub repair_validators: Option<HashSet<Pubkey>>, // None = repair from all
|
pub repair_validators: Option<HashSet<Pubkey>>, // None = repair from all
|
||||||
pub gossip_validators: Option<HashSet<Pubkey>>, // None = gossip with all
|
pub gossip_validators: Option<HashSet<Pubkey>>, // None = gossip with all
|
||||||
pub halt_on_trusted_validators_accounts_hash_mismatch: bool,
|
pub halt_on_known_validators_accounts_hash_mismatch: bool,
|
||||||
pub accounts_hash_fault_injection_slots: u64, // 0 = no fault injection
|
pub accounts_hash_fault_injection_slots: u64, // 0 = no fault injection
|
||||||
pub frozen_accounts: Vec<Pubkey>,
|
pub frozen_accounts: Vec<Pubkey>,
|
||||||
pub no_rocksdb_compaction: bool,
|
pub no_rocksdb_compaction: bool,
|
||||||
@ -190,10 +190,10 @@ impl Default for ValidatorConfig {
|
|||||||
fixed_leader_schedule: None,
|
fixed_leader_schedule: None,
|
||||||
wait_for_supermajority: None,
|
wait_for_supermajority: None,
|
||||||
new_hard_forks: None,
|
new_hard_forks: None,
|
||||||
trusted_validators: None,
|
known_validators: None,
|
||||||
repair_validators: None,
|
repair_validators: None,
|
||||||
gossip_validators: None,
|
gossip_validators: None,
|
||||||
halt_on_trusted_validators_accounts_hash_mismatch: false,
|
halt_on_known_validators_accounts_hash_mismatch: false,
|
||||||
accounts_hash_fault_injection_slots: 0,
|
accounts_hash_fault_injection_slots: 0,
|
||||||
frozen_accounts: vec![],
|
frozen_accounts: vec![],
|
||||||
no_rocksdb_compaction: false,
|
no_rocksdb_compaction: false,
|
||||||
@ -612,7 +612,7 @@ impl Validator {
|
|||||||
genesis_config.hash(),
|
genesis_config.hash(),
|
||||||
ledger_path,
|
ledger_path,
|
||||||
config.validator_exit.clone(),
|
config.validator_exit.clone(),
|
||||||
config.trusted_validators.clone(),
|
config.known_validators.clone(),
|
||||||
rpc_override_health_check.clone(),
|
rpc_override_health_check.clone(),
|
||||||
optimistically_confirmed_bank.clone(),
|
optimistically_confirmed_bank.clone(),
|
||||||
config.send_transaction_service_config.clone(),
|
config.send_transaction_service_config.clone(),
|
||||||
@ -827,10 +827,10 @@ impl Validator {
|
|||||||
cluster_confirmed_slot_receiver,
|
cluster_confirmed_slot_receiver,
|
||||||
TvuConfig {
|
TvuConfig {
|
||||||
max_ledger_shreds: config.max_ledger_shreds,
|
max_ledger_shreds: config.max_ledger_shreds,
|
||||||
halt_on_trusted_validators_accounts_hash_mismatch: config
|
halt_on_known_validators_accounts_hash_mismatch: config
|
||||||
.halt_on_trusted_validators_accounts_hash_mismatch,
|
.halt_on_known_validators_accounts_hash_mismatch,
|
||||||
shred_version: node.info.shred_version,
|
shred_version: node.info.shred_version,
|
||||||
trusted_validators: config.trusted_validators.clone(),
|
known_validators: config.known_validators.clone(),
|
||||||
repair_validators: config.repair_validators.clone(),
|
repair_validators: config.repair_validators.clone(),
|
||||||
accounts_hash_fault_injection_slots: config.accounts_hash_fault_injection_slots,
|
accounts_hash_fault_injection_slots: config.accounts_hash_fault_injection_slots,
|
||||||
accounts_db_caching_enabled: config.accounts_db_caching_enabled,
|
accounts_db_caching_enabled: config.accounts_db_caching_enabled,
|
||||||
|
@ -547,7 +547,7 @@ impl Crds {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cap: usize, // Capacity hint for number of unique pubkeys.
|
cap: usize, // Capacity hint for number of unique pubkeys.
|
||||||
// Set of pubkeys to never drop.
|
// Set of pubkeys to never drop.
|
||||||
// e.g. trusted validators, self pubkey, ...
|
// e.g. known validators, self pubkey, ...
|
||||||
keep: &[Pubkey],
|
keep: &[Pubkey],
|
||||||
stakes: &HashMap<Pubkey, u64>,
|
stakes: &HashMap<Pubkey, u64>,
|
||||||
now: u64,
|
now: u64,
|
||||||
|
@ -24,11 +24,11 @@ pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig {
|
|||||||
fixed_leader_schedule: config.fixed_leader_schedule.clone(),
|
fixed_leader_schedule: config.fixed_leader_schedule.clone(),
|
||||||
wait_for_supermajority: config.wait_for_supermajority,
|
wait_for_supermajority: config.wait_for_supermajority,
|
||||||
new_hard_forks: config.new_hard_forks.clone(),
|
new_hard_forks: config.new_hard_forks.clone(),
|
||||||
trusted_validators: config.trusted_validators.clone(),
|
known_validators: config.known_validators.clone(),
|
||||||
repair_validators: config.repair_validators.clone(),
|
repair_validators: config.repair_validators.clone(),
|
||||||
gossip_validators: config.gossip_validators.clone(),
|
gossip_validators: config.gossip_validators.clone(),
|
||||||
halt_on_trusted_validators_accounts_hash_mismatch: config
|
halt_on_known_validators_accounts_hash_mismatch: config
|
||||||
.halt_on_trusted_validators_accounts_hash_mismatch,
|
.halt_on_known_validators_accounts_hash_mismatch,
|
||||||
accounts_hash_fault_injection_slots: config.accounts_hash_fault_injection_slots,
|
accounts_hash_fault_injection_slots: config.accounts_hash_fault_injection_slots,
|
||||||
frozen_accounts: config.frozen_accounts.clone(),
|
frozen_accounts: config.frozen_accounts.clone(),
|
||||||
no_rocksdb_compaction: config.no_rocksdb_compaction,
|
no_rocksdb_compaction: config.no_rocksdb_compaction,
|
||||||
|
@ -1598,15 +1598,15 @@ fn test_consistency_halt() {
|
|||||||
let mut validator_snapshot_test_config =
|
let mut validator_snapshot_test_config =
|
||||||
setup_snapshot_validator_config(snapshot_interval_slots, num_account_paths);
|
setup_snapshot_validator_config(snapshot_interval_slots, num_account_paths);
|
||||||
|
|
||||||
let mut trusted_validators = HashSet::new();
|
let mut known_validators = HashSet::new();
|
||||||
trusted_validators.insert(cluster_nodes[0].id);
|
known_validators.insert(cluster_nodes[0].id);
|
||||||
|
|
||||||
validator_snapshot_test_config
|
validator_snapshot_test_config
|
||||||
.validator_config
|
.validator_config
|
||||||
.trusted_validators = Some(trusted_validators);
|
.known_validators = Some(known_validators);
|
||||||
validator_snapshot_test_config
|
validator_snapshot_test_config
|
||||||
.validator_config
|
.validator_config
|
||||||
.halt_on_trusted_validators_accounts_hash_mismatch = true;
|
.halt_on_known_validators_accounts_hash_mismatch = true;
|
||||||
|
|
||||||
warn!("adding a validator");
|
warn!("adding a validator");
|
||||||
cluster.add_validator(
|
cluster.add_validator(
|
||||||
@ -2420,11 +2420,11 @@ fn test_snapshots_blockstore_floor() {
|
|||||||
SocketAddrSpace::Unspecified,
|
SocketAddrSpace::Unspecified,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let mut trusted_validators = HashSet::new();
|
let mut known_validators = HashSet::new();
|
||||||
trusted_validators.insert(cluster_nodes[0].id);
|
known_validators.insert(cluster_nodes[0].id);
|
||||||
validator_snapshot_test_config
|
validator_snapshot_test_config
|
||||||
.validator_config
|
.validator_config
|
||||||
.trusted_validators = Some(trusted_validators);
|
.known_validators = Some(known_validators);
|
||||||
|
|
||||||
cluster.add_validator(
|
cluster.add_validator(
|
||||||
&validator_snapshot_test_config.validator_config,
|
&validator_snapshot_test_config.validator_config,
|
||||||
|
@ -2296,7 +2296,7 @@ fn _send_transaction(
|
|||||||
Ok(signature.to_string())
|
Ok(signature.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Minimal RPC interface that trusted validators are expected to provide
|
// Minimal RPC interface that known validators are expected to provide
|
||||||
pub mod rpc_minimal {
|
pub mod rpc_minimal {
|
||||||
use super::*;
|
use super::*;
|
||||||
#[rpc]
|
#[rpc]
|
||||||
|
@ -11,13 +11,13 @@ use {
|
|||||||
#[derive(PartialEq, Clone, Copy, Debug)]
|
#[derive(PartialEq, Clone, Copy, Debug)]
|
||||||
pub enum RpcHealthStatus {
|
pub enum RpcHealthStatus {
|
||||||
Ok,
|
Ok,
|
||||||
Behind { num_slots: Slot }, // Validator is behind its trusted validators
|
Behind { num_slots: Slot }, // Validator is behind its known validators
|
||||||
Unknown,
|
Unknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct RpcHealth {
|
pub struct RpcHealth {
|
||||||
cluster_info: Arc<ClusterInfo>,
|
cluster_info: Arc<ClusterInfo>,
|
||||||
trusted_validators: Option<HashSet<Pubkey>>,
|
known_validators: Option<HashSet<Pubkey>>,
|
||||||
health_check_slot_distance: u64,
|
health_check_slot_distance: u64,
|
||||||
override_health_check: Arc<AtomicBool>,
|
override_health_check: Arc<AtomicBool>,
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -27,13 +27,13 @@ pub struct RpcHealth {
|
|||||||
impl RpcHealth {
|
impl RpcHealth {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
cluster_info: Arc<ClusterInfo>,
|
cluster_info: Arc<ClusterInfo>,
|
||||||
trusted_validators: Option<HashSet<Pubkey>>,
|
known_validators: Option<HashSet<Pubkey>>,
|
||||||
health_check_slot_distance: u64,
|
health_check_slot_distance: u64,
|
||||||
override_health_check: Arc<AtomicBool>,
|
override_health_check: Arc<AtomicBool>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
cluster_info,
|
cluster_info,
|
||||||
trusted_validators,
|
known_validators,
|
||||||
health_check_slot_distance,
|
health_check_slot_distance,
|
||||||
override_health_check,
|
override_health_check,
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -51,7 +51,7 @@ impl RpcHealth {
|
|||||||
|
|
||||||
if self.override_health_check.load(Ordering::Relaxed) {
|
if self.override_health_check.load(Ordering::Relaxed) {
|
||||||
RpcHealthStatus::Ok
|
RpcHealthStatus::Ok
|
||||||
} else if let Some(trusted_validators) = &self.trusted_validators {
|
} else if let Some(known_validators) = &self.known_validators {
|
||||||
match (
|
match (
|
||||||
self.cluster_info
|
self.cluster_info
|
||||||
.get_accounts_hash_for_node(&self.cluster_info.id(), |hashes| {
|
.get_accounts_hash_for_node(&self.cluster_info.id(), |hashes| {
|
||||||
@ -61,11 +61,11 @@ impl RpcHealth {
|
|||||||
.map(|slot_hash| slot_hash.0)
|
.map(|slot_hash| slot_hash.0)
|
||||||
})
|
})
|
||||||
.flatten(),
|
.flatten(),
|
||||||
trusted_validators
|
known_validators
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|trusted_validator| {
|
.filter_map(|known_validator| {
|
||||||
self.cluster_info
|
self.cluster_info
|
||||||
.get_accounts_hash_for_node(trusted_validator, |hashes| {
|
.get_accounts_hash_for_node(known_validator, |hashes| {
|
||||||
hashes
|
hashes
|
||||||
.iter()
|
.iter()
|
||||||
.max_by(|a, b| a.0.cmp(&b.0))
|
.max_by(|a, b| a.0.cmp(&b.0))
|
||||||
@ -77,39 +77,41 @@ impl RpcHealth {
|
|||||||
) {
|
) {
|
||||||
(
|
(
|
||||||
Some(latest_account_hash_slot),
|
Some(latest_account_hash_slot),
|
||||||
Some(latest_trusted_validator_account_hash_slot),
|
Some(latest_known_validator_account_hash_slot),
|
||||||
) => {
|
) => {
|
||||||
// The validator is considered healthy if its latest account hash slot is within
|
// The validator is considered healthy if its latest account hash slot is within
|
||||||
// `health_check_slot_distance` of the latest trusted validator's account hash slot
|
// `health_check_slot_distance` of the latest known validator's account hash slot
|
||||||
if latest_account_hash_slot
|
if latest_account_hash_slot
|
||||||
> latest_trusted_validator_account_hash_slot
|
> latest_known_validator_account_hash_slot
|
||||||
.saturating_sub(self.health_check_slot_distance)
|
.saturating_sub(self.health_check_slot_distance)
|
||||||
{
|
{
|
||||||
RpcHealthStatus::Ok
|
RpcHealthStatus::Ok
|
||||||
} else {
|
} else {
|
||||||
let num_slots = latest_trusted_validator_account_hash_slot
|
let num_slots = latest_known_validator_account_hash_slot
|
||||||
.saturating_sub(latest_account_hash_slot);
|
.saturating_sub(latest_account_hash_slot);
|
||||||
warn!(
|
warn!(
|
||||||
"health check: behind by {} slots: me={}, latest trusted_validator={}",
|
"health check: behind by {} slots: me={}, latest known_validator={}",
|
||||||
num_slots,
|
num_slots,
|
||||||
latest_account_hash_slot,
|
latest_account_hash_slot,
|
||||||
latest_trusted_validator_account_hash_slot
|
latest_known_validator_account_hash_slot
|
||||||
);
|
);
|
||||||
RpcHealthStatus::Behind { num_slots }
|
RpcHealthStatus::Behind { num_slots }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(latest_account_hash_slot, latest_trusted_validator_account_hash_slot) => {
|
(latest_account_hash_slot, latest_known_validator_account_hash_slot) => {
|
||||||
if latest_account_hash_slot.is_none() {
|
if latest_account_hash_slot.is_none() {
|
||||||
warn!("health check: latest_account_hash_slot not available");
|
warn!("health check: latest_account_hash_slot not available");
|
||||||
}
|
}
|
||||||
if latest_trusted_validator_account_hash_slot.is_none() {
|
if latest_known_validator_account_hash_slot.is_none() {
|
||||||
warn!("health check: latest_trusted_validator_account_hash_slot not available");
|
warn!(
|
||||||
|
"health check: latest_known_validator_account_hash_slot not available"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
RpcHealthStatus::Unknown
|
RpcHealthStatus::Unknown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No trusted validator point of reference available, so this validator is healthy
|
// No known validator point of reference available, so this validator is healthy
|
||||||
// because it's running
|
// because it's running
|
||||||
RpcHealthStatus::Ok
|
RpcHealthStatus::Ok
|
||||||
}
|
}
|
||||||
|
@ -295,7 +295,7 @@ impl JsonRpcService {
|
|||||||
genesis_hash: Hash,
|
genesis_hash: Hash,
|
||||||
ledger_path: &Path,
|
ledger_path: &Path,
|
||||||
validator_exit: Arc<RwLock<Exit>>,
|
validator_exit: Arc<RwLock<Exit>>,
|
||||||
trusted_validators: Option<HashSet<Pubkey>>,
|
known_validators: Option<HashSet<Pubkey>>,
|
||||||
override_health_check: Arc<AtomicBool>,
|
override_health_check: Arc<AtomicBool>,
|
||||||
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
|
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
|
||||||
send_transaction_service_config: send_transaction_service::Config,
|
send_transaction_service_config: send_transaction_service::Config,
|
||||||
@ -310,7 +310,7 @@ impl JsonRpcService {
|
|||||||
|
|
||||||
let health = Arc::new(RpcHealth::new(
|
let health = Arc::new(RpcHealth::new(
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
trusted_validators,
|
known_validators,
|
||||||
config.health_check_slot_distance,
|
config.health_check_slot_distance,
|
||||||
override_health_check,
|
override_health_check,
|
||||||
));
|
));
|
||||||
@ -737,7 +737,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_health_check_with_no_trusted_validators() {
|
fn test_health_check_with_no_known_validators() {
|
||||||
let rm = RpcRequestMiddleware::new(
|
let rm = RpcRequestMiddleware::new(
|
||||||
PathBuf::from("/"),
|
PathBuf::from("/"),
|
||||||
None,
|
None,
|
||||||
@ -748,7 +748,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_health_check_with_trusted_validators() {
|
fn test_health_check_with_known_validators() {
|
||||||
let cluster_info = Arc::new(ClusterInfo::new(
|
let cluster_info = Arc::new(ClusterInfo::new(
|
||||||
ContactInfo::default(),
|
ContactInfo::default(),
|
||||||
Arc::new(Keypair::new()),
|
Arc::new(Keypair::new()),
|
||||||
@ -756,7 +756,7 @@ mod tests {
|
|||||||
));
|
));
|
||||||
let health_check_slot_distance = 123;
|
let health_check_slot_distance = 123;
|
||||||
let override_health_check = Arc::new(AtomicBool::new(false));
|
let override_health_check = Arc::new(AtomicBool::new(false));
|
||||||
let trusted_validators = vec![
|
let known_validators = vec![
|
||||||
solana_sdk::pubkey::new_rand(),
|
solana_sdk::pubkey::new_rand(),
|
||||||
solana_sdk::pubkey::new_rand(),
|
solana_sdk::pubkey::new_rand(),
|
||||||
solana_sdk::pubkey::new_rand(),
|
solana_sdk::pubkey::new_rand(),
|
||||||
@ -764,17 +764,17 @@ mod tests {
|
|||||||
|
|
||||||
let health = Arc::new(RpcHealth::new(
|
let health = Arc::new(RpcHealth::new(
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
Some(trusted_validators.clone().into_iter().collect()),
|
Some(known_validators.clone().into_iter().collect()),
|
||||||
health_check_slot_distance,
|
health_check_slot_distance,
|
||||||
override_health_check.clone(),
|
override_health_check.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
let rm = RpcRequestMiddleware::new(PathBuf::from("/"), None, create_bank_forks(), health);
|
let rm = RpcRequestMiddleware::new(PathBuf::from("/"), None, create_bank_forks(), health);
|
||||||
|
|
||||||
// No account hashes for this node or any trusted validators
|
// No account hashes for this node or any known validators
|
||||||
assert_eq!(rm.health_check(), "unknown");
|
assert_eq!(rm.health_check(), "unknown");
|
||||||
|
|
||||||
// No account hashes for any trusted validators
|
// No account hashes for any known validators
|
||||||
cluster_info.push_accounts_hashes(vec![(1000, Hash::default()), (900, Hash::default())]);
|
cluster_info.push_accounts_hashes(vec![(1000, Hash::default()), (900, Hash::default())]);
|
||||||
cluster_info.flush_push_queue();
|
cluster_info.flush_push_queue();
|
||||||
assert_eq!(rm.health_check(), "unknown");
|
assert_eq!(rm.health_check(), "unknown");
|
||||||
@ -784,7 +784,7 @@ mod tests {
|
|||||||
assert_eq!(rm.health_check(), "ok");
|
assert_eq!(rm.health_check(), "ok");
|
||||||
override_health_check.store(false, Ordering::Relaxed);
|
override_health_check.store(false, Ordering::Relaxed);
|
||||||
|
|
||||||
// This node is ahead of the trusted validators
|
// This node is ahead of the known validators
|
||||||
cluster_info
|
cluster_info
|
||||||
.gossip
|
.gossip
|
||||||
.crds
|
.crds
|
||||||
@ -792,7 +792,7 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.insert(
|
.insert(
|
||||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
||||||
trusted_validators[0],
|
known_validators[0],
|
||||||
vec![
|
vec![
|
||||||
(1, Hash::default()),
|
(1, Hash::default()),
|
||||||
(1001, Hash::default()),
|
(1001, Hash::default()),
|
||||||
@ -805,7 +805,7 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(rm.health_check(), "ok");
|
assert_eq!(rm.health_check(), "ok");
|
||||||
|
|
||||||
// Node is slightly behind the trusted validators
|
// Node is slightly behind the known validators
|
||||||
cluster_info
|
cluster_info
|
||||||
.gossip
|
.gossip
|
||||||
.crds
|
.crds
|
||||||
@ -813,7 +813,7 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.insert(
|
.insert(
|
||||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
||||||
trusted_validators[1],
|
known_validators[1],
|
||||||
vec![(1000 + health_check_slot_distance - 1, Hash::default())],
|
vec![(1000 + health_check_slot_distance - 1, Hash::default())],
|
||||||
))),
|
))),
|
||||||
1,
|
1,
|
||||||
@ -822,7 +822,7 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(rm.health_check(), "ok");
|
assert_eq!(rm.health_check(), "ok");
|
||||||
|
|
||||||
// Node is far behind the trusted validators
|
// Node is far behind the known validators
|
||||||
cluster_info
|
cluster_info
|
||||||
.gossip
|
.gossip
|
||||||
.crds
|
.crds
|
||||||
@ -830,7 +830,7 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.insert(
|
.insert(
|
||||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHashes::new(
|
||||||
trusted_validators[2],
|
known_validators[2],
|
||||||
vec![(1000 + health_check_slot_distance, Hash::default())],
|
vec![(1000 + health_check_slot_distance, Hash::default())],
|
||||||
))),
|
))),
|
||||||
1,
|
1,
|
||||||
|
@ -195,9 +195,9 @@ fn verify_reachable_ports(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_trusted_validator(id: &Pubkey, trusted_validators: &Option<HashSet<Pubkey>>) -> bool {
|
fn is_known_validator(id: &Pubkey, known_validators: &Option<HashSet<Pubkey>>) -> bool {
|
||||||
if let Some(trusted_validators) = trusted_validators {
|
if let Some(known_validators) = known_validators {
|
||||||
trusted_validators.contains(id)
|
known_validators.contains(id)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
@ -286,7 +286,7 @@ fn get_rpc_peers(
|
|||||||
let rpc_peers_blacklisted = rpc_peers_total - rpc_peers.len();
|
let rpc_peers_blacklisted = rpc_peers_total - rpc_peers.len();
|
||||||
let rpc_peers_trusted = rpc_peers
|
let rpc_peers_trusted = rpc_peers
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|rpc_peer| is_trusted_validator(&rpc_peer.id, &validator_config.trusted_validators))
|
.filter(|rpc_peer| is_known_validator(&rpc_peer.id, &validator_config.known_validators))
|
||||||
.count();
|
.count();
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
@ -568,9 +568,9 @@ mod without_incremental_snapshots {
|
|||||||
&& download_progress.percentage_done <= 2_f32
|
&& download_progress.percentage_done <= 2_f32
|
||||||
&& download_progress.estimated_remaining_time > 60_f32
|
&& download_progress.estimated_remaining_time > 60_f32
|
||||||
&& download_abort_count < maximum_snapshot_download_abort {
|
&& download_abort_count < maximum_snapshot_download_abort {
|
||||||
if let Some(ref trusted_validators) = validator_config.trusted_validators {
|
if let Some(ref known_validators) = validator_config.known_validators {
|
||||||
if trusted_validators.contains(&rpc_contact_info.id)
|
if known_validators.contains(&rpc_contact_info.id)
|
||||||
&& trusted_validators.len() == 1
|
&& known_validators.len() == 1
|
||||||
&& bootstrap_config.no_untrusted_rpc {
|
&& bootstrap_config.no_untrusted_rpc {
|
||||||
warn!("The snapshot download is too slow, throughput: {} < min speed {} bytes/sec, but will NOT abort \
|
warn!("The snapshot download is too slow, throughput: {} < min speed {} bytes/sec, but will NOT abort \
|
||||||
and try a different node as it is the only known validator and the --only-known-rpc flag \
|
and try a different node as it is the only known validator and the --only-known-rpc flag \
|
||||||
@ -632,8 +632,8 @@ mod without_incremental_snapshots {
|
|||||||
}
|
}
|
||||||
warn!("{}", result.unwrap_err());
|
warn!("{}", result.unwrap_err());
|
||||||
|
|
||||||
if let Some(ref trusted_validators) = validator_config.trusted_validators {
|
if let Some(ref known_validators) = validator_config.known_validators {
|
||||||
if trusted_validators.contains(&rpc_contact_info.id) {
|
if known_validators.contains(&rpc_contact_info.id) {
|
||||||
continue; // Never blacklist a trusted node
|
continue; // Never blacklist a trusted node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -685,13 +685,13 @@ mod without_incremental_snapshots {
|
|||||||
rpc_peers
|
rpc_peers
|
||||||
} else {
|
} else {
|
||||||
let trusted_snapshot_hashes =
|
let trusted_snapshot_hashes =
|
||||||
get_trusted_snapshot_hashes(cluster_info, &validator_config.trusted_validators);
|
get_trusted_snapshot_hashes(cluster_info, &validator_config.known_validators);
|
||||||
|
|
||||||
let mut eligible_rpc_peers = vec![];
|
let mut eligible_rpc_peers = vec![];
|
||||||
|
|
||||||
for rpc_peer in rpc_peers.iter() {
|
for rpc_peer in rpc_peers.iter() {
|
||||||
if bootstrap_config.no_untrusted_rpc
|
if bootstrap_config.no_untrusted_rpc
|
||||||
&& !is_trusted_validator(&rpc_peer.id, &validator_config.trusted_validators)
|
&& !is_known_validator(&rpc_peer.id, &validator_config.known_validators)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -772,12 +772,12 @@ mod without_incremental_snapshots {
|
|||||||
|
|
||||||
fn get_trusted_snapshot_hashes(
|
fn get_trusted_snapshot_hashes(
|
||||||
cluster_info: &ClusterInfo,
|
cluster_info: &ClusterInfo,
|
||||||
trusted_validators: &Option<HashSet<Pubkey>>,
|
known_validators: &Option<HashSet<Pubkey>>,
|
||||||
) -> Option<HashSet<(Slot, Hash)>> {
|
) -> Option<HashSet<(Slot, Hash)>> {
|
||||||
if let Some(trusted_validators) = trusted_validators {
|
if let Some(known_validators) = known_validators {
|
||||||
let mut trusted_snapshot_hashes = HashSet::new();
|
let mut trusted_snapshot_hashes = HashSet::new();
|
||||||
for trusted_validator in trusted_validators {
|
for known_validator in known_validators {
|
||||||
cluster_info.get_snapshot_hash_for_node(trusted_validator, |snapshot_hashes| {
|
cluster_info.get_snapshot_hash_for_node(known_validator, |snapshot_hashes| {
|
||||||
for snapshot_hash in snapshot_hashes {
|
for snapshot_hash in snapshot_hashes {
|
||||||
trusted_snapshot_hashes.insert(*snapshot_hash);
|
trusted_snapshot_hashes.insert(*snapshot_hash);
|
||||||
}
|
}
|
||||||
@ -972,8 +972,8 @@ mod with_incremental_snapshots {
|
|||||||
}
|
}
|
||||||
warn!("{}", result.unwrap_err());
|
warn!("{}", result.unwrap_err());
|
||||||
|
|
||||||
if let Some(ref trusted_validators) = validator_config.trusted_validators {
|
if let Some(ref known_validators) = validator_config.known_validators {
|
||||||
if trusted_validators.contains(&rpc_contact_info.id) {
|
if known_validators.contains(&rpc_contact_info.id) {
|
||||||
continue; // Never blacklist a trusted node
|
continue; // Never blacklist a trusted node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1191,50 +1191,50 @@ mod with_incremental_snapshots {
|
|||||||
cluster_info: &ClusterInfo,
|
cluster_info: &ClusterInfo,
|
||||||
validator_config: &ValidatorConfig,
|
validator_config: &ValidatorConfig,
|
||||||
) -> HashMap<(Slot, Hash), HashSet<(Slot, Hash)>> {
|
) -> HashMap<(Slot, Hash), HashSet<(Slot, Hash)>> {
|
||||||
if validator_config.trusted_validators.is_none() {
|
if validator_config.known_validators.is_none() {
|
||||||
trace!("no trusted validators, so no trusted snapshot hashes");
|
trace!("no known validators, so no trusted snapshot hashes");
|
||||||
return HashMap::new();
|
return HashMap::new();
|
||||||
}
|
}
|
||||||
let trusted_validators = validator_config.trusted_validators.as_ref().unwrap();
|
let known_validators = validator_config.known_validators.as_ref().unwrap();
|
||||||
|
|
||||||
let mut trusted_snapshot_hashes: HashMap<(Slot, Hash), HashSet<(Slot, Hash)>> =
|
let mut trusted_snapshot_hashes: HashMap<(Slot, Hash), HashSet<(Slot, Hash)>> =
|
||||||
HashMap::new();
|
HashMap::new();
|
||||||
trusted_validators
|
known_validators
|
||||||
.iter()
|
.iter()
|
||||||
.for_each(|trusted_validator| {
|
.for_each(|known_validator| {
|
||||||
// First get the Crds::SnapshotHashes for each trusted validator and add them as
|
// First get the Crds::SnapshotHashes for each known validator and add them as
|
||||||
// the keys in the trusted snapshot hashes HashMap.
|
// the keys in the trusted snapshot hashes HashMap.
|
||||||
let mut full_snapshot_hashes = Vec::new();
|
let mut full_snapshot_hashes = Vec::new();
|
||||||
cluster_info.get_snapshot_hash_for_node(trusted_validator, |snapshot_hashes| {
|
cluster_info.get_snapshot_hash_for_node(known_validator, |snapshot_hashes| {
|
||||||
full_snapshot_hashes = snapshot_hashes.clone();
|
full_snapshot_hashes = snapshot_hashes.clone();
|
||||||
});
|
});
|
||||||
full_snapshot_hashes.into_iter().for_each(|full_snapshot_hash| {
|
full_snapshot_hashes.into_iter().for_each(|full_snapshot_hash| {
|
||||||
// Do not add this hash if there's already a full snapshot hash with the same
|
// Do not add this hash if there's already a full snapshot hash with the same
|
||||||
// slot but with a _different_ hash.
|
// slot but with a _different_ hash.
|
||||||
// NOTE: There's no good reason for trusted validators to produce snapshots at
|
// NOTE: There's no good reason for known validators to produce snapshots at
|
||||||
// the same slot with different hashes, so this should not happen.
|
// the same slot with different hashes, so this should not happen.
|
||||||
if !trusted_snapshot_hashes.keys().any(|trusted_snapshot_hash| {
|
if !trusted_snapshot_hashes.keys().any(|trusted_snapshot_hash| {
|
||||||
trusted_snapshot_hash.0 == full_snapshot_hash.0 && trusted_snapshot_hash.1 != full_snapshot_hash.1
|
trusted_snapshot_hash.0 == full_snapshot_hash.0 && trusted_snapshot_hash.1 != full_snapshot_hash.1
|
||||||
}) {
|
}) {
|
||||||
trusted_snapshot_hashes.insert(full_snapshot_hash, HashSet::new());
|
trusted_snapshot_hashes.insert(full_snapshot_hash, HashSet::new());
|
||||||
} else {
|
} else {
|
||||||
info!("Ignoring full snapshot hash from trusted validator {} with a slot we've already seen (slot: {}), but a different hash.", trusted_validator, full_snapshot_hash.0);
|
info!("Ignoring full snapshot hash from known validator {} with a slot we've already seen (slot: {}), but a different hash.", known_validator, full_snapshot_hash.0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Then get the Crds::IncrementalSnapshotHashes for each trusted validator and add
|
// Then get the Crds::IncrementalSnapshotHashes for each known validator and add
|
||||||
// them as the values in the trusted snapshot hashes HashMap.
|
// them as the values in the trusted snapshot hashes HashMap.
|
||||||
if let Some(crds_value::IncrementalSnapshotHashes {base: full_snapshot_hash, hashes: incremental_snapshot_hashes, ..}) = cluster_info.get_incremental_snapshot_hashes_for_node(trusted_validator) {
|
if let Some(crds_value::IncrementalSnapshotHashes {base: full_snapshot_hash, hashes: incremental_snapshot_hashes, ..}) = cluster_info.get_incremental_snapshot_hashes_for_node(known_validator) {
|
||||||
if let Some(hashes) = trusted_snapshot_hashes.get_mut(&full_snapshot_hash) {
|
if let Some(hashes) = trusted_snapshot_hashes.get_mut(&full_snapshot_hash) {
|
||||||
// Do not add this hash if there's already an incremental snapshot hash
|
// Do not add this hash if there's already an incremental snapshot hash
|
||||||
// with the same slot, but with a _different_ hash.
|
// with the same slot, but with a _different_ hash.
|
||||||
// NOTE: There's no good reason for trusted validators to produce snapshots
|
// NOTE: There's no good reason for known validators to produce snapshots
|
||||||
// at the same slot with different hashes, so this should not happen.
|
// at the same slot with different hashes, so this should not happen.
|
||||||
for incremental_snapshot_hash in incremental_snapshot_hashes {
|
for incremental_snapshot_hash in incremental_snapshot_hashes {
|
||||||
if !hashes.iter().any(|(slot, hash)| slot == &incremental_snapshot_hash.0 && hash != &incremental_snapshot_hash.1) {
|
if !hashes.iter().any(|(slot, hash)| slot == &incremental_snapshot_hash.0 && hash != &incremental_snapshot_hash.1) {
|
||||||
hashes.insert(incremental_snapshot_hash);
|
hashes.insert(incremental_snapshot_hash);
|
||||||
} else {
|
} else {
|
||||||
info!("Ignoring incremental snapshot hash from trusted validator {} with a slot we've already seen (slot: {}), but a different hash.", trusted_validator, incremental_snapshot_hash.0);
|
info!("Ignoring incremental snapshot hash from known validator {} with a slot we've already seen (slot: {}), but a different hash.", known_validator, incremental_snapshot_hash.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1245,7 +1245,7 @@ mod with_incremental_snapshots {
|
|||||||
// ever fails, there is a programmer bug.
|
// ever fails, there is a programmer bug.
|
||||||
assert!(trusted_snapshot_hashes.keys().any(|(slot, hash)| slot == &full_snapshot_hash.0 && hash != &full_snapshot_hash.1),
|
assert!(trusted_snapshot_hashes.keys().any(|(slot, hash)| slot == &full_snapshot_hash.0 && hash != &full_snapshot_hash.1),
|
||||||
"There must exist a full snapshot hash already in trusted snapshot hashes with the same slot but a different hash");
|
"There must exist a full snapshot hash already in trusted snapshot hashes with the same slot but a different hash");
|
||||||
info!("Ignoring incremental snapshot hashes from trusted validator {} with a base slot we've already seen (base slot: {}), but a different base hash.", trusted_validator, full_snapshot_hash.0);
|
info!("Ignoring incremental snapshot hashes from known validator {} with a base slot we've already seen (base slot: {}), but a different base hash.", known_validator, full_snapshot_hash.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1266,7 +1266,7 @@ mod with_incremental_snapshots {
|
|||||||
let mut peer_snapshot_hashes = Vec::new();
|
let mut peer_snapshot_hashes = Vec::new();
|
||||||
for rpc_peer in rpc_peers {
|
for rpc_peer in rpc_peers {
|
||||||
if bootstrap_config.no_untrusted_rpc
|
if bootstrap_config.no_untrusted_rpc
|
||||||
&& !is_trusted_validator(&rpc_peer.id, &validator_config.trusted_validators)
|
&& !is_known_validator(&rpc_peer.id, &validator_config.known_validators)
|
||||||
{
|
{
|
||||||
// We were told to ignore untrusted peers
|
// We were told to ignore untrusted peers
|
||||||
continue;
|
continue;
|
||||||
@ -1557,9 +1557,9 @@ mod with_incremental_snapshots {
|
|||||||
&& download_progress.estimated_remaining_time > 60_f32
|
&& download_progress.estimated_remaining_time > 60_f32
|
||||||
&& *download_abort_count < maximum_snapshot_download_abort
|
&& *download_abort_count < maximum_snapshot_download_abort
|
||||||
{
|
{
|
||||||
if let Some(ref trusted_validators) = validator_config.trusted_validators {
|
if let Some(ref known_validators) = validator_config.known_validators {
|
||||||
if trusted_validators.contains(&rpc_contact_info.id)
|
if known_validators.contains(&rpc_contact_info.id)
|
||||||
&& trusted_validators.len() == 1
|
&& known_validators.len() == 1
|
||||||
&& bootstrap_config.no_untrusted_rpc
|
&& bootstrap_config.no_untrusted_rpc
|
||||||
{
|
{
|
||||||
warn!("The snapshot download is too slow, throughput: {} < min speed {} bytes/sec, but will NOT abort \
|
warn!("The snapshot download is too slow, throughput: {} < min speed {} bytes/sec, but will NOT abort \
|
||||||
|
@ -1072,7 +1072,7 @@ pub fn main() {
|
|||||||
.help("Add a hard fork at this slot"),
|
.help("Add a hard fork at this slot"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("trusted_validators")
|
Arg::with_name("known_validators")
|
||||||
.alias("trusted-validator")
|
.alias("trusted-validator")
|
||||||
.long("known-validator")
|
.long("known-validator")
|
||||||
.validator(is_pubkey)
|
.validator(is_pubkey)
|
||||||
@ -1374,10 +1374,10 @@ pub fn main() {
|
|||||||
.help("Specify the configuration file for the AccountsDb plugin."),
|
.help("Specify the configuration file for the AccountsDb plugin."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("halt_on_trusted_validators_accounts_hash_mismatch")
|
Arg::with_name("halt_on_known_validators_accounts_hash_mismatch")
|
||||||
.alias("halt-on-trusted-validators-accounts-hash-mismatch")
|
.alias("halt-on-trusted-validators-accounts-hash-mismatch")
|
||||||
.long("halt-on-known-validators-accounts-hash-mismatch")
|
.long("halt-on-known-validators-accounts-hash-mismatch")
|
||||||
.requires("trusted_validators")
|
.requires("known_validators")
|
||||||
.takes_value(false)
|
.takes_value(false)
|
||||||
.help("Abort the validator if a bank hash mismatch is detected within known validator set"),
|
.help("Abort the validator if a bank hash mismatch is detected within known validator set"),
|
||||||
)
|
)
|
||||||
@ -1976,10 +1976,10 @@ pub fn main() {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let trusted_validators = validators_set(
|
let known_validators = validators_set(
|
||||||
&identity_keypair.pubkey(),
|
&identity_keypair.pubkey(),
|
||||||
&matches,
|
&matches,
|
||||||
"trusted_validators",
|
"known_validators",
|
||||||
"--known-validator",
|
"--known-validator",
|
||||||
);
|
);
|
||||||
let repair_validators = validators_set(
|
let repair_validators = validators_set(
|
||||||
@ -2230,7 +2230,7 @@ pub fn main() {
|
|||||||
},
|
},
|
||||||
voting_disabled: matches.is_present("no_voting") || restricted_repair_only_mode,
|
voting_disabled: matches.is_present("no_voting") || restricted_repair_only_mode,
|
||||||
wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(),
|
wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(),
|
||||||
trusted_validators,
|
known_validators,
|
||||||
repair_validators,
|
repair_validators,
|
||||||
gossip_validators,
|
gossip_validators,
|
||||||
frozen_accounts: values_t!(matches, "frozen_accounts", Pubkey).unwrap_or_default(),
|
frozen_accounts: values_t!(matches, "frozen_accounts", Pubkey).unwrap_or_default(),
|
||||||
@ -2458,8 +2458,8 @@ pub fn main() {
|
|||||||
validator_config.max_ledger_shreds = Some(limit_ledger_size);
|
validator_config.max_ledger_shreds = Some(limit_ledger_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches.is_present("halt_on_trusted_validators_accounts_hash_mismatch") {
|
if matches.is_present("halt_on_known_validators_accounts_hash_mismatch") {
|
||||||
validator_config.halt_on_trusted_validators_accounts_hash_mismatch = true;
|
validator_config.halt_on_known_validators_accounts_hash_mismatch = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
let public_rpc_addr = matches.value_of("public_rpc_addr").map(|addr| {
|
let public_rpc_addr = matches.value_of("public_rpc_addr").map(|addr| {
|
||||||
|
Reference in New Issue
Block a user