diff --git a/core/src/test_validator.rs b/core/src/test_validator.rs index 0685fe161e..83ba53dca3 100644 --- a/core/src/test_validator.rs +++ b/core/src/test_validator.rs @@ -1,5 +1,8 @@ use { - crate::validator::{Validator, ValidatorConfig, ValidatorStartProgress}, + crate::{ + tower_storage::TowerStorage, + validator::{Validator, ValidatorConfig, ValidatorStartProgress}, + }, solana_client::rpc_client::RpcClient, solana_gossip::{ cluster_info::{ClusterInfo, Node}, @@ -76,6 +79,7 @@ impl Default for TestValidatorNodeConfig { pub struct TestValidatorGenesis { fee_rate_governor: FeeRateGovernor, ledger_path: Option, + tower_storage: Option>, pub rent: Rent, rpc_config: JsonRpcConfig, rpc_ports: Option<(u16, u16)>, // (JsonRpc, JsonRpcPubSub), None == random ports @@ -97,6 +101,11 @@ impl TestValidatorGenesis { self } + pub fn tower_storage(&mut self, tower_storage: Arc) -> &mut Self { + self.tower_storage = Some(tower_storage); + self + } + /// Check if a given TestValidator ledger has already been initialized pub fn ledger_exists(ledger_path: &Path) -> bool { ledger_path.join("vote-account-keypair.json").exists() @@ -484,7 +493,7 @@ impl TestValidator { } } - let validator_config = ValidatorConfig { + let mut validator_config = ValidatorConfig { rpc_addrs: Some(( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), node.info.rpc.port()), SocketAddr::new( @@ -514,6 +523,9 @@ impl TestValidator { no_wait_for_vote_to_start_leader: true, ..ValidatorConfig::default() }; + if let Some(ref tower_storage) = config.tower_storage { + validator_config.tower_storage = tower_storage.clone(); + } let validator = Some(Validator::new( node, diff --git a/core/src/tower_storage.rs b/core/src/tower_storage.rs index dedfacc6db..f2d748125b 100644 --- a/core/src/tower_storage.rs +++ b/core/src/tower_storage.rs @@ -6,7 +6,7 @@ use { }, std::{ fs::{self, File}, - io::BufReader, + io::{self, BufReader}, path::PathBuf, }, }; @@ -70,9 +70,10 @@ pub struct NullTowerStorage {} impl TowerStorage for NullTowerStorage { fn load(&self, _node_pubkey: &Pubkey) -> Result { - Err(TowerError::WrongTower( - "NullTowerStorage has no storage".into(), - )) + Err(TowerError::IoError(io::Error::new( + io::ErrorKind::Other, + "NullTowerStorage::load() not available", + ))) } fn store(&self, _saved_tower: &SavedTower) -> Result<()> { diff --git a/core/src/validator.rs b/core/src/validator.rs index 80bc2733be..4ee13192e4 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -13,7 +13,7 @@ use crate::{ serve_repair_service::ServeRepairService, sigverify, snapshot_packager_service::{PendingSnapshotPackage, SnapshotPackagerService}, - tower_storage::{FileTowerStorage, TowerStorage}, + tower_storage::TowerStorage, tpu::{Tpu, DEFAULT_TPU_COALESCE_MS}, tvu::{Sockets, Tvu, TvuConfig}, }; @@ -183,7 +183,7 @@ impl Default for ValidatorConfig { wal_recovery_mode: None, poh_verify: true, require_tower: false, - tower_storage: Arc::new(FileTowerStorage::new(PathBuf::default())), + tower_storage: Arc::new(crate::tower_storage::NullTowerStorage::default()), debug_keys: None, contact_debug_interval: DEFAULT_CONTACT_DEBUG_INTERVAL_MILLIS, contact_save_interval: DEFAULT_CONTACT_SAVE_INTERVAL_MILLIS, diff --git a/validator/src/bin/solana-test-validator.rs b/validator/src/bin/solana-test-validator.rs index 905ad9dd2b..dc77f4eac7 100644 --- a/validator/src/bin/solana-test-validator.rs +++ b/validator/src/bin/solana-test-validator.rs @@ -509,6 +509,8 @@ fn main() { let mut genesis = TestValidatorGenesis::default(); genesis.max_ledger_shreds = value_of(&matches, "limit_ledger_size"); + let tower_storage = Arc::new(FileTowerStorage::new(ledger_path.clone())); + let admin_service_cluster_info = Arc::new(RwLock::new(None)); admin_rpc_service::run( &ledger_path, @@ -522,7 +524,7 @@ fn main() { validator_exit: genesis.validator_exit.clone(), authorized_voter_keypairs: genesis.authorized_voter_keypairs.clone(), cluster_info: admin_service_cluster_info.clone(), - tower_storage: Arc::new(FileTowerStorage::new(ledger_path.clone())), + tower_storage: tower_storage.clone(), }, ); let dashboard = if output == Output::Dashboard { @@ -540,6 +542,7 @@ fn main() { genesis .ledger_path(&ledger_path) + .tower_storage(tower_storage) .add_account( faucet_pubkey, AccountSharedData::new(faucet_lamports, 0, &system_program::id()),