Store BlockCommitmentCache slot and root metadata (#9154)

automerge
This commit is contained in:
Tyera Eulberg
2020-03-30 11:29:30 -06:00
committed by GitHub
parent 8731b6279f
commit 62040cef56
3 changed files with 96 additions and 26 deletions

View File

@ -31,17 +31,40 @@ impl BlockCommitment {
} }
} }
#[derive(Debug, Default)] #[derive(Default)]
pub struct BlockCommitmentCache { pub struct BlockCommitmentCache {
block_commitment: HashMap<Slot, BlockCommitment>, block_commitment: HashMap<Slot, BlockCommitment>,
total_stake: u64, total_stake: u64,
bank: Arc<Bank>,
root: Slot,
}
impl std::fmt::Debug for BlockCommitmentCache {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("BlockCommitmentCache")
.field("block_commitment", &self.block_commitment)
.field("total_stake", &self.total_stake)
.field(
"bank",
&format_args!("Bank({{current_slot: {:?}}})", self.bank.slot()),
)
.field("root", &self.root)
.finish()
}
} }
impl BlockCommitmentCache { impl BlockCommitmentCache {
pub fn new(block_commitment: HashMap<Slot, BlockCommitment>, total_stake: u64) -> Self { pub fn new(
block_commitment: HashMap<Slot, BlockCommitment>,
total_stake: u64,
bank: Arc<Bank>,
root: Slot,
) -> Self {
Self { Self {
block_commitment, block_commitment,
total_stake, total_stake,
bank,
root,
} }
} }
@ -53,6 +76,18 @@ impl BlockCommitmentCache {
self.total_stake self.total_stake
} }
pub fn bank(&self) -> Arc<Bank> {
self.bank.clone()
}
pub fn slot(&self) -> Slot {
self.bank.slot()
}
pub fn root(&self) -> Slot {
self.root
}
pub fn get_block_with_depth_commitment( pub fn get_block_with_depth_commitment(
&self, &self,
minimum_depth: usize, minimum_depth: usize,
@ -79,12 +114,17 @@ impl BlockCommitmentCache {
pub struct CommitmentAggregationData { pub struct CommitmentAggregationData {
bank: Arc<Bank>, bank: Arc<Bank>,
root: Slot,
total_staked: u64, total_staked: u64,
} }
impl CommitmentAggregationData { impl CommitmentAggregationData {
pub fn new(bank: Arc<Bank>, total_staked: u64) -> Self { pub fn new(bank: Arc<Bank>, root: Slot, total_staked: u64) -> Self {
Self { bank, total_staked } Self {
bank,
root,
total_staked,
}
} }
} }
@ -146,8 +186,12 @@ impl AggregateCommitmentService {
let block_commitment = Self::aggregate_commitment(&ancestors, &aggregation_data.bank); let block_commitment = Self::aggregate_commitment(&ancestors, &aggregation_data.bank);
let mut new_block_commitment = let mut new_block_commitment = BlockCommitmentCache::new(
BlockCommitmentCache::new(block_commitment, aggregation_data.total_staked); block_commitment,
aggregation_data.total_staked,
aggregation_data.bank,
aggregation_data.root,
);
let mut w_block_commitment_cache = block_commitment_cache.write().unwrap(); let mut w_block_commitment_cache = block_commitment_cache.write().unwrap();
@ -247,6 +291,7 @@ mod tests {
#[test] #[test]
fn test_get_block_with_depth_commitment() { fn test_get_block_with_depth_commitment() {
let bank = Arc::new(Bank::default());
// Build BlockCommitmentCache with votes at depths 0 and 1 for 2 slots // Build BlockCommitmentCache with votes at depths 0 and 1 for 2 slots
let mut cache0 = BlockCommitment::default(); let mut cache0 = BlockCommitment::default();
cache0.increase_confirmation_stake(1, 15); cache0.increase_confirmation_stake(1, 15);
@ -259,7 +304,7 @@ mod tests {
let mut block_commitment = HashMap::new(); let mut block_commitment = HashMap::new();
block_commitment.entry(0).or_insert(cache0.clone()); block_commitment.entry(0).or_insert(cache0.clone());
block_commitment.entry(1).or_insert(cache1.clone()); block_commitment.entry(1).or_insert(cache1.clone());
let block_commitment_cache = BlockCommitmentCache::new(block_commitment, 50); let block_commitment_cache = BlockCommitmentCache::new(block_commitment, 50, bank, 0);
// Neither slot has rooted votes // Neither slot has rooted votes
assert_eq!( assert_eq!(
@ -295,6 +340,7 @@ mod tests {
#[test] #[test]
fn test_get_rooted_block_with_commitment() { fn test_get_rooted_block_with_commitment() {
let bank = Arc::new(Bank::default());
// Build BlockCommitmentCache with rooted votes // Build BlockCommitmentCache with rooted votes
let mut cache0 = BlockCommitment::new([0; MAX_LOCKOUT_HISTORY]); let mut cache0 = BlockCommitment::new([0; MAX_LOCKOUT_HISTORY]);
cache0.increase_confirmation_stake(MAX_LOCKOUT_HISTORY, 40); cache0.increase_confirmation_stake(MAX_LOCKOUT_HISTORY, 40);
@ -307,7 +353,7 @@ mod tests {
let mut block_commitment = HashMap::new(); let mut block_commitment = HashMap::new();
block_commitment.entry(0).or_insert(cache0.clone()); block_commitment.entry(0).or_insert(cache0.clone());
block_commitment.entry(1).or_insert(cache1.clone()); block_commitment.entry(1).or_insert(cache1.clone());
let block_commitment_cache = BlockCommitmentCache::new(block_commitment, 50); let block_commitment_cache = BlockCommitmentCache::new(block_commitment, 50, bank, 0);
// Only slot 0 meets the minimum level of commitment 0.66 at root // Only slot 0 meets the minimum level of commitment 0.66 at root
assert_eq!( assert_eq!(

View File

@ -762,6 +762,7 @@ impl ReplayStage {
Self::update_commitment_cache( Self::update_commitment_cache(
bank.clone(), bank.clone(),
bank_forks.read().unwrap().root(),
progress.get_fork_stats(bank.slot()).unwrap().total_staked, progress.get_fork_stats(bank.slot()).unwrap().total_staked,
lockouts_sender, lockouts_sender,
); );
@ -792,10 +793,13 @@ impl ReplayStage {
fn update_commitment_cache( fn update_commitment_cache(
bank: Arc<Bank>, bank: Arc<Bank>,
root: Slot,
total_staked: u64, total_staked: u64,
lockouts_sender: &Sender<CommitmentAggregationData>, lockouts_sender: &Sender<CommitmentAggregationData>,
) { ) {
if let Err(e) = lockouts_sender.send(CommitmentAggregationData::new(bank, total_staked)) { if let Err(e) =
lockouts_sender.send(CommitmentAggregationData::new(bank, root, total_staked))
{
trace!("lockouts_sender failed: {:?}", e); trace!("lockouts_sender failed: {:?}", e);
} }
} }
@ -2350,7 +2354,12 @@ pub(crate) mod tests {
bank_forks.write().unwrap().insert(bank1); bank_forks.write().unwrap().insert(bank1);
let arc_bank1 = bank_forks.read().unwrap().get(1).unwrap().clone(); let arc_bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
leader_vote(&arc_bank1, &leader_voting_pubkey); leader_vote(&arc_bank1, &leader_voting_pubkey);
ReplayStage::update_commitment_cache(arc_bank1.clone(), leader_lamports, &lockouts_sender); ReplayStage::update_commitment_cache(
arc_bank1.clone(),
0,
leader_lamports,
&lockouts_sender,
);
let bank2 = Bank::new_from_parent(&arc_bank1, &Pubkey::default(), arc_bank1.slot() + 1); let bank2 = Bank::new_from_parent(&arc_bank1, &Pubkey::default(), arc_bank1.slot() + 1);
let _res = bank2.transfer(10, &genesis_config_info.mint_keypair, &Pubkey::new_rand()); let _res = bank2.transfer(10, &genesis_config_info.mint_keypair, &Pubkey::new_rand());
@ -2361,7 +2370,12 @@ pub(crate) mod tests {
bank_forks.write().unwrap().insert(bank2); bank_forks.write().unwrap().insert(bank2);
let arc_bank2 = bank_forks.read().unwrap().get(2).unwrap().clone(); let arc_bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
leader_vote(&arc_bank2, &leader_voting_pubkey); leader_vote(&arc_bank2, &leader_voting_pubkey);
ReplayStage::update_commitment_cache(arc_bank2.clone(), leader_lamports, &lockouts_sender); ReplayStage::update_commitment_cache(
arc_bank2.clone(),
0,
leader_lamports,
&lockouts_sender,
);
thread::sleep(Duration::from_millis(200)); thread::sleep(Duration::from_millis(200));
let mut expected0 = BlockCommitment::default(); let mut expected0 = BlockCommitment::default();

View File

@ -1222,18 +1222,6 @@ pub mod tests {
) -> RpcHandler { ) -> RpcHandler {
let (bank_forks, alice, leader_vote_keypair) = new_bank_forks(); let (bank_forks, alice, leader_vote_keypair) = new_bank_forks();
let bank = bank_forks.read().unwrap().working_bank(); let bank = bank_forks.read().unwrap().working_bank();
let commitment_slot0 = BlockCommitment::new([8; MAX_LOCKOUT_HISTORY]);
let commitment_slot1 = BlockCommitment::new([9; MAX_LOCKOUT_HISTORY]);
let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new();
block_commitment
.entry(0)
.or_insert(commitment_slot0.clone());
block_commitment
.entry(1)
.or_insert(commitment_slot1.clone());
let block_commitment_cache =
Arc::new(RwLock::new(BlockCommitmentCache::new(block_commitment, 42)));
let ledger_path = get_tmp_ledger_path!(); let ledger_path = get_tmp_ledger_path!();
let blockstore = Blockstore::open(&ledger_path).unwrap(); let blockstore = Blockstore::open(&ledger_path).unwrap();
let blockstore = Arc::new(blockstore); let blockstore = Arc::new(blockstore);
@ -1249,6 +1237,22 @@ pub mod tests {
blockstore.clone(), blockstore.clone(),
); );
let commitment_slot0 = BlockCommitment::new([8; MAX_LOCKOUT_HISTORY]);
let commitment_slot1 = BlockCommitment::new([9; MAX_LOCKOUT_HISTORY]);
let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new();
block_commitment
.entry(0)
.or_insert(commitment_slot0.clone());
block_commitment
.entry(1)
.or_insert(commitment_slot1.clone());
let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::new(
block_commitment,
42,
bank.clone(),
0,
)));
// Add timestamp vote to blockstore // Add timestamp vote to blockstore
let vote = Vote { let vote = Vote {
slots: vec![1], slots: vec![1],
@ -2119,6 +2123,8 @@ pub mod tests {
fn test_rpc_processor_get_block_commitment() { fn test_rpc_processor_get_block_commitment() {
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let validator_exit = create_validator_exit(&exit); let validator_exit = create_validator_exit(&exit);
let bank_forks = new_bank_forks().0;
let commitment_slot0 = BlockCommitment::new([8; MAX_LOCKOUT_HISTORY]); let commitment_slot0 = BlockCommitment::new([8; MAX_LOCKOUT_HISTORY]);
let commitment_slot1 = BlockCommitment::new([9; MAX_LOCKOUT_HISTORY]); let commitment_slot1 = BlockCommitment::new([9; MAX_LOCKOUT_HISTORY]);
let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new(); let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new();
@ -2128,8 +2134,12 @@ pub mod tests {
block_commitment block_commitment
.entry(1) .entry(1)
.or_insert(commitment_slot1.clone()); .or_insert(commitment_slot1.clone());
let block_commitment_cache = let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::new(
Arc::new(RwLock::new(BlockCommitmentCache::new(block_commitment, 42))); block_commitment,
42,
bank_forks.read().unwrap().working_bank(),
0,
)));
let ledger_path = get_tmp_ledger_path!(); let ledger_path = get_tmp_ledger_path!();
let blockstore = Blockstore::open(&ledger_path).unwrap(); let blockstore = Blockstore::open(&ledger_path).unwrap();
@ -2137,7 +2147,7 @@ pub mod tests {
config.enable_validator_exit = true; config.enable_validator_exit = true;
let request_processor = JsonRpcRequestProcessor::new( let request_processor = JsonRpcRequestProcessor::new(
config, config,
new_bank_forks().0, bank_forks,
block_commitment_cache, block_commitment_cache,
Arc::new(blockstore), Arc::new(blockstore),
StorageState::default(), StorageState::default(),