Pass a BlocktreeConfig into all ledger helper functions
This commit is contained in:
parent
c474cf1eef
commit
6632c7026d
|
@ -75,6 +75,10 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||||
bootstrap_leader_vote_account_id: bootstrap_leader_vote_account_keypair.pubkey(),
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
|
||||||
use assert_cmd::prelude::*;
|
use assert_cmd::prelude::*;
|
||||||
|
@ -39,7 +39,7 @@ fn nominal() {
|
||||||
9,
|
9,
|
||||||
keypair.pubkey(),
|
keypair.pubkey(),
|
||||||
50,
|
50,
|
||||||
std::u64::MAX,
|
&BlocktreeConfig::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Basic validation
|
// Basic validation
|
||||||
|
|
|
@ -1278,12 +1278,13 @@ impl Iterator for EntryIterator {
|
||||||
pub fn create_new_ledger(
|
pub fn create_new_ledger(
|
||||||
ledger_path: &str,
|
ledger_path: &str,
|
||||||
genesis_block: &GenesisBlock,
|
genesis_block: &GenesisBlock,
|
||||||
|
config: &BlocktreeConfig,
|
||||||
) -> Result<(u64, u64, Hash)> {
|
) -> Result<(u64, u64, Hash)> {
|
||||||
Blocktree::destroy(ledger_path)?;
|
Blocktree::destroy(ledger_path)?;
|
||||||
genesis_block.write(&ledger_path)?;
|
genesis_block.write(&ledger_path)?;
|
||||||
|
|
||||||
// Add a single tick linked back to the genesis_block to bootstrap the ledger
|
// 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());
|
let entries = crate::entry::create_ticks(1, genesis_block.last_id());
|
||||||
blocktree.write_entries(DEFAULT_SLOT_HEIGHT, 0, std::u64::MAX, 0, &entries)?;
|
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,
|
num_extra_ticks: u64,
|
||||||
bootstrap_leader_id: Pubkey,
|
bootstrap_leader_id: Pubkey,
|
||||||
bootstrap_leader_tokens: u64,
|
bootstrap_leader_tokens: u64,
|
||||||
ticks_per_slot: u64,
|
config: &BlocktreeConfig,
|
||||||
) -> (Keypair, String, u64, u64, Hash, Hash) {
|
) -> (Keypair, String, u64, u64, Hash, Hash) {
|
||||||
let (genesis_block, mint_keypair) =
|
let (genesis_block, mint_keypair) =
|
||||||
GenesisBlock::new_with_leader(num_tokens, bootstrap_leader_id, bootstrap_leader_tokens);
|
GenesisBlock::new_with_leader(num_tokens, bootstrap_leader_id, bootstrap_leader_tokens);
|
||||||
let ledger_path = get_tmp_ledger_path(name);
|
let ledger_path = get_tmp_ledger_path(name);
|
||||||
let (mut entry_height, mut tick_height, mut last_entry_id) =
|
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();
|
let mut last_id = genesis_block.last_id();
|
||||||
if num_extra_ticks > 0 {
|
if num_extra_ticks > 0 {
|
||||||
let entries = crate::entry::create_ticks(num_extra_ticks, last_entry_id);
|
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
|
// create_new_ledger creates one beginning tick
|
||||||
tick_height += num_extra_ticks;
|
tick_height += num_extra_ticks;
|
||||||
|
@ -1352,7 +1353,7 @@ pub fn create_tmp_sample_ledger(
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
tick_height,
|
tick_height,
|
||||||
ticks_per_slot,
|
config.ticks_per_slot,
|
||||||
entry_height,
|
entry_height,
|
||||||
&entries,
|
&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 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 blobs = blocktree.read_ledger_blobs();
|
||||||
let genesis_block = GenesisBlock::load(from).unwrap();
|
let genesis_block = GenesisBlock::load(from).unwrap();
|
||||||
|
|
||||||
Blocktree::destroy(&path).expect("Expected successful database destruction");
|
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();
|
blocktree.write_blobs(blobs).unwrap();
|
||||||
genesis_block.write(&path).unwrap();
|
genesis_block.write(&path).unwrap();
|
||||||
|
|
||||||
|
|
|
@ -521,7 +521,9 @@ impl Service for Fullnode {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::blob_fetch_stage::BlobFetchStage;
|
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::make_consecutive_blobs;
|
||||||
use crate::entry::EntrySlice;
|
use crate::entry::EntrySlice;
|
||||||
use crate::gossip_service::{converge, make_listening_node};
|
use crate::gossip_service::{converge, make_listening_node};
|
||||||
|
@ -551,7 +553,7 @@ mod tests {
|
||||||
0,
|
0,
|
||||||
leader_keypair.pubkey(),
|
leader_keypair.pubkey(),
|
||||||
1000,
|
1000,
|
||||||
std::u64::MAX,
|
&BlocktreeConfig::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let validator = Fullnode::new(
|
let validator = Fullnode::new(
|
||||||
|
@ -589,7 +591,7 @@ mod tests {
|
||||||
0,
|
0,
|
||||||
leader_keypair.pubkey(),
|
leader_keypair.pubkey(),
|
||||||
1000,
|
1000,
|
||||||
std::u64::MAX,
|
&BlocktreeConfig::default(),
|
||||||
);
|
);
|
||||||
ledger_paths.push(validator_ledger_path.clone());
|
ledger_paths.push(validator_ledger_path.clone());
|
||||||
Fullnode::new(
|
Fullnode::new(
|
||||||
|
@ -634,6 +636,11 @@ mod tests {
|
||||||
let leader_scheduler_config =
|
let leader_scheduler_config =
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_length);
|
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 (
|
let (
|
||||||
_mint_keypair,
|
_mint_keypair,
|
||||||
bootstrap_leader_ledger_path,
|
bootstrap_leader_ledger_path,
|
||||||
|
@ -647,14 +654,10 @@ mod tests {
|
||||||
1,
|
1,
|
||||||
bootstrap_leader_keypair.pubkey(),
|
bootstrap_leader_keypair.pubkey(),
|
||||||
500,
|
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
|
// Start the bootstrap leader
|
||||||
let mut fullnode_config = FullnodeConfig::default();
|
|
||||||
fullnode_config.leader_scheduler_config = leader_scheduler_config;
|
|
||||||
let bootstrap_leader = Fullnode::new(
|
let bootstrap_leader = Fullnode::new(
|
||||||
bootstrap_leader_node,
|
bootstrap_leader_node,
|
||||||
&bootstrap_leader_keypair,
|
&bootstrap_leader_keypair,
|
||||||
|
@ -688,6 +691,7 @@ mod tests {
|
||||||
slots_per_epoch,
|
slots_per_epoch,
|
||||||
ticks_per_slot * slots_per_epoch,
|
ticks_per_slot * slots_per_epoch,
|
||||||
);
|
);
|
||||||
|
let blocktree_config = &fullnode_config.ledger_config();
|
||||||
|
|
||||||
// Create the leader and validator nodes
|
// Create the leader and validator nodes
|
||||||
let bootstrap_leader_keypair = Arc::new(Keypair::new());
|
let bootstrap_leader_keypair = Arc::new(Keypair::new());
|
||||||
|
@ -702,11 +706,15 @@ mod tests {
|
||||||
ticks_per_slot * 4,
|
ticks_per_slot * 4,
|
||||||
"test_wrong_role_transition",
|
"test_wrong_role_transition",
|
||||||
ticks_per_slot,
|
ticks_per_slot,
|
||||||
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
let bootstrap_leader_info = bootstrap_leader_node.info.clone();
|
let bootstrap_leader_info = bootstrap_leader_node.info.clone();
|
||||||
|
|
||||||
let validator_ledger_path =
|
let validator_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&bootstrap_leader_ledger_path, "test_wrong_role_transition");
|
&bootstrap_leader_ledger_path,
|
||||||
|
"test_wrong_role_transition",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
|
|
||||||
let ledger_paths = vec![
|
let ledger_paths = vec![
|
||||||
bootstrap_leader_ledger_path.clone(),
|
bootstrap_leader_ledger_path.clone(),
|
||||||
|
@ -759,6 +767,12 @@ mod tests {
|
||||||
let slots_per_epoch = 4;
|
let slots_per_epoch = 4;
|
||||||
let leader_keypair = Arc::new(Keypair::new());
|
let leader_keypair = Arc::new(Keypair::new());
|
||||||
let validator_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) =
|
let (leader_node, validator_node, validator_ledger_path, ledger_initial_len, last_id) =
|
||||||
setup_leader_validator(
|
setup_leader_validator(
|
||||||
&leader_keypair,
|
&leader_keypair,
|
||||||
|
@ -767,6 +781,7 @@ mod tests {
|
||||||
0,
|
0,
|
||||||
"test_validator_to_leader_transition",
|
"test_validator_to_leader_transition",
|
||||||
ticks_per_slot,
|
ticks_per_slot,
|
||||||
|
&fullnode_config.ledger_config(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let leader_id = leader_keypair.pubkey();
|
let leader_id = leader_keypair.pubkey();
|
||||||
|
@ -775,14 +790,6 @@ mod tests {
|
||||||
info!("leader: {:?}", leader_id);
|
info!("leader: {:?}", leader_id);
|
||||||
info!("validator: {:?}", validator_info.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);
|
let voting_keypair = VotingKeypair::new_local(&validator_keypair);
|
||||||
|
|
||||||
// Start the validator
|
// Start the validator
|
||||||
|
@ -860,18 +867,6 @@ mod tests {
|
||||||
info!("leader: {:?}", leader_keypair.pubkey());
|
info!("leader: {:?}", leader_keypair.pubkey());
|
||||||
info!("validator: {:?}", validator_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();
|
let mut fullnode_config = FullnodeConfig::default();
|
||||||
fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new(
|
fullnode_config.leader_scheduler_config = LeaderSchedulerConfig::new(
|
||||||
ticks_per_slot,
|
ticks_per_slot,
|
||||||
|
@ -881,6 +876,18 @@ mod tests {
|
||||||
let config = PohServiceConfig::Sleep(Duration::from_millis(200));
|
let config = PohServiceConfig::Sleep(Duration::from_millis(200));
|
||||||
fullnode_config.tick_config = config;
|
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");
|
info!("Start up a listener");
|
||||||
let blob_receiver_exit = Arc::new(AtomicBool::new(false));
|
let blob_receiver_exit = Arc::new(AtomicBool::new(false));
|
||||||
let (_, _, mut listening_node, _) = make_listening_node(&leader_node.info);
|
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
|
// 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)
|
let entries: Vec<_> = (0..3)
|
||||||
.flat_map(|slot_height| blocktree.get_slot_entries(slot_height, 0, None).unwrap())
|
.flat_map(|slot_height| blocktree.get_slot_entries(slot_height, 0, None).unwrap())
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -990,6 +999,7 @@ mod tests {
|
||||||
num_ending_ticks: u64,
|
num_ending_ticks: u64,
|
||||||
test_name: &str,
|
test_name: &str,
|
||||||
ticks_per_slot: u64,
|
ticks_per_slot: u64,
|
||||||
|
config: &BlocktreeConfig,
|
||||||
) -> (Node, Node, String, u64, Hash) {
|
) -> (Node, Node, String, u64, Hash) {
|
||||||
// Make a leader identity
|
// Make a leader identity
|
||||||
let leader_node = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
|
let leader_node = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
|
||||||
|
@ -1003,7 +1013,7 @@ mod tests {
|
||||||
num_genesis_ticks,
|
num_genesis_ticks,
|
||||||
leader_node.info.id,
|
leader_node.info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey());
|
let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey());
|
||||||
|
@ -1025,7 +1035,7 @@ mod tests {
|
||||||
num_ending_ticks,
|
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 active_set_entries_len = active_set_entries.len() as u64;
|
||||||
let last_id = active_set_entries.last().unwrap().id;
|
let last_id = active_set_entries.last().unwrap().id;
|
||||||
|
|
||||||
|
|
|
@ -387,13 +387,13 @@ mod test {
|
||||||
let my_node = Node::new_localhost_with_pubkey(my_id);
|
let my_node = Node::new_localhost_with_pubkey(my_id);
|
||||||
let cluster_info_me = ClusterInfo::new(my_node.info.clone());
|
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
|
// Set up the LeaderScheduler so that my_id becomes the leader for epoch 1
|
||||||
let ticks_per_slot = 16;
|
let ticks_per_slot = 16;
|
||||||
let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, 1, ticks_per_slot);
|
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
|
// Create a ledger
|
||||||
let (
|
let (
|
||||||
mint_keypair,
|
mint_keypair,
|
||||||
|
@ -408,7 +408,7 @@ mod test {
|
||||||
0,
|
0,
|
||||||
old_leader_id,
|
old_leader_id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&BlocktreeConfig::new(ticks_per_slot),
|
||||||
);
|
);
|
||||||
|
|
||||||
info!("my_id: {:?}", my_id);
|
info!("my_id: {:?}", my_id);
|
||||||
|
@ -539,7 +539,7 @@ mod test {
|
||||||
1,
|
1,
|
||||||
leader_id,
|
leader_id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&BlocktreeConfig::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Set up the cluster info
|
// Set up the cluster info
|
||||||
|
@ -608,6 +608,10 @@ mod test {
|
||||||
fn test_vote_error_replay_stage_leader_rotation() {
|
fn test_vote_error_replay_stage_leader_rotation() {
|
||||||
solana_logger::setup();
|
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
|
// Set up dummy node to host a ReplayStage
|
||||||
let my_keypair = Keypair::new();
|
let my_keypair = Keypair::new();
|
||||||
let my_id = my_keypair.pubkey();
|
let my_id = my_keypair.pubkey();
|
||||||
|
@ -616,8 +620,8 @@ mod test {
|
||||||
// Create keypair for the leader
|
// Create keypair for the leader
|
||||||
let leader_id = Keypair::new().pubkey();
|
let leader_id = Keypair::new().pubkey();
|
||||||
|
|
||||||
let ticks_per_slot = 10;
|
|
||||||
// Create the ledger
|
// Create the ledger
|
||||||
|
let blocktree_config = BlocktreeConfig::new(ticks_per_slot);
|
||||||
let (
|
let (
|
||||||
mint_keypair,
|
mint_keypair,
|
||||||
my_ledger_path,
|
my_ledger_path,
|
||||||
|
@ -631,7 +635,7 @@ mod test {
|
||||||
1,
|
1,
|
||||||
leader_id,
|
leader_id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let my_keypair = Arc::new(my_keypair);
|
let my_keypair = Arc::new(my_keypair);
|
||||||
|
@ -649,7 +653,7 @@ mod test {
|
||||||
);
|
);
|
||||||
let mut last_id = active_set_entries.last().unwrap().id;
|
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
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -661,8 +665,6 @@ mod test {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
let slots_per_epoch = 2;
|
|
||||||
let active_window_tick_length = ticks_per_slot * slots_per_epoch;
|
|
||||||
let leader_scheduler_config =
|
let leader_scheduler_config =
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_tick_length);
|
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 (rotation_tx, rotation_rx) = channel();
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
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) =
|
let (bank, _entry_height, last_entry_id, blocktree, l_sender, l_receiver) =
|
||||||
new_bank_from_ledger(&my_ledger_path, &blocktree_config, &leader_scheduler_config);
|
new_bank_from_ledger(&my_ledger_path, &blocktree_config, &leader_scheduler_config);
|
||||||
|
|
||||||
|
|
|
@ -432,11 +432,11 @@ impl Service for StorageStage {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::blocktree::create_tmp_sample_ledger;
|
use crate::blocktree::{
|
||||||
use crate::blocktree::{Blocktree, DEFAULT_SLOT_HEIGHT};
|
create_tmp_sample_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT,
|
||||||
use crate::entry::{make_tiny_test_entries, Entry};
|
};
|
||||||
|
|
||||||
use crate::cluster_info::{ClusterInfo, NodeInfo};
|
use crate::cluster_info::{ClusterInfo, NodeInfo};
|
||||||
|
use crate::entry::{make_tiny_test_entries, Entry};
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::storage_stage::StorageState;
|
use crate::storage_stage::StorageState;
|
||||||
use crate::storage_stage::NUM_IDENTITIES;
|
use crate::storage_stage::NUM_IDENTITIES;
|
||||||
|
@ -493,6 +493,7 @@ mod tests {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let ticks_per_slot = std::u64::MAX;
|
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) =
|
let (_mint, ledger_path, tick_height, genesis_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"storage_stage_process_entries",
|
"storage_stage_process_entries",
|
||||||
|
@ -500,11 +501,11 @@ mod tests {
|
||||||
1,
|
1,
|
||||||
Keypair::new().pubkey(),
|
Keypair::new().pubkey(),
|
||||||
1,
|
1,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let entries = make_tiny_test_entries(64);
|
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
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -570,6 +571,7 @@ mod tests {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let ticks_per_slot = std::u64::MAX;
|
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) =
|
let (_mint, ledger_path, tick_height, genesis_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"storage_stage_process_entries",
|
"storage_stage_process_entries",
|
||||||
|
@ -577,11 +579,11 @@ mod tests {
|
||||||
1,
|
1,
|
||||||
Keypair::new().pubkey(),
|
Keypair::new().pubkey(),
|
||||||
1,
|
1,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let entries = make_tiny_test_entries(128);
|
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
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
|
|
@ -487,7 +487,7 @@ pub fn new_fullnode(ledger_name: &'static str) -> (Fullnode, NodeInfo, Keypair,
|
||||||
0,
|
0,
|
||||||
node_info.id,
|
node_info.id,
|
||||||
42,
|
42,
|
||||||
fullnode_config.leader_scheduler_config.ticks_per_slot,
|
&fullnode_config.ledger_config(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let vote_account_keypair = Arc::new(Keypair::new());
|
let vote_account_keypair = Arc::new(Keypair::new());
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana::blob_fetch_stage::BlobFetchStage;
|
use solana::blob_fetch_stage::BlobFetchStage;
|
||||||
use solana::blocktree::{create_tmp_sample_ledger, tmp_copy_ledger};
|
use solana::blocktree::{
|
||||||
use solana::blocktree::{Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT};
|
create_tmp_sample_ledger, tmp_copy_ledger, Blocktree, BlocktreeConfig, DEFAULT_SLOT_HEIGHT,
|
||||||
|
};
|
||||||
use solana::client::mk_client;
|
use solana::client::mk_client;
|
||||||
use solana::cluster_info::{Node, NodeInfo};
|
use solana::cluster_info::{Node, NodeInfo};
|
||||||
use solana::entry::{reconstruct_entries_from_blobs, Entry};
|
use solana::entry::{reconstruct_entries_from_blobs, Entry};
|
||||||
|
@ -25,8 +26,9 @@ use std::sync::{Arc, RwLock};
|
||||||
use std::thread::{sleep, Builder};
|
use std::thread::{sleep, Builder};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
fn read_ledger(ledger_path: &str) -> Vec<Entry> {
|
fn read_ledger(ledger_path: &str, blocktree_config: &BlocktreeConfig) -> Vec<Entry> {
|
||||||
let ledger = Blocktree::open(&ledger_path).expect("Unable to open ledger");
|
let ledger =
|
||||||
|
Blocktree::open_config(&ledger_path, blocktree_config).expect("Unable to open ledger");
|
||||||
ledger
|
ledger
|
||||||
.read_ledger()
|
.read_ledger()
|
||||||
.expect("Unable to 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 mut ledger_paths = Vec::new();
|
||||||
|
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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 (
|
let (
|
||||||
alice,
|
alice,
|
||||||
|
@ -59,21 +65,23 @@ fn test_multi_node_ledger_window() -> result::Result<()> {
|
||||||
0,
|
0,
|
||||||
leader_data.id,
|
leader_data.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(leader_ledger_path.clone());
|
ledger_paths.push(leader_ledger_path.clone());
|
||||||
|
|
||||||
// make a copy at zero
|
// 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());
|
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
|
// Write some into leader's ledger, this should populate the leader's window
|
||||||
// and force it to respond to repair from the ledger window
|
// and force it to respond to repair from the ledger window
|
||||||
// TODO: write out more than slot 0
|
// 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(
|
let entries = solana::entry::create_ticks(
|
||||||
fullnode_config.leader_scheduler_config.ticks_per_slot - last_entry_height - 1,
|
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(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
tick_height,
|
tick_height,
|
||||||
ticks_per_slot,
|
blocktree_config.ticks_per_slot,
|
||||||
last_entry_height,
|
last_entry_height,
|
||||||
&entries,
|
&entries,
|
||||||
)
|
)
|
||||||
|
@ -182,8 +190,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> {
|
||||||
let mut ledger_paths = Vec::new();
|
let mut ledger_paths = Vec::new();
|
||||||
|
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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) =
|
let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"multi_node_validator_catchup_from_zero",
|
"multi_node_validator_catchup_from_zero",
|
||||||
|
@ -191,19 +198,21 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> {
|
||||||
0,
|
0,
|
||||||
leader_data.id,
|
leader_data.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(genesis_ledger_path.clone());
|
ledger_paths.push(genesis_ledger_path.clone());
|
||||||
|
|
||||||
let zero_ledger_path = tmp_copy_ledger(
|
let zero_ledger_path = tmp_copy_ledger(
|
||||||
&genesis_ledger_path,
|
&genesis_ledger_path,
|
||||||
"multi_node_validator_catchup_from_zero",
|
"multi_node_validator_catchup_from_zero",
|
||||||
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(zero_ledger_path.clone());
|
ledger_paths.push(zero_ledger_path.clone());
|
||||||
|
|
||||||
let leader_ledger_path = tmp_copy_ledger(
|
let leader_ledger_path = tmp_copy_ledger(
|
||||||
&genesis_ledger_path,
|
&genesis_ledger_path,
|
||||||
"multi_node_validator_catchup_from_zero",
|
"multi_node_validator_catchup_from_zero",
|
||||||
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(leader_ledger_path.clone());
|
ledger_paths.push(leader_ledger_path.clone());
|
||||||
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
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(
|
let ledger_path = tmp_copy_ledger(
|
||||||
&genesis_ledger_path,
|
&genesis_ledger_path,
|
||||||
"multi_node_validator_catchup_from_zero_validator",
|
"multi_node_validator_catchup_from_zero_validator",
|
||||||
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(ledger_path.clone());
|
ledger_paths.push(ledger_path.clone());
|
||||||
|
|
||||||
|
@ -375,8 +385,7 @@ fn test_multi_node_basic() {
|
||||||
let mut ledger_paths = Vec::new();
|
let mut ledger_paths = Vec::new();
|
||||||
|
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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) =
|
let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"multi_node_basic",
|
"multi_node_basic",
|
||||||
|
@ -384,11 +393,12 @@ fn test_multi_node_basic() {
|
||||||
0,
|
0,
|
||||||
leader_data.id,
|
leader_data.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(genesis_ledger_path.clone());
|
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());
|
ledger_paths.push(leader_ledger_path.clone());
|
||||||
|
|
||||||
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
||||||
|
@ -406,7 +416,8 @@ fn test_multi_node_basic() {
|
||||||
let keypair = Arc::new(Keypair::new());
|
let keypair = Arc::new(Keypair::new());
|
||||||
let validator_pubkey = keypair.pubkey().clone();
|
let validator_pubkey = keypair.pubkey().clone();
|
||||||
let validator = Node::new_localhost_with_pubkey(keypair.pubkey());
|
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());
|
ledger_paths.push(ledger_path.clone());
|
||||||
|
|
||||||
// Send each validator some tokens to vote
|
// 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 mut ledger_paths = Vec::new();
|
||||||
|
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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) =
|
let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"boot_validator_from_file",
|
"boot_validator_from_file",
|
||||||
|
@ -493,11 +504,12 @@ fn test_boot_validator_from_file() -> result::Result<()> {
|
||||||
0,
|
0,
|
||||||
leader_pubkey,
|
leader_pubkey,
|
||||||
1000,
|
1000,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
ledger_paths.push(genesis_ledger_path.clone());
|
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());
|
ledger_paths.push(leader_ledger_path.clone());
|
||||||
|
|
||||||
let leader_data = leader.info.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 keypair = Arc::new(Keypair::new());
|
||||||
let validator = Node::new_localhost_with_pubkey(keypair.pubkey());
|
let validator = Node::new_localhost_with_pubkey(keypair.pubkey());
|
||||||
let validator_data = validator.info.clone();
|
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());
|
ledger_paths.push(ledger_path.clone());
|
||||||
let voting_keypair = VotingKeypair::new_local(&keypair);
|
let voting_keypair = VotingKeypair::new_local(&keypair);
|
||||||
let val_fullnode = Fullnode::new(
|
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)
|
// ledger (currently up to WINDOW_SIZE entries)
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
|
let blocktree_config = BlocktreeConfig::default();
|
||||||
let leader_keypair = Arc::new(Keypair::new());
|
let leader_keypair = Arc::new(Keypair::new());
|
||||||
let initial_leader_balance = 500;
|
let initial_leader_balance = 500;
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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) =
|
let (alice, ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"leader_restart_validator_start_from_old_ledger",
|
"leader_restart_validator_start_from_old_ledger",
|
||||||
|
@ -581,7 +597,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> {
|
||||||
0,
|
0,
|
||||||
leader_keypair.pubkey(),
|
leader_keypair.pubkey(),
|
||||||
initial_leader_balance,
|
initial_leader_balance,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
let bob_pubkey = Keypair::new().pubkey();
|
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(
|
let stale_ledger_path = tmp_copy_ledger(
|
||||||
&ledger_path,
|
&ledger_path,
|
||||||
"leader_restart_validator_start_from_old_ledger",
|
"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 leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
|
||||||
let bob_pubkey = Keypair::new().pubkey();
|
let bob_pubkey = Keypair::new().pubkey();
|
||||||
let fullnode_config = FullnodeConfig::default();
|
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) =
|
let (alice, genesis_ledger_path, _tick_height, _last_entry_height, _last_id, _last_entry_id) =
|
||||||
create_tmp_sample_ledger(
|
create_tmp_sample_ledger(
|
||||||
"multi_node_dynamic_network",
|
"multi_node_dynamic_network",
|
||||||
|
@ -694,13 +711,17 @@ fn test_multi_node_dynamic_network() {
|
||||||
0,
|
0,
|
||||||
leader_pubkey,
|
leader_pubkey,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut ledger_paths = Vec::new();
|
let mut ledger_paths = Vec::new();
|
||||||
ledger_paths.push(genesis_ledger_path.clone());
|
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 alice_arc = Arc::new(RwLock::new(alice));
|
||||||
let leader_data = leader.info.clone();
|
let leader_data = leader.info.clone();
|
||||||
|
@ -769,7 +790,11 @@ fn test_multi_node_dynamic_network() {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|keypair| {
|
.map(|keypair| {
|
||||||
let leader_data = leader_data.clone();
|
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());
|
ledger_paths.push(ledger_path.clone());
|
||||||
Builder::new()
|
Builder::new()
|
||||||
.name("validator-launch-thread".to_string())
|
.name("validator-launch-thread".to_string())
|
||||||
|
@ -907,6 +932,7 @@ fn test_leader_to_validator_transition() {
|
||||||
// height 1 will be considered.
|
// height 1 will be considered.
|
||||||
ticks_per_slot,
|
ticks_per_slot,
|
||||||
);
|
);
|
||||||
|
let blocktree_config = fullnode_config.ledger_config();
|
||||||
|
|
||||||
// Initialize the leader ledger. Make a mint and a genesis entry
|
// Initialize the leader ledger. Make a mint and a genesis entry
|
||||||
// in the leader ledger
|
// in the leader ledger
|
||||||
|
@ -923,7 +949,7 @@ fn test_leader_to_validator_transition() {
|
||||||
0,
|
0,
|
||||||
leader_info.id,
|
leader_info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Write the votes entries to the ledger that will cause leader rotation
|
// Write the votes entries to the ledger that will cause leader rotation
|
||||||
|
@ -938,7 +964,7 @@ fn test_leader_to_validator_transition() {
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
{
|
{
|
||||||
let blocktree = Blocktree::open(&leader_ledger_path).unwrap();
|
let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap();
|
||||||
blocktree
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -1021,6 +1047,7 @@ fn test_leader_validator_basic() {
|
||||||
1, // 1 slot per epoch
|
1, // 1 slot per epoch
|
||||||
ticks_per_slot,
|
ticks_per_slot,
|
||||||
);
|
);
|
||||||
|
let blocktree_config = fullnode_config.ledger_config();
|
||||||
|
|
||||||
// Make a common mint and a genesis entry for both leader + validator ledgers
|
// Make a common mint and a genesis entry for both leader + validator ledgers
|
||||||
let (
|
let (
|
||||||
|
@ -1036,7 +1063,7 @@ fn test_leader_validator_basic() {
|
||||||
0,
|
0,
|
||||||
leader_info.id,
|
leader_info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add validator vote on tick height 1
|
// Add validator vote on tick height 1
|
||||||
|
@ -1050,7 +1077,7 @@ fn test_leader_validator_basic() {
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
{
|
{
|
||||||
let blocktree = Blocktree::open(&leader_ledger_path).unwrap();
|
let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap();
|
||||||
blocktree
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -1065,7 +1092,11 @@ fn test_leader_validator_basic() {
|
||||||
// Initialize both leader + validator ledger
|
// Initialize both leader + validator ledger
|
||||||
let mut ledger_paths = Vec::new();
|
let mut ledger_paths = Vec::new();
|
||||||
ledger_paths.push(leader_ledger_path.clone());
|
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());
|
ledger_paths.push(validator_ledger_path.clone());
|
||||||
|
|
||||||
// Start the validator node
|
// 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
|
// 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
|
// and that the old leader and the new leader's ledgers agree up to the point
|
||||||
// of leader rotation
|
// of leader rotation
|
||||||
let validator_entries: Vec<Entry> = read_ledger(&validator_ledger_path);
|
let validator_entries: Vec<Entry> = 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);
|
assert!(leader_entries.len() as u64 >= ticks_per_slot);
|
||||||
|
|
||||||
for (v, l) in validator_entries.iter().zip(leader_entries) {
|
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();
|
let mut fullnode_config = FullnodeConfig::default();
|
||||||
fullnode_config.leader_scheduler_config =
|
fullnode_config.leader_scheduler_config =
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, ticks_per_epoch);
|
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
|
// Make a common mint and a genesis entry for both leader + validator's ledgers
|
||||||
let num_ending_ticks = 1;
|
let num_ending_ticks = 1;
|
||||||
|
@ -1189,7 +1221,7 @@ fn test_dropped_handoff_recovery() {
|
||||||
num_ending_ticks,
|
num_ending_ticks,
|
||||||
bootstrap_leader_info.id,
|
bootstrap_leader_info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create the validator keypair that will be the next leader in line
|
// Create the validator keypair that will be the next leader in line
|
||||||
|
@ -1215,7 +1247,7 @@ fn test_dropped_handoff_recovery() {
|
||||||
|
|
||||||
// Write the entries
|
// Write the entries
|
||||||
{
|
{
|
||||||
let blocktree = Blocktree::open(&genesis_ledger_path).unwrap();
|
let blocktree = Blocktree::open_config(&genesis_ledger_path, &blocktree_config).unwrap();
|
||||||
blocktree
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -1227,8 +1259,11 @@ fn test_dropped_handoff_recovery() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
let next_leader_ledger_path =
|
let next_leader_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery");
|
&genesis_ledger_path,
|
||||||
|
"test_dropped_handoff_recovery",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
ledger_paths.push(next_leader_ledger_path.clone());
|
ledger_paths.push(next_leader_ledger_path.clone());
|
||||||
|
|
||||||
info!("bootstrap_leader: {}", bootstrap_leader_keypair.pubkey());
|
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);
|
let voting_keypair = VotingKeypair::new_local(&bootstrap_leader_keypair);
|
||||||
// Start up the bootstrap leader fullnode
|
// Start up the bootstrap leader fullnode
|
||||||
let bootstrap_leader_ledger_path =
|
let bootstrap_leader_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery");
|
&genesis_ledger_path,
|
||||||
|
"test_dropped_handoff_recovery",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
ledger_paths.push(bootstrap_leader_ledger_path.clone());
|
ledger_paths.push(bootstrap_leader_ledger_path.clone());
|
||||||
|
|
||||||
let bootstrap_leader = Fullnode::new(
|
let bootstrap_leader = Fullnode::new(
|
||||||
|
@ -1255,8 +1293,11 @@ fn test_dropped_handoff_recovery() {
|
||||||
// Start up the validators other than the "next_leader" validator
|
// Start up the validators other than the "next_leader" validator
|
||||||
for i in 0..(N - 1) {
|
for i in 0..(N - 1) {
|
||||||
let keypair = Arc::new(Keypair::new());
|
let keypair = Arc::new(Keypair::new());
|
||||||
let validator_ledger_path =
|
let validator_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&genesis_ledger_path, "test_dropped_handoff_recovery");
|
&genesis_ledger_path,
|
||||||
|
"test_dropped_handoff_recovery",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
ledger_paths.push(validator_ledger_path.clone());
|
ledger_paths.push(validator_ledger_path.clone());
|
||||||
let validator_id = keypair.pubkey();
|
let validator_id = keypair.pubkey();
|
||||||
info!("validator {}: {}", i, validator_id);
|
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 bootstrap_leader_info = bootstrap_leader_node.info.clone();
|
||||||
|
|
||||||
let mut node_keypairs = VecDeque::new();
|
let mut node_keypairs = VecDeque::new();
|
||||||
|
let blocktree_config = BlocktreeConfig::default();
|
||||||
|
|
||||||
// Create the validator keypairs
|
// Create the validator keypairs
|
||||||
for _ in 0..N {
|
for _ in 0..N {
|
||||||
|
@ -1365,7 +1407,7 @@ fn test_full_leader_validator_network() {
|
||||||
num_ending_ticks,
|
num_ending_ticks,
|
||||||
bootstrap_leader_info.id,
|
bootstrap_leader_info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create a common ledger with entries in the beginnging that will add all the validators
|
// 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")
|
.expect("expected at least one genesis entry")
|
||||||
.id;
|
.id;
|
||||||
{
|
{
|
||||||
let blocktree = Blocktree::open(&bootstrap_leader_ledger_path).unwrap();
|
let blocktree =
|
||||||
|
Blocktree::open_config(&bootstrap_leader_ledger_path, &blocktree_config).unwrap();
|
||||||
blocktree
|
blocktree
|
||||||
.write_entries(
|
.write_entries(
|
||||||
DEFAULT_SLOT_HEIGHT,
|
DEFAULT_SLOT_HEIGHT,
|
||||||
|
@ -1414,6 +1457,7 @@ fn test_full_leader_validator_network() {
|
||||||
let validator_ledger_path = tmp_copy_ledger(
|
let validator_ledger_path = tmp_copy_ledger(
|
||||||
&bootstrap_leader_ledger_path,
|
&bootstrap_leader_ledger_path,
|
||||||
"test_full_leader_validator_network",
|
"test_full_leader_validator_network",
|
||||||
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
ledger_paths.push(validator_ledger_path.clone());
|
ledger_paths.push(validator_ledger_path.clone());
|
||||||
|
@ -1484,7 +1528,7 @@ fn test_full_leader_validator_network() {
|
||||||
let mut node_entries = vec![];
|
let mut node_entries = vec![];
|
||||||
info!("Check that all the ledgers match");
|
info!("Check that all the ledgers match");
|
||||||
for ledger_path in ledger_paths.iter() {
|
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());
|
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);
|
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, ticks_per_epoch);
|
||||||
|
|
||||||
// Create leader ledger
|
// Create leader ledger
|
||||||
|
let blocktree_config = BlocktreeConfig::default();
|
||||||
let (
|
let (
|
||||||
_mint_keypair,
|
_mint_keypair,
|
||||||
bootstrap_leader_ledger_path,
|
bootstrap_leader_ledger_path,
|
||||||
|
@ -1579,7 +1624,7 @@ fn test_broadcast_last_tick() {
|
||||||
0,
|
0,
|
||||||
bootstrap_leader_info.id,
|
bootstrap_leader_info.id,
|
||||||
500,
|
500,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let genesis_ledger_len = genesis_entry_height;
|
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
|
// 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 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);
|
assert!(entries.len() >= last_tick_entry_index + 1);
|
||||||
let expected_last_tick = &entries[last_tick_entry_index];
|
let expected_last_tick = &entries[last_tick_entry_index];
|
||||||
debug!("last_tick_entry_index: {:?}", 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
|
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_keypair = Arc::new(Keypair::new());
|
||||||
let leader_pubkey = leader_keypair.pubkey().clone();
|
let leader_pubkey = leader_keypair.pubkey().clone();
|
||||||
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
|
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,
|
0,
|
||||||
leader_pubkey,
|
leader_pubkey,
|
||||||
123,
|
123,
|
||||||
ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
info!("ledger is {}", leader_ledger_path);
|
info!("ledger is {}", leader_ledger_path);
|
||||||
|
|
||||||
// Setup the cluster with a single node
|
// 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;
|
let mut tick_height_of_next_rotation = ticks_per_slot;
|
||||||
if fullnode_config.leader_scheduler_config.ticks_per_slot == 1 {
|
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.
|
// 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)
|
// 2)
|
||||||
let entries = solana::entry::create_ticks(1, last_entry_id);
|
let entries = solana::entry::create_ticks(1, last_entry_id);
|
||||||
|
|
||||||
let blocktree = solana::blocktree::Blocktree::open_config(
|
let blocktree = Blocktree::open_config(&leader_ledger_path, &blocktree_config).unwrap();
|
||||||
&leader_ledger_path,
|
|
||||||
&fullnode_config.ledger_config(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
blocktree
|
blocktree
|
||||||
.write_entries(1, 0, ticks_per_slot, 0, &entries)
|
.write_entries(1, 0, blocktree_config.ticks_per_slot, 0, &entries)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
tick_height_of_next_rotation += 1;
|
tick_height_of_next_rotation += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,8 @@ extern crate log;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
use bincode::deserialize;
|
use bincode::deserialize;
|
||||||
use solana::blocktree::Blocktree;
|
|
||||||
use solana::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::client::mk_client;
|
||||||
use solana::cluster_info::{ClusterInfo, Node, NodeInfo};
|
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 leader_ledger_path = "replicator_test_leader_ledger";
|
||||||
let mut fullnode_config = FullnodeConfig::default();
|
let mut fullnode_config = FullnodeConfig::default();
|
||||||
|
let blocktree_config = fullnode_config.ledger_config();
|
||||||
|
|
||||||
let (
|
let (
|
||||||
mint_keypair,
|
mint_keypair,
|
||||||
leader_ledger_path,
|
leader_ledger_path,
|
||||||
|
@ -54,11 +55,14 @@ fn test_replicator_startup_basic() {
|
||||||
0,
|
0,
|
||||||
leader_info.id,
|
leader_info.id,
|
||||||
42,
|
42,
|
||||||
fullnode_config.leader_scheduler_config.ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let validator_ledger_path =
|
let validator_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&leader_ledger_path, "replicator_test_validator_ledger");
|
&leader_ledger_path,
|
||||||
|
"replicator_test_validator_ledger",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
|
|
||||||
{
|
{
|
||||||
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
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 leader_ledger_path = "replicator_test_leader_ledger";
|
||||||
let fullnode_config = FullnodeConfig::default();
|
let fullnode_config = FullnodeConfig::default();
|
||||||
|
let blocktree_config = fullnode_config.ledger_config();
|
||||||
let (
|
let (
|
||||||
_mint_keypair,
|
_mint_keypair,
|
||||||
leader_ledger_path,
|
leader_ledger_path,
|
||||||
|
@ -304,11 +309,14 @@ fn test_replicator_startup_ledger_hang() {
|
||||||
0,
|
0,
|
||||||
leader_info.id,
|
leader_info.id,
|
||||||
42,
|
42,
|
||||||
fullnode_config.leader_scheduler_config.ticks_per_slot,
|
&blocktree_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
let validator_ledger_path =
|
let validator_ledger_path = tmp_copy_ledger(
|
||||||
tmp_copy_ledger(&leader_ledger_path, "replicator_test_validator_ledger");
|
&leader_ledger_path,
|
||||||
|
"replicator_test_validator_ledger",
|
||||||
|
&blocktree_config,
|
||||||
|
);
|
||||||
|
|
||||||
{
|
{
|
||||||
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
let voting_keypair = VotingKeypair::new_local(&leader_keypair);
|
||||||
|
|
Loading…
Reference in New Issue