From b1b217f12c40759053c416ed0ab0694883fb79d5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2019 12:21:56 -0700 Subject: [PATCH] Fix poh recorder not flushing virtual ticks immediately (#5277) (#5281) automerge --- core/src/poh_recorder.rs | 36 ++++++++++++++++++++++++++++++++++++ runtime/src/bank.rs | 7 +++++++ 2 files changed, 43 insertions(+) diff --git a/core/src/poh_recorder.rs b/core/src/poh_recorder.rs index ccb21ead83..e045274102 100644 --- a/core/src/poh_recorder.rs +++ b/core/src/poh_recorder.rs @@ -204,6 +204,7 @@ impl PohRecorder { pub fn set_working_bank(&mut self, working_bank: WorkingBank) { trace!("new working bank"); self.working_bank = Some(working_bank); + let _ = self.flush_cache(false); } pub fn set_bank(&mut self, bank: &Arc) { let max_tick_height = (bank.slot() + 1) * bank.ticks_per_slot() - 1; @@ -1296,6 +1297,8 @@ mod tests { false ); + // Move the bank up a slot (so that max_tick_height > slot 0's tick_height) + let bank = Arc::new(Bank::new_from_parent(&bank, &Pubkey::default(), 1)); // If we set the working bank, the node should be leader within next 2 slots poh_recorder.set_bank(&bank); assert_eq!( @@ -1304,4 +1307,37 @@ mod tests { ); } } + + #[test] + fn test_flush_virtual_ticks() { + let ledger_path = get_tmp_ledger_path!(); + { + // test that virtual ticks are flushed into a newly set bank asap + let blocktree = + Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"); + let GenesisBlockInfo { genesis_block, .. } = create_genesis_block(2); + let bank = Arc::new(Bank::new(&genesis_block)); + let genesis_blockhash = bank.last_blockhash(); + + let (mut poh_recorder, _entry_receiver) = PohRecorder::new( + 0, + bank.last_blockhash(), + 0, + Some(2), + bank.ticks_per_slot(), + &Pubkey::default(), + &Arc::new(blocktree), + &Arc::new(LeaderScheduleCache::new_from_bank(&bank)), + &Arc::new(PohConfig::default()), + ); + //create a new bank + let bank = Arc::new(Bank::new_from_parent(&bank, &Pubkey::default(), 2)); + //put 2 slots worth of virtual ticks into poh + for _ in 0..(bank.ticks_per_slot() * 2) { + poh_recorder.tick(); + } + poh_recorder.set_bank(&bank.clone()); + assert!(!bank.check_hash_age(&genesis_blockhash, 1)); + } + } } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 92839b275d..0af5ccda6d 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -839,6 +839,13 @@ impl Bank { .collect() } + pub fn check_hash_age(&self, hash: &Hash, max_age: usize) -> bool { + self.blockhash_queue + .read() + .unwrap() + .check_hash_age(hash, max_age) + } + pub fn check_transactions( &self, txs: &[Transaction],