diff --git a/accounts-cluster-bench/src/main.rs b/accounts-cluster-bench/src/main.rs index 72d184bf9..7506ed5a2 100644 --- a/accounts-cluster-bench/src/main.rs +++ b/accounts-cluster-bench/src/main.rs @@ -561,7 +561,10 @@ fn main() { pub mod test { use super::*; use solana_core::validator::ValidatorConfig; - use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster}; + use solana_local_cluster::{ + local_cluster::{ClusterConfig, LocalCluster}, + validator_configs::make_identical_validator_configs, + }; use solana_sdk::poh_config::PohConfig; #[test] @@ -573,7 +576,7 @@ pub mod test { cluster_lamports: 10_000_000, poh_config: PohConfig::new_sleep(Duration::from_millis(50)), node_stakes: vec![100; num_nodes], - validator_configs: vec![validator_config; num_nodes], + validator_configs: make_identical_validator_configs(&validator_config, num_nodes), ..ClusterConfig::default() }; diff --git a/bench-exchange/tests/bench_exchange.rs b/bench-exchange/tests/bench_exchange.rs index bb032c2bd..a41b64450 100644 --- a/bench-exchange/tests/bench_exchange.rs +++ b/bench-exchange/tests/bench_exchange.rs @@ -1,19 +1,23 @@ use log::*; use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config}; -use solana_core::gossip_service::{discover_cluster, get_multi_client}; -use solana_core::validator::ValidatorConfig; -use solana_exchange_program::exchange_processor::process_instruction; -use solana_exchange_program::id; -use solana_exchange_program::solana_exchange_program; +use solana_core::{ + gossip_service::{discover_cluster, get_multi_client}, + validator::ValidatorConfig, +}; +use solana_exchange_program::{ + exchange_processor::process_instruction, id, solana_exchange_program, +}; use solana_faucet::faucet::run_local_faucet_with_port; -use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster}; -use solana_runtime::bank::Bank; -use solana_runtime::bank_client::BankClient; -use solana_sdk::genesis_config::create_genesis_config; -use solana_sdk::signature::{Keypair, Signer}; -use std::process::exit; -use std::sync::mpsc::channel; -use std::time::Duration; +use solana_local_cluster::{ + local_cluster::{ClusterConfig, LocalCluster}, + validator_configs::make_identical_validator_configs, +}; +use solana_runtime::{bank::Bank, bank_client::BankClient}; +use solana_sdk::{ + genesis_config::create_genesis_config, + signature::{Keypair, Signer}, +}; +use std::{process::exit, sync::mpsc::channel, time::Duration}; #[test] #[ignore] @@ -44,7 +48,7 @@ fn test_exchange_local_cluster() { let cluster = LocalCluster::new(&mut ClusterConfig { node_stakes: vec![100_000; NUM_NODES], cluster_lamports: 100_000_000_000_000, - validator_configs: vec![ValidatorConfig::default(); NUM_NODES], + validator_configs: make_identical_validator_configs(&ValidatorConfig::default(), NUM_NODES), native_instruction_processors: [solana_exchange_program!()].to_vec(), ..ClusterConfig::default() }); diff --git a/bench-tps/tests/bench_tps.rs b/bench-tps/tests/bench_tps.rs index e25ba26e0..a49c68a7b 100644 --- a/bench-tps/tests/bench_tps.rs +++ b/bench-tps/tests/bench_tps.rs @@ -1,15 +1,21 @@ #![allow(clippy::integer_arithmetic)] use serial_test::serial; -use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs}; -use solana_bench_tps::cli::Config; +use solana_bench_tps::{ + bench::{do_bench_tps, generate_and_fund_keypairs}, + cli::Config, +}; use solana_client::thin_client::create_client; -use solana_core::cluster_info::VALIDATOR_PORT_RANGE; -use solana_core::validator::ValidatorConfig; +use solana_core::{cluster_info::VALIDATOR_PORT_RANGE, validator::ValidatorConfig}; use solana_faucet::faucet::run_local_faucet_with_port; -use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster}; +use solana_local_cluster::{ + local_cluster::{ClusterConfig, LocalCluster}, + validator_configs::make_identical_validator_configs, +}; use solana_sdk::signature::{Keypair, Signer}; -use std::sync::{mpsc::channel, Arc}; -use std::time::Duration; +use std::{ + sync::{mpsc::channel, Arc}, + time::Duration, +}; fn test_bench_tps_local_cluster(config: Config) { let native_instruction_processors = vec![]; @@ -19,7 +25,7 @@ fn test_bench_tps_local_cluster(config: Config) { let cluster = LocalCluster::new(&mut ClusterConfig { node_stakes: vec![999_990; NUM_NODES], cluster_lamports: 200_000_000, - validator_configs: vec![ValidatorConfig::default(); NUM_NODES], + validator_configs: make_identical_validator_configs(&ValidatorConfig::default(), NUM_NODES), native_instruction_processors, ..ClusterConfig::default() }); diff --git a/core/src/validator.rs b/core/src/validator.rs index d02dca658..06d23c1d8 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -79,7 +79,7 @@ use std::{ const MAX_COMPLETED_DATA_SETS_IN_CHANNEL: usize = 100_000; -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct ValidatorConfig { pub dev_halt_at_slot: Option, pub expected_genesis_hash: Option, diff --git a/local-cluster/src/lib.rs b/local-cluster/src/lib.rs index 133b4fc16..92cf3f72d 100644 --- a/local-cluster/src/lib.rs +++ b/local-cluster/src/lib.rs @@ -2,3 +2,4 @@ pub mod cluster; pub mod cluster_tests; pub mod local_cluster; +pub mod validator_configs; diff --git a/local-cluster/src/local_cluster.rs b/local-cluster/src/local_cluster.rs index 4716116ca..93c078b0a 100644 --- a/local-cluster/src/local_cluster.rs +++ b/local-cluster/src/local_cluster.rs @@ -1,6 +1,7 @@ use crate::{ cluster::{Cluster, ClusterValidatorInfo, ValidatorInfo}, cluster_tests, + validator_configs::*, }; use itertools::izip; use log::*; @@ -45,7 +46,7 @@ use std::{ sync::Arc, }; -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct ClusterConfig { /// The validator config that should be applied to every node in the cluster pub validator_configs: Vec, @@ -110,7 +111,10 @@ impl LocalCluster { let mut config = ClusterConfig { node_stakes: stakes, cluster_lamports, - validator_configs: vec![ValidatorConfig::default(); num_nodes], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + num_nodes, + ), ..ClusterConfig::default() }; Self::new(&mut config) @@ -193,7 +197,7 @@ impl LocalCluster { let (leader_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_config); let leader_contact_info = leader_node.info.clone(); - let mut leader_config = config.validator_configs[0].clone(); + let mut leader_config = safe_clone_config(&config.validator_configs[0]); leader_config.rpc_addrs = Some((leader_node.info.rpc, leader_node.info.rpc_pubsub)); leader_config.account_paths = vec![leader_ledger_path.join("accounts")]; let leader_keypair = Arc::new(Keypair::from_bytes(&leader_keypair.to_bytes()).unwrap()); @@ -217,10 +221,9 @@ impl LocalCluster { ledger_path: leader_ledger_path, contact_info: leader_contact_info.clone(), }; - let cluster_leader = ClusterValidatorInfo::new( leader_info, - config.validator_configs[0].clone(), + safe_clone_config(&config.validator_configs[0]), leader_server, ); @@ -255,10 +258,8 @@ impl LocalCluster { ); } - let listener_config = ValidatorConfig { - voting_disabled: true, - ..config.validator_configs[0].clone() - }; + let mut listener_config = safe_clone_config(&config.validator_configs[0]); + listener_config.voting_disabled = true; (0..config.num_listeners).for_each(|_| { cluster.add_validator(&listener_config, 0, Arc::new(Keypair::new()), None); }); @@ -339,7 +340,7 @@ impl LocalCluster { } } - let mut config = validator_config.clone(); + let mut config = safe_clone_config(validator_config); config.rpc_addrs = Some((validator_node.info.rpc, validator_node.info.rpc_pubsub)); config.account_paths = vec![ledger_path.join("accounts")]; let voting_keypair = voting_keypair.unwrap(); @@ -362,7 +363,7 @@ impl LocalCluster { ledger_path, contact_info, }, - validator_config.clone(), + safe_clone_config(validator_config), validator_server, ); @@ -710,7 +711,10 @@ mod test { validator_config.rpc_config.enable_validator_exit = true; const NUM_NODES: usize = 1; let mut config = ClusterConfig { - validator_configs: vec![ValidatorConfig::default(); NUM_NODES], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + NUM_NODES, + ), node_stakes: vec![3; NUM_NODES], cluster_lamports: 100, ticks_per_slot: 8, diff --git a/local-cluster/src/validator_configs.rs b/local-cluster/src/validator_configs.rs new file mode 100644 index 000000000..71c472d70 --- /dev/null +++ b/local-cluster/src/validator_configs.rs @@ -0,0 +1,67 @@ +use solana_core::validator::{ValidatorConfig, ValidatorExit}; +use std::sync::{Arc, RwLock}; + +pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig { + ValidatorConfig { + dev_halt_at_slot: config.dev_halt_at_slot, + expected_genesis_hash: config.expected_genesis_hash, + expected_bank_hash: config.expected_bank_hash, + expected_shred_version: config.expected_shred_version, + voting_disabled: config.voting_disabled, + account_paths: config.account_paths.clone(), + account_shrink_paths: config.account_shrink_paths.clone(), + rpc_config: config.rpc_config.clone(), + rpc_addrs: config.rpc_addrs, + pubsub_config: config.pubsub_config.clone(), + snapshot_config: config.snapshot_config.clone(), + max_ledger_shreds: config.max_ledger_shreds, + broadcast_stage_type: config.broadcast_stage_type.clone(), + enable_partition: config.enable_partition.clone(), + enforce_ulimit_nofile: config.enforce_ulimit_nofile, + fixed_leader_schedule: config.fixed_leader_schedule.clone(), + wait_for_supermajority: config.wait_for_supermajority, + new_hard_forks: config.new_hard_forks.clone(), + trusted_validators: config.trusted_validators.clone(), + repair_validators: config.repair_validators.clone(), + gossip_validators: config.gossip_validators.clone(), + halt_on_trusted_validators_accounts_hash_mismatch: config + .halt_on_trusted_validators_accounts_hash_mismatch, + accounts_hash_fault_injection_slots: config.accounts_hash_fault_injection_slots, + frozen_accounts: config.frozen_accounts.clone(), + no_rocksdb_compaction: config.no_rocksdb_compaction, + rocksdb_compaction_interval: config.rocksdb_compaction_interval, + rocksdb_max_compaction_jitter: config.rocksdb_max_compaction_jitter, + accounts_hash_interval_slots: config.accounts_hash_interval_slots, + max_genesis_archive_unpacked_size: config.max_genesis_archive_unpacked_size, + wal_recovery_mode: config.wal_recovery_mode.clone(), + poh_verify: config.poh_verify, + cuda: config.cuda, + require_tower: config.require_tower, + debug_keys: config.debug_keys.clone(), + contact_debug_interval: config.contact_debug_interval, + contact_save_interval: config.contact_save_interval, + bpf_jit: config.bpf_jit, + send_transaction_retry_ms: config.send_transaction_retry_ms, + send_transaction_leader_forward_count: config.send_transaction_leader_forward_count, + no_poh_speed_test: config.no_poh_speed_test, + poh_pinned_cpu_core: config.poh_pinned_cpu_core, + account_indexes: config.account_indexes.clone(), + accounts_db_caching_enabled: config.accounts_db_caching_enabled, + warp_slot: config.warp_slot, + accounts_db_test_hash_calculation: config.accounts_db_test_hash_calculation, + accounts_db_use_index_hash_calculation: config.accounts_db_use_index_hash_calculation, + tpu_coalesce_ms: config.tpu_coalesce_ms, + validator_exit: Arc::new(RwLock::new(ValidatorExit::default())), + } +} + +pub fn make_identical_validator_configs( + config: &ValidatorConfig, + num: usize, +) -> Vec { + let mut configs = vec![]; + for _ in 0..num { + configs.push(safe_clone_config(config)); + } + configs +} diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index f92d6a38a..ef9e13c30 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -31,6 +31,7 @@ use solana_local_cluster::{ cluster::Cluster, cluster_tests, local_cluster::{ClusterConfig, LocalCluster}, + validator_configs::*, }; use solana_runtime::{ bank_forks::{ArchiveFormat, SnapshotConfig}, @@ -77,7 +78,7 @@ fn test_ledger_cleanup_service() { cluster_lamports: 10_000, poh_config: PohConfig::new_sleep(Duration::from_millis(50)), node_stakes: vec![100; num_nodes], - validator_configs: vec![validator_config; num_nodes], + validator_configs: make_identical_validator_configs(&validator_config, num_nodes), ..ClusterConfig::default() }; let mut cluster = LocalCluster::new(&mut config); @@ -264,7 +265,7 @@ fn test_validator_exit_2() { let mut config = ClusterConfig { cluster_lamports: 10_000, node_stakes: vec![100; num_nodes], - validator_configs: vec![validator_config; num_nodes], + validator_configs: make_identical_validator_configs(&validator_config, num_nodes), ..ClusterConfig::default() }; let local = LocalCluster::new(&mut config); @@ -283,7 +284,7 @@ fn test_leader_failure_4() { let mut config = ClusterConfig { cluster_lamports: 10_000, node_stakes: vec![100; 4], - validator_configs: vec![validator_config; num_nodes], + validator_configs: make_identical_validator_configs(&validator_config, num_nodes), ..ClusterConfig::default() }; let local = LocalCluster::new(&mut config); @@ -361,7 +362,7 @@ fn run_cluster_partition( let mut config = ClusterConfig { cluster_lamports, node_stakes, - validator_configs: vec![validator_config; num_nodes], + validator_configs: make_identical_validator_configs(&validator_config, num_nodes), validator_keys: Some( validator_keys .into_iter() @@ -655,7 +656,7 @@ fn test_two_unbalanced_stakes() { let mut cluster = LocalCluster::new(&mut ClusterConfig { node_stakes: vec![999_990, 3], cluster_lamports: 1_000_000, - validator_configs: vec![validator_config; 2], + validator_configs: make_identical_validator_configs(&validator_config, 2), ticks_per_slot: num_ticks_per_slot, slots_per_epoch: num_slots_per_epoch, stakers_slot_offset: num_slots_per_epoch, @@ -683,7 +684,7 @@ fn test_forwarding() { let mut config = ClusterConfig { node_stakes: vec![999_990, 3], cluster_lamports: 2_000_000, - validator_configs: vec![ValidatorConfig::default(); 2], + validator_configs: make_identical_validator_configs(&ValidatorConfig::default(), 2), ..ClusterConfig::default() }; let cluster = LocalCluster::new(&mut config); @@ -713,7 +714,7 @@ fn test_restart_node() { let mut cluster = LocalCluster::new(&mut ClusterConfig { node_stakes: vec![100; 1], cluster_lamports: 100, - validator_configs: vec![validator_config.clone()], + validator_configs: vec![safe_clone_config(&validator_config)], ticks_per_slot, slots_per_epoch, stakers_slot_offset: slots_per_epoch, @@ -748,7 +749,7 @@ fn test_listener_startup() { node_stakes: vec![100; 1], cluster_lamports: 1_000, num_listeners: 3, - validator_configs: vec![ValidatorConfig::default(); 1], + validator_configs: make_identical_validator_configs(&ValidatorConfig::default(), 1), ..ClusterConfig::default() }; let cluster = LocalCluster::new(&mut config); @@ -765,7 +766,7 @@ fn test_mainnet_beta_cluster_type() { cluster_type: ClusterType::MainnetBeta, node_stakes: vec![100; 1], cluster_lamports: 1_000, - validator_configs: vec![ValidatorConfig::default(); 1], + validator_configs: make_identical_validator_configs(&ValidatorConfig::default(), 1), ..ClusterConfig::default() }; let cluster = LocalCluster::new(&mut config); @@ -874,14 +875,11 @@ fn test_frozen_account_from_genesis() { validator_keys: Some(vec![(validator_identity.clone(), true)]), node_stakes: vec![100; 1], cluster_lamports: 1_000, - validator_configs: vec![ - ValidatorConfig { - // Freeze the validator identity account - frozen_accounts: vec![validator_identity.pubkey()], - ..ValidatorConfig::default() - }; - 1 - ], + validator_configs: vec![ValidatorConfig { + // Freeze the validator identity account + frozen_accounts: vec![validator_identity.pubkey()], + ..ValidatorConfig::default() + }], ..ClusterConfig::default() }; generate_frozen_account_panic(LocalCluster::new(&mut config), validator_identity); @@ -902,7 +900,10 @@ fn test_frozen_account_from_snapshot() { validator_keys: Some(vec![(validator_identity.clone(), true)]), node_stakes: vec![100; 1], cluster_lamports: 1_000, - validator_configs: vec![snapshot_test_config.validator_config.clone()], + validator_configs: make_identical_validator_configs( + &snapshot_test_config.validator_config, + 1, + ), ..ClusterConfig::default() }; let mut cluster = LocalCluster::new(&mut config); @@ -1033,7 +1034,10 @@ fn test_snapshot_download() { let mut config = ClusterConfig { node_stakes: vec![stake], cluster_lamports: 1_000_000, - validator_configs: vec![leader_snapshot_test_config.validator_config.clone()], + validator_configs: make_identical_validator_configs( + &leader_snapshot_test_config.validator_config, + 1, + ), ..ClusterConfig::default() }; @@ -1096,8 +1100,8 @@ fn test_snapshot_restart_tower() { node_stakes: vec![10000, 10], cluster_lamports: 100_000, validator_configs: vec![ - leader_snapshot_test_config.validator_config.clone(), - validator_snapshot_test_config.validator_config.clone(), + safe_clone_config(&leader_snapshot_test_config.validator_config), + safe_clone_config(&validator_snapshot_test_config.validator_config), ], ..ClusterConfig::default() }; @@ -1174,7 +1178,10 @@ fn test_snapshots_blockstore_floor() { let mut config = ClusterConfig { node_stakes: vec![10000], cluster_lamports: 100_000, - validator_configs: vec![leader_snapshot_test_config.validator_config.clone()], + validator_configs: make_identical_validator_configs( + &leader_snapshot_test_config.validator_config, + 1, + ), ..ClusterConfig::default() }; @@ -1277,7 +1284,10 @@ fn test_snapshots_restart_validity() { let mut config = ClusterConfig { node_stakes: vec![10000], cluster_lamports: 100_000, - validator_configs: vec![snapshot_test_config.validator_config.clone()], + validator_configs: make_identical_validator_configs( + &snapshot_test_config.validator_config, + 1, + ), ..ClusterConfig::default() }; @@ -1311,7 +1321,10 @@ fn test_snapshots_restart_validity() { // Restart node trace!("Restarting cluster from snapshot"); let nodes = cluster.get_node_pubkeys(); - cluster.exit_restart_node(&nodes[0], snapshot_test_config.validator_config.clone()); + cluster.exit_restart_node( + &nodes[0], + safe_clone_config(&snapshot_test_config.validator_config), + ); // Verify account balances on validator trace!("Verifying balances"); @@ -1380,7 +1393,7 @@ fn test_wait_for_max_stake() { let mut config = ClusterConfig { cluster_lamports: 10_000, node_stakes: vec![100; 4], - validator_configs: vec![validator_config; 4], + validator_configs: make_identical_validator_configs(&validator_config, 4), ..ClusterConfig::default() }; let cluster = LocalCluster::new(&mut config); @@ -1453,7 +1466,10 @@ fn test_optimistic_confirmation_violation_detection() { let mut config = ClusterConfig { cluster_lamports: 100_000, node_stakes: node_stakes.clone(), - validator_configs: vec![ValidatorConfig::default(); node_stakes.len()], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + node_stakes.len(), + ), validator_keys: Some(validator_keys), slots_per_epoch, stakers_slot_offset: slots_per_epoch, @@ -1786,7 +1802,10 @@ fn do_test_optimistic_confirmation_violation_with_or_without_tower(with_tower: b let mut config = ClusterConfig { cluster_lamports: 100_000, node_stakes: node_stakes.clone(), - validator_configs: vec![ValidatorConfig::default(); node_stakes.len()], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + node_stakes.len(), + ), validator_keys: Some(validator_keys), slots_per_epoch, stakers_slot_offset: slots_per_epoch, @@ -1965,7 +1984,10 @@ fn do_test_future_tower(cluster_mode: ClusterMode) { let mut config = ClusterConfig { cluster_lamports: 100_000, node_stakes: node_stakes.clone(), - validator_configs: vec![ValidatorConfig::default(); node_stakes.len()], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + node_stakes.len(), + ), validator_keys: Some(validator_keys), slots_per_epoch, stakers_slot_offset: slots_per_epoch, @@ -2069,7 +2091,10 @@ fn test_hard_fork_invalidates_tower() { let mut config = ClusterConfig { cluster_lamports: 100_000, node_stakes: node_stakes.clone(), - validator_configs: vec![ValidatorConfig::default(); node_stakes.len()], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + node_stakes.len(), + ), validator_keys: Some(validator_keys), slots_per_epoch, stakers_slot_offset: slots_per_epoch, @@ -2363,7 +2388,10 @@ fn run_test_load_program_accounts(scan_commitment: CommitmentConfig) { let mut config = ClusterConfig { cluster_lamports: 100_000, node_stakes: node_stakes.clone(), - validator_configs: vec![ValidatorConfig::default(); node_stakes.len()], + validator_configs: make_identical_validator_configs( + &ValidatorConfig::default(), + node_stakes.len(), + ), validator_keys: Some(validator_keys), slots_per_epoch, stakers_slot_offset: slots_per_epoch,