From 6632c7026dee8ea53473e62d99222531e83b940a Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Tue, 12 Feb 2019 10:01:35 -0800 Subject: [PATCH] Pass a BlocktreeConfig into all ledger helper functions --- genesis/src/main.rs | 6 +- ledger-tool/tests/basic.rs | 4 +- src/blocktree.rs | 17 ++-- src/fullnode.rs | 76 +++++++++-------- src/replay_stage.rs | 23 +++--- src/storage_stage.rs | 18 +++-- src/thin_client.rs | 2 +- tests/multinode.rs | 162 +++++++++++++++++++++++-------------- tests/replicator.rs | 24 ++++-- 9 files changed, 200 insertions(+), 132 deletions(-) diff --git a/genesis/src/main.rs b/genesis/src/main.rs index e1ed33f6c..22db4eaa7 100644 --- a/genesis/src/main.rs +++ b/genesis/src/main.rs @@ -75,6 +75,10 @@ fn main() -> Result<(), Box> { bootstrap_leader_vote_account_id: bootstrap_leader_vote_account_keypair.pubkey(), }; - create_new_ledger(ledger_path, &genesis_block)?; + create_new_ledger( + ledger_path, + &genesis_block, + &solana::blocktree::BlocktreeConfig::default(), + )?; Ok(()) } diff --git a/ledger-tool/tests/basic.rs b/ledger-tool/tests/basic.rs index 4e550eea2..59592e380 100644 --- a/ledger-tool/tests/basic.rs +++ b/ledger-tool/tests/basic.rs @@ -1,4 +1,4 @@ -use solana::blocktree::create_tmp_sample_ledger; +use solana::blocktree::{create_tmp_sample_ledger, BlocktreeConfig}; use solana_sdk::signature::{Keypair, KeypairUtil}; use assert_cmd::prelude::*; @@ -39,7 +39,7 @@ fn nominal() { 9, keypair.pubkey(), 50, - std::u64::MAX, + &BlocktreeConfig::default(), ); // Basic validation diff --git a/src/blocktree.rs b/src/blocktree.rs index 1f8883755..8dcd1516c 100644 --- a/src/blocktree.rs +++ b/src/blocktree.rs @@ -1278,12 +1278,13 @@ impl Iterator for EntryIterator { pub fn create_new_ledger( ledger_path: &str, genesis_block: &GenesisBlock, + config: &BlocktreeConfig, ) -> Result<(u64, u64, Hash)> { Blocktree::destroy(ledger_path)?; genesis_block.write(&ledger_path)?; // Add a single tick linked back to the genesis_block to bootstrap the ledger - let blocktree = Blocktree::open(ledger_path)?; + let blocktree = Blocktree::open_config(ledger_path, config)?; let entries = crate::entry::create_ticks(1, genesis_block.last_id()); blocktree.write_entries(DEFAULT_SLOT_HEIGHT, 0, std::u64::MAX, 0, &entries)?; @@ -1332,19 +1333,19 @@ pub fn create_tmp_sample_ledger( num_extra_ticks: u64, bootstrap_leader_id: Pubkey, bootstrap_leader_tokens: u64, - ticks_per_slot: u64, + config: &BlocktreeConfig, ) -> (Keypair, String, u64, u64, Hash, Hash) { let (genesis_block, mint_keypair) = GenesisBlock::new_with_leader(num_tokens, bootstrap_leader_id, bootstrap_leader_tokens); let ledger_path = get_tmp_ledger_path(name); let (mut entry_height, mut tick_height, mut last_entry_id) = - create_new_ledger(&ledger_path, &genesis_block).unwrap(); + create_new_ledger(&ledger_path, &genesis_block, config).unwrap(); let mut last_id = genesis_block.last_id(); if num_extra_ticks > 0 { let entries = crate::entry::create_ticks(num_extra_ticks, last_entry_id); - let blocktree = Blocktree::open(&ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&ledger_path, config).unwrap(); // create_new_ledger creates one beginning tick tick_height += num_extra_ticks; @@ -1352,7 +1353,7 @@ pub fn create_tmp_sample_ledger( .write_entries( DEFAULT_SLOT_HEIGHT, tick_height, - ticks_per_slot, + config.ticks_per_slot, entry_height, &entries, ) @@ -1371,15 +1372,15 @@ pub fn create_tmp_sample_ledger( ) } -pub fn tmp_copy_ledger(from: &str, name: &str) -> String { +pub fn tmp_copy_ledger(from: &str, name: &str, config: &BlocktreeConfig) -> String { let path = get_tmp_ledger_path(name); - let blocktree = Blocktree::open(from).unwrap(); + let blocktree = Blocktree::open_config(from, config).unwrap(); let blobs = blocktree.read_ledger_blobs(); let genesis_block = GenesisBlock::load(from).unwrap(); Blocktree::destroy(&path).expect("Expected successful database destruction"); - let blocktree = Blocktree::open(&path).unwrap(); + let blocktree = Blocktree::open_config(&path, config).unwrap(); blocktree.write_blobs(blobs).unwrap(); genesis_block.write(&path).unwrap(); diff --git a/src/fullnode.rs b/src/fullnode.rs index 24099dfa4..58e71e9a2 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -521,7 +521,9 @@ impl Service for Fullnode { mod tests { use super::*; use crate::blob_fetch_stage::BlobFetchStage; - use crate::blocktree::{create_tmp_sample_ledger, tmp_copy_ledger, DEFAULT_SLOT_HEIGHT}; + use crate::blocktree::{ + create_tmp_sample_ledger, tmp_copy_ledger, BlocktreeConfig, DEFAULT_SLOT_HEIGHT, + }; use crate::entry::make_consecutive_blobs; use crate::entry::EntrySlice; use crate::gossip_service::{converge, make_listening_node}; @@ -551,7 +553,7 @@ mod tests { 0, leader_keypair.pubkey(), 1000, - std::u64::MAX, + &BlocktreeConfig::default(), ); let validator = Fullnode::new( @@ -589,7 +591,7 @@ mod tests { 0, leader_keypair.pubkey(), 1000, - std::u64::MAX, + &BlocktreeConfig::default(), ); ledger_paths.push(validator_ledger_path.clone()); Fullnode::new( @@ -634,6 +636,11 @@ mod tests { let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_length); + let bootstrap_leader_keypair = Arc::new(bootstrap_leader_keypair); + let voting_keypair = VotingKeypair::new_local(&bootstrap_leader_keypair); + let mut fullnode_config = FullnodeConfig::default(); + fullnode_config.leader_scheduler_config = leader_scheduler_config; + let ( _mint_keypair, bootstrap_leader_ledger_path, @@ -647,14 +654,10 @@ mod tests { 1, bootstrap_leader_keypair.pubkey(), 500, - ticks_per_slot, + &fullnode_config.ledger_config(), ); - let bootstrap_leader_keypair = Arc::new(bootstrap_leader_keypair); - let voting_keypair = VotingKeypair::new_local(&bootstrap_leader_keypair); // Start the bootstrap leader - let mut fullnode_config = FullnodeConfig::default(); - fullnode_config.leader_scheduler_config = leader_scheduler_config; let bootstrap_leader = Fullnode::new( bootstrap_leader_node, &bootstrap_leader_keypair, @@ -688,6 +691,7 @@ mod tests { slots_per_epoch, ticks_per_slot * slots_per_epoch, ); + let blocktree_config = &fullnode_config.ledger_config(); // Create the leader and validator nodes let bootstrap_leader_keypair = Arc::new(Keypair::new()); @@ -702,11 +706,15 @@ mod tests { ticks_per_slot * 4, "test_wrong_role_transition", ticks_per_slot, + &blocktree_config, ); let bootstrap_leader_info = bootstrap_leader_node.info.clone(); - let validator_ledger_path = - tmp_copy_ledger(&bootstrap_leader_ledger_path, "test_wrong_role_transition"); + let validator_ledger_path = tmp_copy_ledger( + &bootstrap_leader_ledger_path, + "test_wrong_role_transition", + &blocktree_config, + ); let ledger_paths = vec![ bootstrap_leader_ledger_path.clone(), @@ -759,6 +767,12 @@ mod tests { let slots_per_epoch = 4; let leader_keypair = Arc::new(Keypair::new()); let validator_keypair = Arc::new(Keypair::new()); + let mut fullnode_config = FullnodeConfig::default(); + fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new( + ticks_per_slot, + slots_per_epoch, + ticks_per_slot * slots_per_epoch, + ); let (leader_node, validator_node, validator_ledger_path, ledger_initial_len, last_id) = setup_leader_validator( &leader_keypair, @@ -767,6 +781,7 @@ mod tests { 0, "test_validator_to_leader_transition", ticks_per_slot, + &fullnode_config.ledger_config(), ); let leader_id = leader_keypair.pubkey(); @@ -775,14 +790,6 @@ mod tests { info!("leader: {:?}", leader_id); info!("validator: {:?}", validator_info.id); - // Set the leader scheduler for the validator - let mut fullnode_config = FullnodeConfig::default(); - fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new( - ticks_per_slot, - slots_per_epoch, - ticks_per_slot * slots_per_epoch, - ); - let voting_keypair = VotingKeypair::new_local(&validator_keypair); // Start the validator @@ -860,18 +867,6 @@ mod tests { info!("leader: {:?}", leader_keypair.pubkey()); info!("validator: {:?}", validator_keypair.pubkey()); - let (leader_node, _, leader_ledger_path, _, _) = setup_leader_validator( - &leader_keypair, - &validator_keypair, - 1, - 0, - "test_tvu_behind", - ticks_per_slot, - ); - - let leader_node_info = leader_node.info.clone(); - - // Set the leader scheduler for the validator let mut fullnode_config = FullnodeConfig::default(); fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new( ticks_per_slot, @@ -881,6 +876,18 @@ mod tests { let config = PohServiceConfig::Sleep(Duration::from_millis(200)); fullnode_config.tick_config = config; + let (leader_node, _, leader_ledger_path, _, _) = setup_leader_validator( + &leader_keypair, + &validator_keypair, + 1, + 0, + "test_tvu_behind", + ticks_per_slot, + &fullnode_config.ledger_config(), + ); + + let leader_node_info = leader_node.info.clone(); + info!("Start up a listener"); let blob_receiver_exit = Arc::new(AtomicBool::new(false)); let (_, _, mut listening_node, _) = make_listening_node(&leader_node.info); @@ -968,7 +975,9 @@ mod tests { // Check the ledger to make sure the PoH chains { - let blocktree = Blocktree::open(&leader_ledger_path).unwrap(); + let blocktree = + Blocktree::open_config(&leader_ledger_path, &fullnode_config.ledger_config()) + .unwrap(); let entries: Vec<_> = (0..3) .flat_map(|slot_height| blocktree.get_slot_entries(slot_height, 0, None).unwrap()) .collect(); @@ -990,6 +999,7 @@ mod tests { num_ending_ticks: u64, test_name: &str, ticks_per_slot: u64, + config: &BlocktreeConfig, ) -> (Node, Node, String, u64, Hash) { // Make a leader identity let leader_node = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); @@ -1003,7 +1013,7 @@ mod tests { num_genesis_ticks, leader_node.info.id, 500, - ticks_per_slot, + config, ); let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey()); @@ -1025,7 +1035,7 @@ mod tests { num_ending_ticks, ); - let blocktree = Blocktree::open(&ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&ledger_path, config).unwrap(); let active_set_entries_len = active_set_entries.len() as u64; let last_id = active_set_entries.last().unwrap().id; diff --git a/src/replay_stage.rs b/src/replay_stage.rs index 468e0929a..bb6c62780 100644 --- a/src/replay_stage.rs +++ b/src/replay_stage.rs @@ -387,13 +387,13 @@ mod test { let my_node = Node::new_localhost_with_pubkey(my_id); let cluster_info_me = ClusterInfo::new(my_node.info.clone()); + // Create keypair for the old leader + let old_leader_id = Keypair::new().pubkey(); + // Set up the LeaderScheduler so that my_id becomes the leader for epoch 1 let ticks_per_slot = 16; let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, 1, ticks_per_slot); - // Create keypair for the old leader - let old_leader_id = Keypair::new().pubkey(); - // Create a ledger let ( mint_keypair, @@ -408,7 +408,7 @@ mod test { 0, old_leader_id, 500, - ticks_per_slot, + &BlocktreeConfig::new(ticks_per_slot), ); info!("my_id: {:?}", my_id); @@ -539,7 +539,7 @@ mod test { 1, leader_id, 500, - ticks_per_slot, + &BlocktreeConfig::default(), ); // Set up the cluster info @@ -608,6 +608,10 @@ mod test { fn test_vote_error_replay_stage_leader_rotation() { solana_logger::setup(); + let ticks_per_slot = 10; + let slots_per_epoch = 2; + let active_window_tick_length = ticks_per_slot * slots_per_epoch; + // Set up dummy node to host a ReplayStage let my_keypair = Keypair::new(); let my_id = my_keypair.pubkey(); @@ -616,8 +620,8 @@ mod test { // Create keypair for the leader let leader_id = Keypair::new().pubkey(); - let ticks_per_slot = 10; // Create the ledger + let blocktree_config = BlocktreeConfig::new(ticks_per_slot); let ( mint_keypair, my_ledger_path, @@ -631,7 +635,7 @@ mod test { 1, leader_id, 500, - ticks_per_slot, + &blocktree_config, ); let my_keypair = Arc::new(my_keypair); @@ -649,7 +653,7 @@ mod test { ); let mut last_id = active_set_entries.last().unwrap().id; { - let blocktree = Blocktree::open(&my_ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&my_ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -661,8 +665,6 @@ mod test { .unwrap(); } - let slots_per_epoch = 2; - let active_window_tick_length = ticks_per_slot * slots_per_epoch; let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_tick_length); @@ -673,7 +675,6 @@ mod test { let (rotation_tx, rotation_rx) = channel(); let exit = Arc::new(AtomicBool::new(false)); { - let blocktree_config = BlocktreeConfig::new(ticks_per_slot); let (bank, _entry_height, last_entry_id, blocktree, l_sender, l_receiver) = new_bank_from_ledger(&my_ledger_path, &blocktree_config, &leader_scheduler_config); diff --git a/src/storage_stage.rs b/src/storage_stage.rs index 72e922a41..db03110b7 100644 --- a/src/storage_stage.rs +++ b/src/storage_stage.rs @@ -432,11 +432,11 @@ impl Service for StorageStage { #[cfg(test)] mod tests { - use crate::blocktree::create_tmp_sample_ledger; - use crate::blocktree::{Blocktree, DEFAULT_SLOT_HEIGHT}; - use crate::entry::{make_tiny_test_entries, Entry}; - + use crate::blocktree::{ + create_tmp_sample_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT, + }; use crate::cluster_info::{ClusterInfo, NodeInfo}; + use crate::entry::{make_tiny_test_entries, Entry}; use crate::service::Service; use crate::storage_stage::StorageState; use crate::storage_stage::NUM_IDENTITIES; @@ -493,6 +493,7 @@ mod tests { let exit = Arc::new(AtomicBool::new(false)); let ticks_per_slot = std::u64::MAX; + let blocktree_config = BlocktreeConfig::default(); let (_mint, ledger_path, tick_height, genesis_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "storage_stage_process_entries", @@ -500,11 +501,11 @@ mod tests { 1, Keypair::new().pubkey(), 1, - ticks_per_slot, + &blocktree_config, ); let entries = make_tiny_test_entries(64); - let blocktree = Blocktree::open(&ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -570,6 +571,7 @@ mod tests { let exit = Arc::new(AtomicBool::new(false)); let ticks_per_slot = std::u64::MAX; + let blocktree_config = BlocktreeConfig::default(); let (_mint, ledger_path, tick_height, genesis_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "storage_stage_process_entries", @@ -577,11 +579,11 @@ mod tests { 1, Keypair::new().pubkey(), 1, - ticks_per_slot, + &blocktree_config, ); let entries = make_tiny_test_entries(128); - let blocktree = Blocktree::open(&ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, diff --git a/src/thin_client.rs b/src/thin_client.rs index 644cc980a..4f9385ce9 100644 --- a/src/thin_client.rs +++ b/src/thin_client.rs @@ -487,7 +487,7 @@ pub fn new_fullnode(ledger_name: &'static str) -> (Fullnode, NodeInfo, Keypair, 0, node_info.id, 42, - fullnode_config.leader_scheduler_config.ticks_per_slot, + &fullnode_config.ledger_config(), ); let vote_account_keypair = Arc::new(Keypair::new()); diff --git a/tests/multinode.rs b/tests/multinode.rs index dda62e9ec..455f81279 100644 --- a/tests/multinode.rs +++ b/tests/multinode.rs @@ -1,7 +1,8 @@ use log::*; use solana::blob_fetch_stage::BlobFetchStage; -use solana::blocktree::{create_tmp_sample_ledger, tmp_copy_ledger}; -use solana::blocktree::{Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT}; +use solana::blocktree::{ + create_tmp_sample_ledger, tmp_copy_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT, +}; use solana::client::mk_client; use solana::cluster_info::{Node, NodeInfo}; use solana::entry::{reconstruct_entries_from_blobs, Entry}; @@ -25,8 +26,9 @@ use std::sync::{Arc, RwLock}; use std::thread::{sleep, Builder}; use std::time::{Duration, Instant}; -fn read_ledger(ledger_path: &str) -> Vec { - let ledger = Blocktree::open(&ledger_path).expect("Unable to open ledger"); +fn read_ledger(ledger_path: &str, blocktree_config: &BlocktreeConfig) -> Vec { + let ledger = + Blocktree::open_config(&ledger_path, blocktree_config).expect("Unable to open ledger"); ledger .read_ledger() .expect("Unable to read ledger") @@ -44,7 +46,11 @@ fn test_multi_node_ledger_window() -> result::Result<()> { let mut ledger_paths = Vec::new(); let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; + info!( + "ticks_per_slot: {}", + fullnode_config.leader_scheduler_config.ticks_per_slot + ); + let blocktree_config = fullnode_config.ledger_config(); let ( alice, @@ -59,21 +65,23 @@ fn test_multi_node_ledger_window() -> result::Result<()> { 0, leader_data.id, 500, - ticks_per_slot, + &blocktree_config, ); ledger_paths.push(leader_ledger_path.clone()); // make a copy at zero - let zero_ledger_path = tmp_copy_ledger(&leader_ledger_path, "multi_node_ledger_window"); + let zero_ledger_path = tmp_copy_ledger( + &leader_ledger_path, + "multi_node_ledger_window", + &blocktree_config, + ); ledger_paths.push(zero_ledger_path.clone()); - info!("ticks_per_slot: {}", ticks_per_slot,); - // Write some into leader's ledger, this should populate the leader's window // and force it to respond to repair from the ledger window // TODO: write out more than slot 0 { - let blocktree = Blocktree::open(&leader_ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap(); let entries = solana::entry::create_ticks( fullnode_config.leader_scheduler_config.ticks_per_slot - last_entry_height - 1, @@ -83,7 +91,7 @@ fn test_multi_node_ledger_window() -> result::Result<()> { .write_entries( DEFAULT_SLOT_HEIGHT, tick_height, - ticks_per_slot, + blocktree_config.ticks_per_slot, last_entry_height, &entries, ) @@ -182,8 +190,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { let mut ledger_paths = Vec::new(); let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; - + let blocktree_config = fullnode_config.ledger_config(); let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "multi_node_validator_catchup_from_zero", @@ -191,19 +198,21 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { 0, leader_data.id, 500, - ticks_per_slot, + &blocktree_config, ); ledger_paths.push(genesis_ledger_path.clone()); let zero_ledger_path = tmp_copy_ledger( &genesis_ledger_path, "multi_node_validator_catchup_from_zero", + &blocktree_config, ); ledger_paths.push(zero_ledger_path.clone()); let leader_ledger_path = tmp_copy_ledger( &genesis_ledger_path, "multi_node_validator_catchup_from_zero", + &blocktree_config, ); ledger_paths.push(leader_ledger_path.clone()); let voting_keypair = VotingKeypair::new_local(&leader_keypair); @@ -224,6 +233,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> { let ledger_path = tmp_copy_ledger( &genesis_ledger_path, "multi_node_validator_catchup_from_zero_validator", + &blocktree_config, ); ledger_paths.push(ledger_path.clone()); @@ -375,8 +385,7 @@ fn test_multi_node_basic() { let mut ledger_paths = Vec::new(); let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; - + let blocktree_config = fullnode_config.ledger_config(); let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "multi_node_basic", @@ -384,11 +393,12 @@ fn test_multi_node_basic() { 0, leader_data.id, 500, - ticks_per_slot, + &blocktree_config, ); ledger_paths.push(genesis_ledger_path.clone()); - let leader_ledger_path = tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic"); + let leader_ledger_path = + tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic", &blocktree_config); ledger_paths.push(leader_ledger_path.clone()); let voting_keypair = VotingKeypair::new_local(&leader_keypair); @@ -406,7 +416,8 @@ fn test_multi_node_basic() { let keypair = Arc::new(Keypair::new()); let validator_pubkey = keypair.pubkey().clone(); let validator = Node::new_localhost_with_pubkey(keypair.pubkey()); - let ledger_path = tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic"); + let ledger_path = + tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic", &blocktree_config); ledger_paths.push(ledger_path.clone()); // Send each validator some tokens to vote @@ -485,7 +496,7 @@ fn test_boot_validator_from_file() -> result::Result<()> { let mut ledger_paths = Vec::new(); let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; + let blocktree_config = fullnode_config.ledger_config(); let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "boot_validator_from_file", @@ -493,11 +504,12 @@ fn test_boot_validator_from_file() -> result::Result<()> { 0, leader_pubkey, 1000, - ticks_per_slot, + &blocktree_config, ); ledger_paths.push(genesis_ledger_path.clone()); - let leader_ledger_path = tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic"); + let leader_ledger_path = + tmp_copy_ledger(&genesis_ledger_path, "multi_node_basic", &blocktree_config); ledger_paths.push(leader_ledger_path.clone()); let leader_data = leader.info.clone(); @@ -520,7 +532,11 @@ fn test_boot_validator_from_file() -> result::Result<()> { let keypair = Arc::new(Keypair::new()); let validator = Node::new_localhost_with_pubkey(keypair.pubkey()); let validator_data = validator.info.clone(); - let ledger_path = tmp_copy_ledger(&genesis_ledger_path, "boot_validator_from_file"); + let ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "boot_validator_from_file", + &blocktree_config, + ); ledger_paths.push(ledger_path.clone()); let voting_keypair = VotingKeypair::new_local(&keypair); let val_fullnode = Fullnode::new( @@ -570,10 +586,10 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { // ledger (currently up to WINDOW_SIZE entries) solana_logger::setup(); + let blocktree_config = BlocktreeConfig::default(); let leader_keypair = Arc::new(Keypair::new()); let initial_leader_balance = 500; let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; let (alice, ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "leader_restart_validator_start_from_old_ledger", @@ -581,7 +597,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { 0, leader_keypair.pubkey(), initial_leader_balance, - ticks_per_slot, + &blocktree_config, ); let bob_pubkey = Keypair::new().pubkey(); @@ -604,6 +620,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> { let stale_ledger_path = tmp_copy_ledger( &ledger_path, "leader_restart_validator_start_from_old_ledger", + &blocktree_config, ); { @@ -686,7 +703,7 @@ fn test_multi_node_dynamic_network() { let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); let bob_pubkey = Keypair::new().pubkey(); let fullnode_config = FullnodeConfig::default(); - let ticks_per_slot = fullnode_config.leader_scheduler_config.ticks_per_slot; + let blocktree_config = fullnode_config.ledger_config(); let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) = create_tmp_sample_ledger( "multi_node_dynamic_network", @@ -694,13 +711,17 @@ fn test_multi_node_dynamic_network() { 0, leader_pubkey, 500, - ticks_per_slot, + &blocktree_config, ); let mut ledger_paths = Vec::new(); ledger_paths.push(genesis_ledger_path.clone()); - let leader_ledger_path = tmp_copy_ledger(&genesis_ledger_path, "multi_node_dynamic_network"); + let leader_ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "multi_node_dynamic_network", + &blocktree_config, + ); let alice_arc = Arc::new(RwLock::new(alice)); let leader_data = leader.info.clone(); @@ -769,7 +790,11 @@ fn test_multi_node_dynamic_network() { .into_iter() .map(|keypair| { let leader_data = leader_data.clone(); - let ledger_path = tmp_copy_ledger(&genesis_ledger_path, "multi_node_dynamic_network"); + let ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "multi_node_dynamic_network", + &blocktree_config, + ); ledger_paths.push(ledger_path.clone()); Builder::new() .name("validator-launch-thread".to_string()) @@ -907,6 +932,7 @@ fn test_leader_to_validator_transition() { // height 1 will be considered. ticks_per_slot, ); + let blocktree_config = fullnode_config.ledger_config(); // Initialize the leader ledger. Make a mint and a genesis entry // in the leader ledger @@ -923,7 +949,7 @@ fn test_leader_to_validator_transition() { 0, leader_info.id, 500, - ticks_per_slot, + &blocktree_config, ); // Write the votes entries to the ledger that will cause leader rotation @@ -938,7 +964,7 @@ fn test_leader_to_validator_transition() { 0, ); { - let blocktree = Blocktree::open(&leader_ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -1021,6 +1047,7 @@ fn test_leader_validator_basic() { 1, // 1 slot per epoch ticks_per_slot, ); + let blocktree_config = fullnode_config.ledger_config(); // Make a common mint and a genesis entry for both leader + validator ledgers let ( @@ -1036,7 +1063,7 @@ fn test_leader_validator_basic() { 0, leader_info.id, 500, - ticks_per_slot, + &blocktree_config, ); // Add validator vote on tick height 1 @@ -1050,7 +1077,7 @@ fn test_leader_validator_basic() { 0, ); { - let blocktree = Blocktree::open(&leader_ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -1065,7 +1092,11 @@ fn test_leader_validator_basic() { // Initialize both leader + validator ledger let mut ledger_paths = Vec::new(); ledger_paths.push(leader_ledger_path.clone()); - let validator_ledger_path = tmp_copy_ledger(&leader_ledger_path, "test_leader_validator_basic"); + let validator_ledger_path = tmp_copy_ledger( + &leader_ledger_path, + "test_leader_validator_basic", + &blocktree_config, + ); ledger_paths.push(validator_ledger_path.clone()); // Start the validator node @@ -1137,9 +1168,9 @@ fn test_leader_validator_basic() { // Check the ledger of the validator to make sure the entry height is correct // and that the old leader and the new leader's ledgers agree up to the point // of leader rotation - let validator_entries: Vec = read_ledger(&validator_ledger_path); + let validator_entries: Vec = read_ledger(&validator_ledger_path, &blocktree_config); - let leader_entries = read_ledger(&leader_ledger_path); + let leader_entries = read_ledger(&leader_ledger_path, &blocktree_config); assert!(leader_entries.len() as u64 >= ticks_per_slot); for (v, l) in validator_entries.iter().zip(leader_entries) { @@ -1173,6 +1204,7 @@ fn test_dropped_handoff_recovery() { let mut fullnode_config = FullnodeConfig::default(); fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, ticks_per_epoch); + let blocktree_config = fullnode_config.ledger_config(); // Make a common mint and a genesis entry for both leader + validator's ledgers let num_ending_ticks = 1; @@ -1189,7 +1221,7 @@ fn test_dropped_handoff_recovery() { num_ending_ticks, bootstrap_leader_info.id, 500, - ticks_per_slot, + &blocktree_config, ); // Create the validator keypair that will be the next leader in line @@ -1215,7 +1247,7 @@ fn test_dropped_handoff_recovery() { // Write the entries { - let blocktree = Blocktree::open(&genesis_ledger_path).unwrap(); + let blocktree = Blocktree::open_config(&genesis_ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -1227,8 +1259,11 @@ fn test_dropped_handoff_recovery() { .unwrap(); } - let next_leader_ledger_path = - tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery"); + let next_leader_ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "test_dropped_handoff_recovery", + &blocktree_config, + ); ledger_paths.push(next_leader_ledger_path.clone()); info!("bootstrap_leader: {}", bootstrap_leader_keypair.pubkey()); @@ -1236,8 +1271,11 @@ fn test_dropped_handoff_recovery() { let voting_keypair = VotingKeypair::new_local(&bootstrap_leader_keypair); // Start up the bootstrap leader fullnode - let bootstrap_leader_ledger_path = - tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery"); + let bootstrap_leader_ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "test_dropped_handoff_recovery", + &blocktree_config, + ); ledger_paths.push(bootstrap_leader_ledger_path.clone()); let bootstrap_leader = Fullnode::new( @@ -1255,8 +1293,11 @@ fn test_dropped_handoff_recovery() { // Start up the validators other than the "next_leader" validator for i in 0..(N - 1) { let keypair = Arc::new(Keypair::new()); - let validator_ledger_path = - tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery"); + let validator_ledger_path = tmp_copy_ledger( + &genesis_ledger_path, + "test_dropped_handoff_recovery", + &blocktree_config, + ); ledger_paths.push(validator_ledger_path.clone()); let validator_id = keypair.pubkey(); info!("validator {}: {}", i, validator_id); @@ -1343,6 +1384,7 @@ fn test_full_leader_validator_network() { let bootstrap_leader_info = bootstrap_leader_node.info.clone(); let mut node_keypairs = VecDeque::new(); + let blocktree_config = BlocktreeConfig::default(); // Create the validator keypairs for _ in 0..N { @@ -1365,7 +1407,7 @@ fn test_full_leader_validator_network() { num_ending_ticks, bootstrap_leader_info.id, 500, - ticks_per_slot, + &blocktree_config, ); // Create a common ledger with entries in the beginnging that will add all the validators @@ -1392,7 +1434,8 @@ fn test_full_leader_validator_network() { .expect("expected at least one genesis entry") .id; { - let blocktree = Blocktree::open(&bootstrap_leader_ledger_path).unwrap(); + let blocktree = + Blocktree::open_config(&bootstrap_leader_ledger_path, &blocktree_config).unwrap(); blocktree .write_entries( DEFAULT_SLOT_HEIGHT, @@ -1414,6 +1457,7 @@ fn test_full_leader_validator_network() { let validator_ledger_path = tmp_copy_ledger( &bootstrap_leader_ledger_path, "test_full_leader_validator_network", + &blocktree_config, ); ledger_paths.push(validator_ledger_path.clone()); @@ -1484,7 +1528,7 @@ fn test_full_leader_validator_network() { let mut node_entries = vec![]; info!("Check that all the ledgers match"); for ledger_path in ledger_paths.iter() { - let entries = read_ledger(ledger_path); + let entries = read_ledger(ledger_path, &blocktree_config); node_entries.push(entries.into_iter()); } @@ -1566,6 +1610,7 @@ fn test_broadcast_last_tick() { LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, ticks_per_epoch); // Create leader ledger + let blocktree_config = BlocktreeConfig::default(); let ( _mint_keypair, bootstrap_leader_ledger_path, @@ -1579,7 +1624,7 @@ fn test_broadcast_last_tick() { 0, bootstrap_leader_info.id, 500, - ticks_per_slot, + &blocktree_config, ); let genesis_ledger_len = genesis_entry_height; @@ -1640,7 +1685,7 @@ fn test_broadcast_last_tick() { // Index of the last tick must be at least ticks_per_slot - 1 let last_tick_entry_index = ticks_per_slot as usize - 1; - let entries = read_ledger(&bootstrap_leader_ledger_path); + let entries = read_ledger(&bootstrap_leader_ledger_path, &blocktree_config); assert!(entries.len() >= last_tick_entry_index + 1); let expected_last_tick = &entries[last_tick_entry_index]; debug!("last_tick_entry_index: {:?}", last_tick_entry_index); @@ -1748,6 +1793,11 @@ fn test_fullnode_rotate(ticks_per_slot: u64, slots_per_epoch: u64) { ticks_per_slot, slots_per_epoch ); + let mut fullnode_config = FullnodeConfig::default(); + fullnode_config.leader_scheduler_config.ticks_per_slot = ticks_per_slot; + fullnode_config.leader_scheduler_config.slots_per_epoch = slots_per_epoch; + let blocktree_config = fullnode_config.ledger_config(); + let leader_keypair = Arc::new(Keypair::new()); let leader_pubkey = leader_keypair.pubkey().clone(); let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); @@ -1759,15 +1809,11 @@ fn test_fullnode_rotate(ticks_per_slot: u64, slots_per_epoch: u64) { 0, leader_pubkey, 123, - ticks_per_slot, + &blocktree_config, ); info!("ledger is {}", leader_ledger_path); // Setup the cluster with a single node - let mut fullnode_config = FullnodeConfig::default(); - fullnode_config.leader_scheduler_config.ticks_per_slot = ticks_per_slot; - fullnode_config.leader_scheduler_config.slots_per_epoch = slots_per_epoch; - let mut tick_height_of_next_rotation = ticks_per_slot; if fullnode_config.leader_scheduler_config.ticks_per_slot == 1 { // Add another tick to the ledger if the cluster has been configured for 1 tick_per_slot. @@ -1776,13 +1822,9 @@ fn test_fullnode_rotate(ticks_per_slot: u64, slots_per_epoch: u64) { // 2) let entries = solana::entry::create_ticks(1, last_entry_id); - let blocktree = solana::blocktree::Blocktree::open_config( - &leader_ledger_path, - &fullnode_config.ledger_config(), - ) - .unwrap(); + let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap(); blocktree - .write_entries(1, 0, ticks_per_slot, 0, &entries) + .write_entries(1, 0, blocktree_config.ticks_per_slot, 0, &entries) .unwrap(); tick_height_of_next_rotation += 1; } diff --git a/tests/replicator.rs b/tests/replicator.rs index e9ab030ae..0fcbee259 100644 --- a/tests/replicator.rs +++ b/tests/replicator.rs @@ -6,9 +6,8 @@ extern crate log; extern crate serde_json; use bincode::deserialize; -use solana::blocktree::Blocktree; use solana::blocktree::{ - create_tmp_sample_ledger, get_tmp_ledger_path, tmp_copy_ledger, DEFAULT_SLOT_HEIGHT, + create_tmp_sample_ledger, get_tmp_ledger_path, tmp_copy_ledger, Blocktree, DEFAULT_SLOT_HEIGHT, }; use solana::client::mk_client; use solana::cluster_info::{ClusterInfo, Node, NodeInfo}; @@ -41,6 +40,8 @@ fn test_replicator_startup_basic() { let leader_ledger_path = "replicator_test_leader_ledger"; let mut fullnode_config = FullnodeConfig::default(); + let blocktree_config = fullnode_config.ledger_config(); + let ( mint_keypair, leader_ledger_path, @@ -54,11 +55,14 @@ fn test_replicator_startup_basic() { 0, leader_info.id, 42, - fullnode_config.leader_scheduler_config.ticks_per_slot, + &blocktree_config, ); - let validator_ledger_path = - tmp_copy_ledger(&leader_ledger_path, "replicator_test_validator_ledger"); + let validator_ledger_path = tmp_copy_ledger( + &leader_ledger_path, + "replicator_test_validator_ledger", + &blocktree_config, + ); { let voting_keypair = VotingKeypair::new_local(&leader_keypair); @@ -291,6 +295,7 @@ fn test_replicator_startup_ledger_hang() { let leader_ledger_path = "replicator_test_leader_ledger"; let fullnode_config = FullnodeConfig::default(); + let blocktree_config = fullnode_config.ledger_config(); let ( _mint_keypair, leader_ledger_path, @@ -304,11 +309,14 @@ fn test_replicator_startup_ledger_hang() { 0, leader_info.id, 42, - fullnode_config.leader_scheduler_config.ticks_per_slot, + &blocktree_config, ); - let validator_ledger_path = - tmp_copy_ledger(&leader_ledger_path, "replicator_test_validator_ledger"); + let validator_ledger_path = tmp_copy_ledger( + &leader_ledger_path, + "replicator_test_validator_ledger", + &blocktree_config, + ); { let voting_keypair = VotingKeypair::new_local(&leader_keypair);