Pass a BlocktreeConfig into all ledger helper functions

This commit is contained in:
Michael Vines
2019-02-12 10:01:35 -08:00
parent c474cf1eef
commit 6632c7026d
9 changed files with 200 additions and 132 deletions

View File

@@ -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<Entry> {
let ledger = Blocktree::open(&ledger_path).expect("Unable to open ledger");
fn read_ledger(ledger_path: &str, blocktree_config: &BlocktreeConfig) -> Vec<Entry> {
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<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);
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;
}

View File

@@ -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);