create_tmp_sample_ledger() now returns entry_height and last_id

This commit is contained in:
Michael Vines 2019-01-29 20:57:38 -08:00
parent 883fc39c80
commit 8cc1cde0fe
6 changed files with 155 additions and 222 deletions

View File

@ -32,7 +32,7 @@ fn bad_arguments() {
#[test] #[test]
fn nominal() { fn nominal() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let (_genesis_block, _mint, ledger_path, _genesis_entries) = let (_, _, ledger_path, _, _) =
create_tmp_sample_ledger("test_ledger_tool_nominal", 100, 10, keypair.pubkey(), 50); create_tmp_sample_ledger("test_ledger_tool_nominal", 100, 10, keypair.pubkey(), 50);
// Basic validation // Basic validation

View File

@ -830,11 +830,11 @@ impl Iterator for EntryIterator {
} }
} }
pub fn create_empty_ledger(ledger_path: &str, genesis_block: &GenesisBlock) -> Result<()> { pub fn create_empty_ledger(ledger_path: &str, genesis_block: &GenesisBlock) -> Result<(u64, Hash)> {
DbLedger::destroy(ledger_path)?; DbLedger::destroy(ledger_path)?;
DbLedger::open(ledger_path)?; DbLedger::open(ledger_path)?;
genesis_block.write(&ledger_path)?; genesis_block.write(&ledger_path)?;
Ok(()) Ok((0, genesis_block.last_id()))
} }
pub fn genesis<'a, I>(ledger_path: &str, keypair: &Keypair, entries: I) -> Result<()> pub fn genesis<'a, I>(ledger_path: &str, keypair: &Keypair, entries: I) -> Result<()>
@ -898,19 +898,23 @@ pub fn create_tmp_sample_ledger(
num_ending_ticks: u64, num_ending_ticks: u64,
bootstrap_leader_id: Pubkey, bootstrap_leader_id: Pubkey,
bootstrap_leader_tokens: u64, bootstrap_leader_tokens: u64,
) -> (GenesisBlock, Keypair, String, Vec<Entry>) { ) -> (GenesisBlock, Keypair, String, u64, 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 path = get_tmp_ledger_path(name); let path = get_tmp_ledger_path(name);
create_empty_ledger(&path, &genesis_block).unwrap(); let (mut entry_height, mut last_id) = create_empty_ledger(&path, &genesis_block).unwrap();
let entries = crate::entry::create_ticks(num_ending_ticks, genesis_block.last_id()); if num_ending_ticks > 0 {
let entries = crate::entry::create_ticks(num_ending_ticks, last_id);
let db_ledger = DbLedger::open(&path).unwrap(); let db_ledger = DbLedger::open(&path).unwrap();
db_ledger db_ledger
.write_entries(DEFAULT_SLOT_HEIGHT, 0, &entries) .write_entries(DEFAULT_SLOT_HEIGHT, entry_height, &entries)
.unwrap(); .unwrap();
(genesis_block, mint_keypair, path, entries) entry_height += entries.len() as u64;
last_id = entries.last().unwrap().id
}
(genesis_block, mint_keypair, path, entry_height, last_id)
} }
pub fn tmp_copy_ledger(from: &str, name: &str) -> String { pub fn tmp_copy_ledger(from: &str, name: &str) -> String {

View File

@ -531,20 +531,20 @@ mod tests {
let bootstrap_leader_info = bootstrap_leader_node.info.clone(); let bootstrap_leader_info = bootstrap_leader_node.info.clone();
// Make a mint and a genesis entries for leader ledger // Make a mint and a genesis entries for leader ledger
let num_ending_ticks = 1; let (
let (_genesis_block, _mint_keypair, bootstrap_leader_ledger_path, genesis_entries) = _genesis_block,
create_tmp_sample_ledger( _mint_keypair,
bootstrap_leader_ledger_path,
_genesis_entry_height,
_last_id,
) = create_tmp_sample_ledger(
"test_leader_to_leader_transition", "test_leader_to_leader_transition",
10_000, 10_000,
num_ending_ticks, 1,
bootstrap_leader_keypair.pubkey(), bootstrap_leader_keypair.pubkey(),
500, 500,
); );
let initial_tick_height = genesis_entries
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
// Create the common leader scheduling configuration // Create the common leader scheduling configuration
let num_slots_per_epoch = 3; let num_slots_per_epoch = 3;
let leader_rotation_interval = 5; let leader_rotation_interval = 5;
@ -556,9 +556,8 @@ mod tests {
// choices in the active set, this leader will remain the leader in the next // choices in the active set, this leader will remain the leader in the next
// epoch. In the next epoch, check that the same leader knows to shut down and // epoch. In the next epoch, check that the same leader knows to shut down and
// restart as a leader again. // restart as a leader again.
let bootstrap_height = initial_tick_height + 1;
let leader_scheduler_config = LeaderSchedulerConfig::new( let leader_scheduler_config = LeaderSchedulerConfig::new(
bootstrap_height as u64, 2,
leader_rotation_interval, leader_rotation_interval,
seed_rotation_interval, seed_rotation_interval,
active_window_length, active_window_length,
@ -591,6 +590,8 @@ mod tests {
#[test] #[test]
fn test_wrong_role_transition() { fn test_wrong_role_transition() {
solana_logger::setup();
// Create the leader node information // Create the leader node information
let bootstrap_leader_keypair = Arc::new(Keypair::new()); let bootstrap_leader_keypair = Arc::new(Keypair::new());
let bootstrap_leader_node = let bootstrap_leader_node =
@ -602,43 +603,32 @@ mod tests {
let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey()); let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey());
// 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 = 3; let (
let (_genesis_block, mint_keypair, bootstrap_leader_ledger_path, genesis_entries) = _genesis_block,
create_tmp_sample_ledger( mint_keypair,
bootstrap_leader_ledger_path,
genesis_entry_height,
last_id,
) = create_tmp_sample_ledger(
"test_wrong_role_transition", "test_wrong_role_transition",
10_000, 10_000,
num_ending_ticks, 0,
bootstrap_leader_keypair.pubkey(), bootstrap_leader_keypair.pubkey(),
500, 500,
); );
let last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
// Write the entries to the ledger that will cause leader rotation // Write the entries to the ledger that will cause leader rotation
// after the bootstrap height // after the bootstrap height
let validator_keypair = Arc::new(validator_keypair); let validator_keypair = Arc::new(validator_keypair);
let (active_set_entries, validator_vote_account_id) = make_active_set_entries( let (active_set_entries, _) =
&validator_keypair, make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 10);
&mint_keypair,
&last_id,
&last_id,
num_ending_ticks,
);
let genesis_tick_height = genesis_entries
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64)
+ num_ending_ticks as u64;
{ {
let db_ledger = DbLedger::open(&bootstrap_leader_ledger_path).unwrap(); let db_ledger = DbLedger::open(&bootstrap_leader_ledger_path).unwrap();
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
@ -652,30 +642,26 @@ mod tests {
]; ];
// Create the common leader scheduling configuration // Create the common leader scheduling configuration
let num_slots_per_epoch = 3; let leader_rotation_interval = 3;
let leader_rotation_interval = 5;
let seed_rotation_interval = num_slots_per_epoch * leader_rotation_interval;
// Set the bootstrap height exactly the current tick height, so that we can // Set the bootstrap height exactly the current tick height, so that we can
// test if the bootstrap leader knows to immediately transition to a validator // test if the bootstrap leader knows to immediately transition to a validator
// after parsing the ledger during startup // after parsing the ledger during startup
let bootstrap_height = genesis_tick_height;
let leader_scheduler_config = LeaderSchedulerConfig::new( let leader_scheduler_config = LeaderSchedulerConfig::new(
bootstrap_height, 1,
leader_rotation_interval, leader_rotation_interval,
seed_rotation_interval, leader_rotation_interval,
genesis_tick_height, leader_rotation_interval * 10,
); );
{ {
// Test that a node knows to transition to a validator based on parsing the ledger // Test that a node knows to transition to a validator based on parsing the ledger
let vote_signer = VoteSignerProxy::new_local(&bootstrap_leader_keypair);
let bootstrap_leader = Fullnode::new( let bootstrap_leader = Fullnode::new(
bootstrap_leader_node, bootstrap_leader_node,
bootstrap_leader_keypair, bootstrap_leader_keypair,
&bootstrap_leader_ledger_path, &bootstrap_leader_ledger_path,
Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))),
Some(Arc::new(vote_signer)), None,
Some(&bootstrap_leader_info), Some(&bootstrap_leader_info),
Default::default(), Default::default(),
); );
@ -688,7 +674,7 @@ mod tests {
validator_keypair, validator_keypair,
&validator_ledger_path, &validator_ledger_path,
Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))), Arc::new(RwLock::new(LeaderScheduler::new(&leader_scheduler_config))),
Some(Arc::new(validator_vote_account_id)), None,
Some(&bootstrap_leader_info), Some(&bootstrap_leader_info),
Default::default(), Default::default(),
); );
@ -714,12 +700,11 @@ mod tests {
let leader_id = leader_node.info.id; let leader_id = leader_node.info.id;
// Create validator identity // Create validator identity
let num_ending_ticks = 1; let (_genesis_block, mint_keypair, validator_ledger_path, genesis_entry_height, last_id) =
let (_genesis_block, mint_keypair, validator_ledger_path, genesis_entries) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_validator_to_leader_transition", "test_validator_to_leader_transition",
10_000, 10_000,
num_ending_ticks, 1,
leader_id, leader_id,
500, 500,
); );
@ -728,11 +713,6 @@ mod tests {
let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey()); let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey());
let validator_info = validator_node.info.clone(); let validator_info = validator_node.info.clone();
let mut last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
let validator_keypair = Arc::new(validator_keypair); let validator_keypair = Arc::new(validator_keypair);
// Write two entries so that the validator is in the active set: // Write two entries so that the validator is in the active set:
// //
@ -741,27 +721,23 @@ mod tests {
// after the bootstrap height // after the bootstrap height
// //
// 2) A vote from the validator // 2) A vote from the validator
let (active_set_entries, _validator_vote_account_id) = let (active_set_entries, _) =
make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0); make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0);
let initial_tick_height = genesis_entries
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let initial_non_tick_height = genesis_entries.len() as u64 - initial_tick_height;
let active_set_entries_len = active_set_entries.len() as u64; let active_set_entries_len = active_set_entries.len() as u64;
last_id = active_set_entries.last().unwrap().id; let last_id = active_set_entries.last().unwrap().id;
{ {
let db_ledger = DbLedger::open(&validator_ledger_path).unwrap(); let db_ledger = DbLedger::open(&validator_ledger_path).unwrap();
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
} }
let ledger_initial_len = genesis_entries.len() as u64 + active_set_entries_len; let ledger_initial_len = genesis_entry_height + active_set_entries_len;
// Set the leader scheduler for the validator // Set the leader scheduler for the validator
let leader_rotation_interval = 16; let leader_rotation_interval = 16;
@ -850,9 +826,7 @@ mod tests {
assert!(bank.tick_height() >= bootstrap_height); assert!(bank.tick_height() >= bootstrap_height);
// Only the first genesis entry has num_hashes = 0, every other entry // Only the first genesis entry has num_hashes = 0, every other entry
// had num_hashes = 1 // had num_hashes = 1
assert!( assert!(entry_height >= bootstrap_height + active_set_entries_len);
entry_height >= bootstrap_height + active_set_entries_len + initial_non_tick_height
);
// Shut down // Shut down
t_responder.join().expect("responder thread join"); t_responder.join().expect("responder thread join");

View File

@ -64,7 +64,7 @@ impl ReplayStage {
cluster_info: &Arc<RwLock<ClusterInfo>>, cluster_info: &Arc<RwLock<ClusterInfo>>,
window_receiver: &EntryReceiver, window_receiver: &EntryReceiver,
keypair: &Arc<Keypair>, keypair: &Arc<Keypair>,
vote_signer: Option<&Arc<VoteSignerProxy>>, vote_signer_proxy: Option<&Arc<VoteSignerProxy>>,
vote_blob_sender: Option<&BlobSender>, vote_blob_sender: Option<&BlobSender>,
ledger_entry_sender: &EntrySender, ledger_entry_sender: &EntrySender,
entry_height: &Arc<RwLock<u64>>, entry_height: &Arc<RwLock<u64>>,
@ -146,7 +146,7 @@ impl ReplayStage {
} }
if 0 == num_ticks_to_next_vote { if 0 == num_ticks_to_next_vote {
if let Some(signer) = vote_signer { if let Some(signer) = vote_signer_proxy {
if let Some(sender) = vote_blob_sender { if let Some(sender) = vote_blob_sender {
signer signer
.send_validator_vote(bank, &cluster_info, sender) .send_validator_vote(bank, &cluster_info, sender)
@ -206,7 +206,7 @@ impl ReplayStage {
#[allow(clippy::new_ret_no_self, clippy::too_many_arguments)] #[allow(clippy::new_ret_no_self, clippy::too_many_arguments)]
pub fn new( pub fn new(
keypair: Arc<Keypair>, keypair: Arc<Keypair>,
vote_signer: Option<Arc<VoteSignerProxy>>, vote_signer_proxy: Option<Arc<VoteSignerProxy>>,
bank: Arc<Bank>, bank: Arc<Bank>,
cluster_info: Arc<RwLock<ClusterInfo>>, cluster_info: Arc<RwLock<ClusterInfo>>,
window_receiver: EntryReceiver, window_receiver: EntryReceiver,
@ -252,7 +252,7 @@ impl ReplayStage {
&cluster_info, &cluster_info,
&window_receiver, &window_receiver,
&keypair, &keypair,
vote_signer.as_ref(), vote_signer_proxy.as_ref(),
Some(&vote_blob_sender), Some(&vote_blob_sender),
&ledger_entry_sender, &ledger_entry_sender,
&entry_height_.clone(), &entry_height_.clone(),
@ -328,38 +328,33 @@ mod test {
// Create a ledger // Create a ledger
let num_ending_ticks = 3; let num_ending_ticks = 3;
let (_, mint_keypair, my_ledger_path, genesis_entries) = create_tmp_sample_ledger( let (_, mint_keypair, my_ledger_path, genesis_entry_height, mut last_id) =
create_tmp_sample_ledger(
"test_replay_stage_leader_rotation_exit", "test_replay_stage_leader_rotation_exit",
10_000, 10_000,
num_ending_ticks, num_ending_ticks,
old_leader_id, old_leader_id,
500, 500,
); );
let mut last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
let my_keypair = Arc::new(my_keypair); let my_keypair = Arc::new(my_keypair);
// Write two entries to the ledger so that the validator is in the active set: // Write two entries to the ledger so that the validator is in the active set:
// 1) Give the validator a nonzero number of tokens 2) A vote from the validator . // 1) Give the validator a nonzero number of tokens 2) A vote from the validator .
// This will cause leader rotation after the bootstrap height // This will cause leader rotation after the bootstrap height
let (active_set_entries, vote_account_id) = let (active_set_entries, vote_signer_proxy) =
make_active_set_entries(&my_keypair, &mint_keypair, &last_id, &last_id, 0); make_active_set_entries(&my_keypair, &mint_keypair, &last_id, &last_id, 0);
last_id = active_set_entries.last().unwrap().id; last_id = active_set_entries.last().unwrap().id;
let initial_tick_height = genesis_entries let initial_tick_height = genesis_entry_height;
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let active_set_entries_len = active_set_entries.len() as u64; let active_set_entries_len = active_set_entries.len() as u64;
let initial_non_tick_height = genesis_entries.len() as u64 - initial_tick_height; let initial_non_tick_height = genesis_entry_height - initial_tick_height;
let initial_entry_len = genesis_entries.len() as u64 + active_set_entries_len; let initial_entry_len = genesis_entry_height + active_set_entries_len;
{ {
let db_ledger = DbLedger::open(&my_ledger_path).unwrap(); let db_ledger = DbLedger::open(&my_ledger_path).unwrap();
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
@ -390,7 +385,7 @@ mod test {
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let (_replay_stage, ledger_writer_recv) = ReplayStage::new( let (_replay_stage, ledger_writer_recv) = ReplayStage::new(
my_keypair, my_keypair,
Some(Arc::new(vote_account_id)), Some(Arc::new(vote_signer_proxy)),
Arc::new(bank), Arc::new(bank),
Arc::new(RwLock::new(cluster_info_me)), Arc::new(RwLock::new(cluster_info_me)),
entry_receiver, entry_receiver,
@ -466,8 +461,7 @@ mod test {
let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::default())); let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::default()));
let num_ending_ticks = 1; let num_ending_ticks = 1;
let (_genesis_block, _mint_keypair, my_ledger_path, genesis_entries) = let (_, _, my_ledger_path, _, _) = create_tmp_sample_ledger(
create_tmp_sample_ledger(
"test_vote_error_replay_stage_correctness", "test_vote_error_replay_stage_correctness",
10_000, 10_000,
num_ending_ticks, num_ending_ticks,
@ -475,10 +469,8 @@ mod test {
500, 500,
); );
let initial_entry_len = genesis_entries.len();
// Set up the bank // Set up the bank
let (bank, _, last_entry_id) = let (bank, entry_height, last_id) =
Fullnode::new_bank_from_ledger(&my_ledger_path, leader_scheduler); Fullnode::new_bank_from_ledger(&my_ledger_path, leader_scheduler);
// Set up the cluster info // Set up the cluster info
@ -489,17 +481,17 @@ mod test {
let (entry_sender, entry_receiver) = channel(); let (entry_sender, entry_receiver) = channel();
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let my_keypair = Arc::new(my_keypair); let my_keypair = Arc::new(my_keypair);
let vote_signer = Arc::new(VoteSignerProxy::new_local(&my_keypair)); let vote_signer_proxy = Arc::new(VoteSignerProxy::new_local(&my_keypair));
let (to_leader_sender, _) = channel(); let (to_leader_sender, _) = channel();
let (replay_stage, ledger_writer_recv) = ReplayStage::new( let (replay_stage, ledger_writer_recv) = ReplayStage::new(
my_keypair.clone(), my_keypair.clone(),
Some(vote_signer.clone()), Some(vote_signer_proxy.clone()),
bank.clone(), bank.clone(),
cluster_info_me.clone(), cluster_info_me.clone(),
entry_receiver, entry_receiver,
exit.clone(), exit.clone(),
Arc::new(RwLock::new(initial_entry_len as u64)), Arc::new(RwLock::new(entry_height)),
Arc::new(RwLock::new(last_entry_id)), Arc::new(RwLock::new(last_id)),
to_leader_sender, to_leader_sender,
None, None,
); );
@ -507,16 +499,11 @@ mod test {
// Vote sender should error because no leader contact info is found in the // Vote sender should error because no leader contact info is found in the
// ClusterInfo // ClusterInfo
let (mock_sender, _mock_receiver) = channel(); let (mock_sender, _mock_receiver) = channel();
let _vote_err = vote_signer.send_validator_vote(&bank, &cluster_info_me, &mock_sender); let _vote_err =
vote_signer_proxy.send_validator_vote(&bank, &cluster_info_me, &mock_sender);
// Send ReplayStage an entry, should see it on the ledger writer receiver // Send ReplayStage an entry, should see it on the ledger writer receiver
let next_tick = create_ticks( let next_tick = create_ticks(1, last_id);
1,
genesis_entries
.last()
.expect("Expected nonzero number of entries in genesis")
.id,
);
entry_sender entry_sender
.send(next_tick.clone()) .send(next_tick.clone())
.expect("Error sending entry to ReplayStage"); .expect("Error sending entry to ReplayStage");
@ -543,7 +530,7 @@ mod test {
let leader_id = Keypair::new().pubkey(); let leader_id = Keypair::new().pubkey();
// Create the ledger // Create the ledger
let (_genesis_block, mint_keypair, my_ledger_path, genesis_entries) = let (_genesis_block, mint_keypair, my_ledger_path, genesis_entry_height, last_id) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_vote_error_replay_stage_leader_rotation", "test_vote_error_replay_stage_leader_rotation",
10_000, 10_000,
@ -552,31 +539,24 @@ mod test {
500, 500,
); );
let mut last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
let my_keypair = Arc::new(my_keypair); let my_keypair = Arc::new(my_keypair);
// Write two entries to the ledger so that the validator is in the active set: // Write two entries to the ledger so that the validator is in the active set:
// 1) Give the validator a nonzero number of tokens 2) A vote from the validator. // 1) Give the validator a nonzero number of tokens 2) A vote from the validator.
// This will cause leader rotation after the bootstrap height // This will cause leader rotation after the bootstrap height
let (active_set_entries, vote_account_id) = let (active_set_entries, vote_signer_proxy) =
make_active_set_entries(&my_keypair, &mint_keypair, &last_id, &last_id, 0); make_active_set_entries(&my_keypair, &mint_keypair, &last_id, &last_id, 0);
last_id = active_set_entries.last().unwrap().id; let mut last_id = active_set_entries.last().unwrap().id;
let initial_tick_height = genesis_entries let initial_tick_height = genesis_entry_height;
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let active_set_entries_len = active_set_entries.len() as u64; let active_set_entries_len = active_set_entries.len() as u64;
let initial_non_tick_height = genesis_entries.len() as u64 - initial_tick_height; let initial_non_tick_height = genesis_entry_height - initial_tick_height;
let initial_entry_len = genesis_entries.len() as u64 + active_set_entries_len; let initial_entry_len = genesis_entry_height + active_set_entries_len;
{ {
let db_ledger = DbLedger::open(&my_ledger_path).unwrap(); let db_ledger = DbLedger::open(&my_ledger_path).unwrap();
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
@ -605,14 +585,14 @@ mod test {
let cluster_info_me = Arc::new(RwLock::new(ClusterInfo::new(my_node.info.clone()))); let cluster_info_me = Arc::new(RwLock::new(ClusterInfo::new(my_node.info.clone())));
// Set up the replay stage // Set up the replay stage
let signer_proxy = Arc::new(vote_account_id); let vote_signer_proxy = Arc::new(vote_signer_proxy);
let bank = Arc::new(bank); let bank = Arc::new(bank);
let (entry_sender, entry_receiver) = channel(); let (entry_sender, entry_receiver) = channel();
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 (_replay_stage, ledger_writer_recv) = ReplayStage::new( let (_replay_stage, ledger_writer_recv) = ReplayStage::new(
my_keypair.clone(), my_keypair.clone(),
Some(signer_proxy.clone()), Some(vote_signer_proxy.clone()),
bank.clone(), bank.clone(),
cluster_info_me.clone(), cluster_info_me.clone(),
entry_receiver, entry_receiver,
@ -626,7 +606,8 @@ mod test {
// Vote sender should error because no leader contact info is found in the // Vote sender should error because no leader contact info is found in the
// ClusterInfo // ClusterInfo
let (mock_sender, _mock_receiver) = channel(); let (mock_sender, _mock_receiver) = channel();
let _vote_err = signer_proxy.send_validator_vote(&bank, &cluster_info_me, &mock_sender); let _vote_err =
vote_signer_proxy.send_validator_vote(&bank, &cluster_info_me, &mock_sender);
// Send enough ticks to trigger leader rotation // Send enough ticks to trigger leader rotation
let total_entries_to_send = (bootstrap_height - initial_tick_height) as usize; let total_entries_to_send = (bootstrap_height - initial_tick_height) as usize;
@ -705,13 +686,13 @@ mod test {
.expect("Expected to err out"); .expect("Expected to err out");
let my_keypair = Arc::new(my_keypair); let my_keypair = Arc::new(my_keypair);
let vote_signer = Arc::new(VoteSignerProxy::new_local(&my_keypair)); let vote_signer_proxy = Arc::new(VoteSignerProxy::new_local(&my_keypair));
let res = ReplayStage::process_entries( let res = ReplayStage::process_entries(
&Arc::new(Bank::default()), &Arc::new(Bank::default()),
&cluster_info_me, &cluster_info_me,
&entry_receiver, &entry_receiver,
&my_keypair, &my_keypair,
Some(&vote_signer), Some(&vote_signer_proxy),
None, None,
&ledger_entry_sender, &ledger_entry_sender,
&Arc::new(RwLock::new(entry_height)), &Arc::new(RwLock::new(entry_height)),
@ -738,7 +719,7 @@ mod test {
&cluster_info_me, &cluster_info_me,
&entry_receiver, &entry_receiver,
&Arc::new(Keypair::new()), &Arc::new(Keypair::new()),
Some(&vote_signer), Some(&vote_signer_proxy),
None, None,
&ledger_entry_sender, &ledger_entry_sender,
&Arc::new(RwLock::new(entry_height)), &Arc::new(RwLock::new(entry_height)),
@ -787,13 +768,13 @@ mod test {
.expect("Expected to err out"); .expect("Expected to err out");
let my_keypair = Arc::new(my_keypair); let my_keypair = Arc::new(my_keypair);
let vote_signer = Arc::new(VoteSignerProxy::new_local(&my_keypair)); let vote_signer_proxy = Arc::new(VoteSignerProxy::new_local(&my_keypair));
ReplayStage::process_entries( ReplayStage::process_entries(
&Arc::new(Bank::default()), &Arc::new(Bank::default()),
&cluster_info_me, &cluster_info_me,
&entry_receiver, &entry_receiver,
&my_keypair, &my_keypair,
Some(&vote_signer), Some(&vote_signer_proxy),
None, None,
&ledger_entry_sender, &ledger_entry_sender,
&Arc::new(RwLock::new(entry_height)), &Arc::new(RwLock::new(entry_height)),

View File

@ -498,7 +498,8 @@ mod tests {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let (_genesis_block, _mint, ledger_path, genesis_entries) = create_tmp_sample_ledger( let (_genesis_block, _mint, ledger_path, genesis_entry_height, _last_id) =
create_tmp_sample_ledger(
"storage_stage_process_entries", "storage_stage_process_entries",
1000, 1000,
1, 1,
@ -509,7 +510,7 @@ mod tests {
let entries = make_tiny_test_entries(64); let entries = make_tiny_test_entries(64);
let db_ledger = DbLedger::open(&ledger_path).unwrap(); let db_ledger = DbLedger::open(&ledger_path).unwrap();
db_ledger db_ledger
.write_entries(DEFAULT_SLOT_HEIGHT, genesis_entries.len() as u64, &entries) .write_entries(DEFAULT_SLOT_HEIGHT, genesis_entry_height, &entries)
.unwrap(); .unwrap();
let cluster_info = test_cluster_info(keypair.pubkey()); let cluster_info = test_cluster_info(keypair.pubkey());
@ -566,7 +567,8 @@ mod tests {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let (_genesis_block, _mint, ledger_path, genesis_entries) = create_tmp_sample_ledger( let (_genesis_block, _mint, ledger_path, genesis_entry_height, _last_id) =
create_tmp_sample_ledger(
"storage_stage_process_entries", "storage_stage_process_entries",
1000, 1000,
1, 1,
@ -577,7 +579,7 @@ mod tests {
let entries = make_tiny_test_entries(128); let entries = make_tiny_test_entries(128);
let db_ledger = DbLedger::open(&ledger_path).unwrap(); let db_ledger = DbLedger::open(&ledger_path).unwrap();
db_ledger db_ledger
.write_entries(DEFAULT_SLOT_HEIGHT, genesis_entries.len() as u64, &entries) .write_entries(DEFAULT_SLOT_HEIGHT, genesis_entry_height, &entries)
.unwrap(); .unwrap();
let cluster_info = test_cluster_info(keypair.pubkey()); let cluster_info = test_cluster_info(keypair.pubkey());

View File

@ -965,7 +965,7 @@ fn test_leader_to_validator_transition() {
// 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
let num_ending_ticks = 1; let num_ending_ticks = 1;
let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entries) = let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entry_height, last_id) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_leader_to_validator_transition", "test_leader_to_validator_transition",
10_000, 10_000,
@ -974,11 +974,6 @@ fn test_leader_to_validator_transition() {
500, 500,
); );
let last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
// Write the bootstrap entries to the ledger that will cause leader rotation // Write the bootstrap entries to the ledger that will cause leader rotation
// after the bootstrap height // after the bootstrap height
let (bootstrap_entries, _) = let (bootstrap_entries, _) =
@ -988,7 +983,7 @@ fn test_leader_to_validator_transition() {
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&bootstrap_entries, &bootstrap_entries,
) )
.unwrap(); .unwrap();
@ -1110,7 +1105,7 @@ fn test_leader_validator_basic() {
// 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 num_ending_ticks = 1; let num_ending_ticks = 1;
let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entries) = let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entry_height, last_id) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_leader_validator_basic", "test_leader_validator_basic",
10_000, 10_000,
@ -1121,11 +1116,6 @@ fn test_leader_validator_basic() {
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");
let last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
// 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());
@ -1133,14 +1123,14 @@ fn test_leader_validator_basic() {
// Write the bootstrap entries to the ledger that will cause leader rotation // Write the bootstrap entries to the ledger that will cause leader rotation
// after the bootstrap height // after the bootstrap height
let (active_set_entries, _vote_account_keypair) = let (active_set_entries, _) =
make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0); make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0);
{ {
let db_ledger = DbLedger::open(&leader_ledger_path).unwrap(); let db_ledger = DbLedger::open(&leader_ledger_path).unwrap();
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
@ -1298,7 +1288,7 @@ fn test_dropped_handoff_recovery() {
// 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;
let (_genesis_block, mint_keypair, genesis_ledger_path, genesis_entries) = let (_genesis_block, mint_keypair, genesis_ledger_path, genesis_entry_height, last_id) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_dropped_handoff_recovery", "test_dropped_handoff_recovery",
10_000, 10_000,
@ -1307,11 +1297,6 @@ fn test_dropped_handoff_recovery() {
500, 500,
); );
let last_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
// Create the validator keypair that will be the next leader in line // Create the validator keypair that will be the next leader in line
let next_leader_keypair = Arc::new(Keypair::new()); let next_leader_keypair = Arc::new(Keypair::new());
@ -1323,7 +1308,7 @@ fn test_dropped_handoff_recovery() {
// Make the entries to give the next_leader validator some stake so that they will be in // Make the entries to give the next_leader validator some stake so that they will be in
// leader election active set // leader election active set
let (active_set_entries, _vote_account_keypair) = let (active_set_entries, _) =
make_active_set_entries(&next_leader_keypair, &mint_keypair, &last_id, &last_id, 0); make_active_set_entries(&next_leader_keypair, &mint_keypair, &last_id, &last_id, 0);
// Write the entries // Write the entries
@ -1332,7 +1317,7 @@ fn test_dropped_handoff_recovery() {
db_ledger db_ledger
.write_entries( .write_entries(
DEFAULT_SLOT_HEIGHT, DEFAULT_SLOT_HEIGHT,
genesis_entries.len() as u64, genesis_entry_height,
&active_set_entries, &active_set_entries,
) )
.unwrap(); .unwrap();
@ -1343,9 +1328,7 @@ fn test_dropped_handoff_recovery() {
ledger_paths.push(next_leader_ledger_path.clone()); ledger_paths.push(next_leader_ledger_path.clone());
// Create the common leader scheduling configuration // Create the common leader scheduling configuration
let initial_tick_height = genesis_entries let initial_tick_height = genesis_entry_height;
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let num_slots_per_epoch = (N + 1) as u64; let num_slots_per_epoch = (N + 1) as u64;
let leader_rotation_interval = 5; let leader_rotation_interval = 5;
let seed_rotation_interval = num_slots_per_epoch * leader_rotation_interval; let seed_rotation_interval = num_slots_per_epoch * leader_rotation_interval;
@ -1466,7 +1449,7 @@ fn test_full_leader_validator_network() {
// 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;
let (_genesis_block, mint_keypair, bootstrap_leader_ledger_path, genesis_entries) = let (_genesis_block, mint_keypair, bootstrap_leader_ledger_path, genesis_entry_height, last_id) =
create_tmp_sample_ledger( create_tmp_sample_ledger(
"test_full_leader_validator_network", "test_full_leader_validator_network",
10_000, 10_000,
@ -1475,15 +1458,8 @@ fn test_full_leader_validator_network() {
500, 500,
); );
let last_tick_id = genesis_entries let last_tick_id = last_id;
.last() let mut last_entry_id = last_id;
.expect("expected at least one genesis entry")
.id;
let mut last_entry_id = genesis_entries
.last()
.expect("expected at least one genesis entry")
.id;
// 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
// to the active set for leader election. TODO: Leader rotation does not support dynamic // to the active set for leader election. TODO: Leader rotation does not support dynamic
@ -1493,12 +1469,11 @@ fn test_full_leader_validator_network() {
let mut ledger_paths = Vec::new(); let mut ledger_paths = Vec::new();
ledger_paths.push(bootstrap_leader_ledger_path.clone()); ledger_paths.push(bootstrap_leader_ledger_path.clone());
let mut vote_account_keypairs = VecDeque::new(); let mut index = genesis_entry_height;
let mut index = genesis_entries.len() as u64;
for node_keypair in node_keypairs.iter() { for node_keypair in node_keypairs.iter() {
// Make entries to give each node some stake so that they will be in the // Make entries to give each node some stake so that they will be in the
// leader election active set // leader election active set
let (bootstrap_entries, vote_account_keypair) = make_active_set_entries( let (bootstrap_entries, _) = make_active_set_entries(
node_keypair, node_keypair,
&mint_keypair, &mint_keypair,
&last_entry_id, &last_entry_id,
@ -1506,8 +1481,6 @@ fn test_full_leader_validator_network() {
0, 0,
); );
vote_account_keypairs.push_back(vote_account_keypair);
// Write the entries // Write the entries
last_entry_id = bootstrap_entries last_entry_id = bootstrap_entries
.last() .last()
@ -1543,7 +1516,6 @@ fn test_full_leader_validator_network() {
// 2) Modifying the leader ledger which validators are going to be copying // 2) Modifying the leader ledger which validators are going to be copying
// during startup // during startup
let leader_keypair = node_keypairs.pop_front().unwrap(); let leader_keypair = node_keypairs.pop_front().unwrap();
let _leader_vote_keypair = vote_account_keypairs.pop_front().unwrap();
let mut schedules: Vec<Arc<RwLock<LeaderScheduler>>> = vec![]; let mut schedules: Vec<Arc<RwLock<LeaderScheduler>>> = vec![];
let mut t_nodes = vec![]; let mut t_nodes = vec![];
@ -1708,8 +1680,13 @@ fn test_broadcast_last_tick() {
let bootstrap_leader_info = bootstrap_leader_node.info.clone(); let bootstrap_leader_info = bootstrap_leader_node.info.clone();
// Create leader ledger // Create leader ledger
let (_genesis_block, _mint_keypair, bootstrap_leader_ledger_path, genesis_entries) = let (
create_tmp_sample_ledger( _genesis_block,
_mint_keypair,
bootstrap_leader_ledger_path,
genesis_entry_height,
_last_id,
) = create_tmp_sample_ledger(
"test_broadcast_last_tick", "test_broadcast_last_tick",
10_000, 10_000,
1, 1,
@ -1717,12 +1694,7 @@ fn test_broadcast_last_tick() {
500, 500,
); );
let num_ending_ticks = genesis_entries let genesis_ledger_len = genesis_entry_height;
.iter()
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let genesis_ledger_len = genesis_entries.len() as u64 - num_ending_ticks;
debug!("num_ending_ticks: {}", num_ending_ticks);
debug!("genesis_ledger_len: {}", genesis_ledger_len); debug!("genesis_ledger_len: {}", genesis_ledger_len);
let blob_receiver_exit = Arc::new(AtomicBool::new(false)); let blob_receiver_exit = Arc::new(AtomicBool::new(false));