Use PohRecorder to synchronize instead of rotate. (#3080)
This commit is contained in:
committed by
GitHub
parent
2ec9bc9f05
commit
1654199b23
@@ -117,20 +117,17 @@ mod tests {
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_sdk::genesis_block::GenesisBlock;
|
||||
use solana_sdk::hash::hash;
|
||||
use std::sync::mpsc::channel;
|
||||
use std::sync::mpsc::RecvError;
|
||||
|
||||
#[test]
|
||||
fn test_poh_service() {
|
||||
let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
|
||||
let bank = Arc::new(Bank::new(&genesis_block));
|
||||
let prev_hash = bank.last_blockhash();
|
||||
let (entry_sender, entry_receiver) = channel();
|
||||
let poh_recorder = Arc::new(Mutex::new(PohRecorder::new(bank.tick_height(), prev_hash)));
|
||||
let (poh_recorder, entry_receiver) = PohRecorder::new(bank.tick_height(), prev_hash);
|
||||
let poh_recorder = Arc::new(Mutex::new(poh_recorder));
|
||||
let exit = Arc::new(AtomicBool::new(false));
|
||||
let working_bank = WorkingBank {
|
||||
bank: bank.clone(),
|
||||
sender: entry_sender,
|
||||
min_tick_height: bank.tick_height(),
|
||||
max_tick_height: std::u64::MAX,
|
||||
};
|
||||
@@ -171,7 +168,7 @@ mod tests {
|
||||
let mut need_partial = true;
|
||||
|
||||
while need_tick || need_entry || need_partial {
|
||||
for entry in entry_receiver.recv().unwrap() {
|
||||
for entry in entry_receiver.recv().unwrap().1 {
|
||||
let entry = &entry.0;
|
||||
if entry.is_tick() {
|
||||
assert!(entry.num_hashes <= HASHES_PER_TICK);
|
||||
@@ -199,43 +196,4 @@ mod tests {
|
||||
let _ = poh_service.join().unwrap();
|
||||
let _ = entry_producer.join().unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_poh_service_drops_working_bank() {
|
||||
let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
|
||||
let bank = Arc::new(Bank::new(&genesis_block));
|
||||
let prev_hash = bank.last_blockhash();
|
||||
let (entry_sender, entry_receiver) = channel();
|
||||
let poh_recorder = Arc::new(Mutex::new(PohRecorder::new(bank.tick_height(), prev_hash)));
|
||||
let exit = Arc::new(AtomicBool::new(false));
|
||||
let working_bank = WorkingBank {
|
||||
bank: bank.clone(),
|
||||
sender: entry_sender,
|
||||
min_tick_height: bank.tick_height() + 3,
|
||||
max_tick_height: bank.tick_height() + 5,
|
||||
};
|
||||
|
||||
let poh_service = PohService::new(
|
||||
poh_recorder.clone(),
|
||||
&PohServiceConfig::default(),
|
||||
Arc::new(AtomicBool::new(false)),
|
||||
);
|
||||
|
||||
poh_recorder.lock().unwrap().set_working_bank(working_bank);
|
||||
|
||||
// all 5 ticks are expected, there is no tick 0
|
||||
// First 4 ticks must be sent all at once, since bank shouldn't see them until
|
||||
// the after bank's min_tick_height(3) is reached.
|
||||
let entries = entry_receiver.recv().expect("recv 1");
|
||||
assert_eq!(entries.len(), 4);
|
||||
let entries = entry_receiver.recv().expect("recv 2");
|
||||
assert_eq!(entries.len(), 1);
|
||||
|
||||
//WorkingBank should be dropped by the PohService thread as well
|
||||
assert_eq!(entry_receiver.recv(), Err(RecvError));
|
||||
|
||||
exit.store(true, Ordering::Relaxed);
|
||||
poh_service.exit();
|
||||
let _ = poh_service.join().unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user