Use bank for leader scheduler's config
This ensures GenesisBlock is always configured with the same ticks_per_slot as LeaderScheduler. This will make it easier to migrate to bank-generated schedules.
This commit is contained in:
parent
d26f836212
commit
fdf6cae6fb
|
@ -166,7 +166,6 @@ pub struct BlockData {
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
|
||||||
use chrono::{DateTime, FixedOffset};
|
use chrono::{DateTime, FixedOffset};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
|
@ -179,11 +178,10 @@ mod test {
|
||||||
// Set up bank and leader_scheduler
|
// Set up bank and leader_scheduler
|
||||||
let (mut genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000);
|
let (mut genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000);
|
||||||
genesis_block.ticks_per_slot = 5;
|
genesis_block.ticks_per_slot = 5;
|
||||||
let leader_scheduler_config =
|
genesis_block.slots_per_epoch = 2;
|
||||||
LeaderSchedulerConfig::new(genesis_block.ticks_per_slot, 2, 10);
|
|
||||||
|
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
let leader_scheduler = LeaderScheduler::new_with_window_len(10, &bank);
|
||||||
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
||||||
|
|
||||||
// Set up blockstream
|
// Set up blockstream
|
||||||
|
|
|
@ -117,7 +117,6 @@ impl Service for BlockstreamService {
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::entry::Entry;
|
use crate::entry::Entry;
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
|
||||||
use chrono::{DateTime, FixedOffset};
|
use chrono::{DateTime, FixedOffset};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
|
@ -132,10 +131,12 @@ mod test {
|
||||||
let ticks_per_slot = 5;
|
let ticks_per_slot = 5;
|
||||||
let starting_tick_height = 1;
|
let starting_tick_height = 1;
|
||||||
|
|
||||||
let (genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000);
|
let (mut genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000);
|
||||||
|
genesis_block.ticks_per_slot = ticks_per_slot;
|
||||||
|
genesis_block.slots_per_epoch = 2;
|
||||||
|
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, 2, 10);
|
let leader_scheduler = LeaderScheduler::new_with_window_len(10, &bank);
|
||||||
let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
|
||||||
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
||||||
|
|
||||||
// Set up blockstream
|
// Set up blockstream
|
||||||
|
|
|
@ -105,12 +105,21 @@ impl LeaderScheduler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_with_bank(config: &LeaderSchedulerConfig, bank: &Bank) -> Self {
|
pub fn new_with_window_len(active_window_slot_len: u64, bank: &Bank) -> Self {
|
||||||
let mut leader_schedule = Self::new(config);
|
let config = LeaderSchedulerConfig::new(
|
||||||
|
bank.ticks_per_slot(),
|
||||||
|
bank.slots_per_epoch(),
|
||||||
|
active_window_slot_len,
|
||||||
|
);
|
||||||
|
let mut leader_schedule = Self::new(&config);
|
||||||
leader_schedule.update_tick_height(bank.tick_height(), bank);
|
leader_schedule.update_tick_height(bank.tick_height(), bank);
|
||||||
leader_schedule
|
leader_schedule
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_with_bank(bank: &Bank) -> Self {
|
||||||
|
Self::new_with_window_len(DEFAULT_ACTIVE_WINDOW_NUM_SLOTS, bank)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn tick_height_to_slot(&self, tick_height: u64) -> u64 {
|
pub fn tick_height_to_slot(&self, tick_height: u64) -> u64 {
|
||||||
tick_height / self.ticks_per_slot
|
tick_height / self.ticks_per_slot
|
||||||
}
|
}
|
||||||
|
@ -399,13 +408,12 @@ pub mod tests {
|
||||||
// Allow the validators to be in the active window for the entire test
|
// Allow the validators to be in the active window for the entire test
|
||||||
let active_window_num_slots = slots_per_epoch;
|
let active_window_num_slots = slots_per_epoch;
|
||||||
|
|
||||||
// Set up the LeaderScheduler struct
|
|
||||||
let leader_scheduler_config =
|
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots);
|
|
||||||
|
|
||||||
// Create the bank and validators, which are inserted in order of account balance
|
// Create the bank and validators, which are inserted in order of account balance
|
||||||
let num_vote_account_tokens = 1;
|
let num_vote_account_tokens = 1;
|
||||||
let (genesis_block, mint_keypair) = GenesisBlock::new(10_000);
|
let (mut genesis_block, mint_keypair) = GenesisBlock::new(10_000);
|
||||||
|
genesis_block.ticks_per_slot = ticks_per_slot;
|
||||||
|
genesis_block.slots_per_epoch = slots_per_epoch;
|
||||||
|
|
||||||
info!("bootstrap_leader_id: {}", genesis_block.bootstrap_leader_id);
|
info!("bootstrap_leader_id: {}", genesis_block.bootstrap_leader_id);
|
||||||
|
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
|
@ -434,7 +442,8 @@ pub mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
let mut leader_scheduler =
|
||||||
|
LeaderScheduler::new_with_window_len(active_window_num_slots, &bank);
|
||||||
|
|
||||||
// Generate the schedule for first epoch, bootstrap_leader will be the only leader
|
// Generate the schedule for first epoch, bootstrap_leader will be the only leader
|
||||||
leader_scheduler.generate_schedule(0, &bank);
|
leader_scheduler.generate_schedule(0, &bank);
|
||||||
|
@ -509,8 +518,7 @@ pub mod tests {
|
||||||
let leader_tokens = 2;
|
let leader_tokens = 2;
|
||||||
let (genesis_block, _) = GenesisBlock::new_with_leader(5, leader_id, leader_tokens);
|
let (genesis_block, _) = GenesisBlock::new_with_leader(5, leader_id, leader_tokens);
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
let leader_scheduler =
|
let leader_scheduler = LeaderScheduler::new_with_bank(&bank);
|
||||||
LeaderScheduler::new_with_bank(&LeaderSchedulerConfig::default(), &bank);
|
|
||||||
let slot = leader_scheduler.tick_height_to_slot(bank.tick_height());
|
let slot = leader_scheduler.tick_height_to_slot(bank.tick_height());
|
||||||
assert_eq!(leader_scheduler.get_leader_for_slot(slot), Some(leader_id));
|
assert_eq!(leader_scheduler.get_leader_for_slot(slot), Some(leader_id));
|
||||||
}
|
}
|
||||||
|
@ -645,14 +653,15 @@ pub mod tests {
|
||||||
let active_window_num_slots = slots_per_epoch;
|
let active_window_num_slots = slots_per_epoch;
|
||||||
|
|
||||||
// Create the bazzznk and validators
|
// Create the bazzznk and validators
|
||||||
let (genesis_block, mint_keypair) = GenesisBlock::new(
|
let (mut genesis_block, mint_keypair) = GenesisBlock::new(
|
||||||
((((num_validators + 1) / 2) * (num_validators + 1))
|
((((num_validators + 1) / 2) * (num_validators + 1))
|
||||||
+ (num_vote_account_tokens * num_validators)) as u64,
|
+ (num_vote_account_tokens * num_validators)) as u64,
|
||||||
);
|
);
|
||||||
|
genesis_block.ticks_per_slot = ticks_per_slot;
|
||||||
|
genesis_block.slots_per_epoch = slots_per_epoch;
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
let leader_scheduler_config =
|
let mut leader_scheduler =
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots);
|
LeaderScheduler::new_with_window_len(active_window_num_slots, &bank);
|
||||||
let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
|
||||||
|
|
||||||
let mut validators = vec![];
|
let mut validators = vec![];
|
||||||
let last_id = genesis_block.last_id();
|
let last_id = genesis_block.last_id();
|
||||||
|
@ -715,11 +724,13 @@ pub mod tests {
|
||||||
|
|
||||||
// Check that the generate_schedule() function is being called by the
|
// Check that the generate_schedule() function is being called by the
|
||||||
// update_tick_height() function at the correct entry heights.
|
// update_tick_height() function at the correct entry heights.
|
||||||
let (genesis_block, _) = GenesisBlock::new(10_000);
|
let (mut genesis_block, _) = GenesisBlock::new(10_000);
|
||||||
|
genesis_block.ticks_per_slot = ticks_per_slot;
|
||||||
|
genesis_block.slots_per_epoch = slots_per_epoch;
|
||||||
|
|
||||||
let bank = Bank::new(&genesis_block);
|
let bank = Bank::new(&genesis_block);
|
||||||
let leader_scheduler_config =
|
let mut leader_scheduler =
|
||||||
LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots);
|
LeaderScheduler::new_with_window_len(active_window_num_slots, &bank);
|
||||||
let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
|
||||||
info!(
|
info!(
|
||||||
"bootstrap_leader_id: {:?}",
|
"bootstrap_leader_id: {:?}",
|
||||||
genesis_block.bootstrap_leader_id
|
genesis_block.bootstrap_leader_id
|
||||||
|
|
|
@ -777,8 +777,7 @@ mod test {
|
||||||
|
|
||||||
let genesis_block = GenesisBlock::new(10_000).0;
|
let genesis_block = GenesisBlock::new(10_000).0;
|
||||||
let bank = Arc::new(Bank::new(&genesis_block));
|
let bank = Arc::new(Bank::new(&genesis_block));
|
||||||
let leader_scheduler_config = LeaderSchedulerConfig::default();
|
let leader_scheduler = LeaderScheduler::new_with_bank(&bank);
|
||||||
let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
|
||||||
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
||||||
let voting_keypair = Some(Arc::new(Keypair::new()));
|
let voting_keypair = Some(Arc::new(Keypair::new()));
|
||||||
let res = ReplayStage::process_entries(
|
let res = ReplayStage::process_entries(
|
||||||
|
@ -805,7 +804,7 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
let bank = Arc::new(Bank::new(&genesis_block));
|
let bank = Arc::new(Bank::new(&genesis_block));
|
||||||
let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank);
|
let leader_scheduler = LeaderScheduler::new_with_bank(&bank);
|
||||||
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
||||||
let res = ReplayStage::process_entries(
|
let res = ReplayStage::process_entries(
|
||||||
entries.clone(),
|
entries.clone(),
|
||||||
|
|
|
@ -206,7 +206,6 @@ pub mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::blocktree::get_tmp_ledger_path;
|
use crate::blocktree::get_tmp_ledger_path;
|
||||||
use crate::cluster_info::{ClusterInfo, Node};
|
use crate::cluster_info::{ClusterInfo, Node};
|
||||||
use crate::leader_scheduler::LeaderSchedulerConfig;
|
|
||||||
use crate::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
use crate::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
|
@ -228,9 +227,7 @@ pub mod tests {
|
||||||
entry_height: 0,
|
entry_height: 0,
|
||||||
last_entry_id: Hash::default(),
|
last_entry_id: Hash::default(),
|
||||||
}];
|
}];
|
||||||
let leader_scheduler_config = LeaderSchedulerConfig::default();
|
let leader_scheduler = LeaderScheduler::new_with_bank(&bank_forks.working_bank());
|
||||||
let leader_scheduler =
|
|
||||||
LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank_forks.working_bank());
|
|
||||||
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
let leader_scheduler = Arc::new(RwLock::new(leader_scheduler));
|
||||||
|
|
||||||
//start cluster_info1
|
//start cluster_info1
|
||||||
|
|
19
tests/tvu.rs
19
tests/tvu.rs
|
@ -7,7 +7,6 @@ use solana::entry::next_entry_mut;
|
||||||
use solana::entry::EntrySlice;
|
use solana::entry::EntrySlice;
|
||||||
use solana::gossip_service::GossipService;
|
use solana::gossip_service::GossipService;
|
||||||
use solana::leader_scheduler::LeaderScheduler;
|
use solana::leader_scheduler::LeaderScheduler;
|
||||||
use solana::leader_scheduler::LeaderSchedulerConfig;
|
|
||||||
use solana::packet::index_blobs;
|
use solana::packet::index_blobs;
|
||||||
use solana::rpc_subscriptions::RpcSubscriptions;
|
use solana::rpc_subscriptions::RpcSubscriptions;
|
||||||
use solana::service::Service;
|
use solana::service::Service;
|
||||||
|
@ -76,14 +75,13 @@ fn test_replay() {
|
||||||
r_responder,
|
r_responder,
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO: Fix this test so it always works with the default
|
|
||||||
// LeaderSchedulerConfig configuration
|
|
||||||
let mut leader_scheduler_config = LeaderSchedulerConfig::default();
|
|
||||||
leader_scheduler_config.ticks_per_slot = 64;
|
|
||||||
let ticks_per_slot = leader_scheduler_config.ticks_per_slot;
|
|
||||||
|
|
||||||
let starting_balance = 10_000;
|
let starting_balance = 10_000;
|
||||||
let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance);
|
let (mut genesis_block, mint_keypair) = GenesisBlock::new(starting_balance);
|
||||||
|
|
||||||
|
// TODO: Fix this test so it always works with the default GenesisBlock configuration
|
||||||
|
genesis_block.ticks_per_slot = 64;
|
||||||
|
|
||||||
|
let ticks_per_slot = genesis_block.ticks_per_slot;
|
||||||
let tvu_addr = target1.info.tvu;
|
let tvu_addr = target1.info.tvu;
|
||||||
|
|
||||||
let mut cur_hash = Hash::default();
|
let mut cur_hash = Hash::default();
|
||||||
|
@ -95,10 +93,7 @@ fn test_replay() {
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let bank = bank_forks.working_bank();
|
let bank = bank_forks.working_bank();
|
||||||
let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::new_with_bank(
|
let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::new_with_bank(&bank)));
|
||||||
&leader_scheduler_config,
|
|
||||||
&bank,
|
|
||||||
)));
|
|
||||||
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance);
|
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance);
|
||||||
|
|
||||||
// start cluster_info1
|
// start cluster_info1
|
||||||
|
|
Loading…
Reference in New Issue