This commit is contained in:
Rob Walker
2018-09-26 13:31:39 -07:00
committed by GitHub
parent 7292ece7ad
commit e6f8922e35

View File

@ -70,7 +70,7 @@ impl BankingStage {
}
}
if tick_duration.is_some() && last_tick.elapsed() > tick_duration.unwrap() {
if let Err(e) = Self::tick(&poh_service, &entry_sender) {
if let Err(e) = Self::tick(&poh_service, &bank, &entry_sender) {
error!("tick() {:?}", e);
}
last_tick = Instant::now();
@ -93,8 +93,14 @@ impl BankingStage {
}).collect()
}
fn tick(poh_service: &PohService, entry_sender: &Sender<Vec<Entry>>) -> Result<()> {
fn tick(
poh_service: &PohService,
bank: &Arc<Bank>,
entry_sender: &Sender<Vec<Entry>>,
) -> Result<()> {
let poh = poh_service.tick();
bank.register_entry_id(&poh.id);
let entry = Entry {
num_hashes: poh.num_hashes,
id: poh.id,
@ -264,11 +270,11 @@ mod tests {
#[test]
fn test_banking_stage_tick() {
let bank = Bank::new(&Mint::new(2));
let bank = Arc::new(Bank::new(&Mint::new(2)));
let start_hash = bank.last_id();
let (verified_sender, verified_receiver) = channel();
let (banking_stage, entry_receiver) = BankingStage::new(
Arc::new(bank),
bank.clone(),
verified_receiver,
Some(Duration::from_millis(1)),
);
@ -278,31 +284,31 @@ mod tests {
let entries: Vec<_> = entry_receiver.iter().flat_map(|x| x).collect();
assert!(entries.len() != 0);
assert!(entries.verify(&start_hash));
assert_eq!(entries[entries.len() - 1].id, bank.last_id());
assert_eq!(banking_stage.join().unwrap(), ());
}
#[test]
fn test_banking_stage_no_tick() {
let bank = Bank::new(&Mint::new(2));
let bank = Arc::new(Bank::new(&Mint::new(2)));
let (verified_sender, verified_receiver) = channel();
let (banking_stage, entry_receiver) =
BankingStage::new(Arc::new(bank), verified_receiver, None);
let (banking_stage, entry_receiver) = BankingStage::new(bank, verified_receiver, None);
sleep(Duration::from_millis(1000));
drop(verified_sender);
let entries: Vec<_> = entry_receiver.try_iter().map(|x| x).collect();
let entries: Vec<_> = entry_receiver.iter().flat_map(|x| x).collect();
assert!(entries.len() == 0);
assert_eq!(banking_stage.join().unwrap(), ());
}
#[test]
fn test_banking_stage() {
fn test_banking_stage_entries_only() {
let mint = Mint::new(2);
let bank = Bank::new(&mint);
let bank = Arc::new(Bank::new(&mint));
let start_hash = bank.last_id();
let (verified_sender, verified_receiver) = channel();
let (banking_stage, entry_receiver) =
BankingStage::new(Arc::new(bank), verified_receiver, None);
BankingStage::new(bank.clone(), verified_receiver, None);
// good tx
let keypair = mint.keypair();
@ -327,14 +333,56 @@ mod tests {
drop(verified_sender);
let entries: Vec<_> = entry_receiver.iter().map(|x| x).collect();
let entries: Vec<_> = entry_receiver.iter().flat_map(|x| x).collect();
assert_eq!(entries.len(), 1);
let mut last_id = start_hash;
entries.iter().for_each(|entries| {
assert_eq!(entries.len(), 1);
assert!(entries.verify(&last_id));
last_id = entries.last().unwrap().id;
});
assert!(entries.verify(&start_hash));
assert_eq!(entries[entries.len() - 1].id, bank.last_id());
assert_eq!(banking_stage.join().unwrap(), ());
}
#[test]
fn test_banking_stage() {
let mint = Mint::new(2);
let bank = Arc::new(Bank::new(&mint));
let start_hash = bank.last_id();
let (verified_sender, verified_receiver) = channel();
let (banking_stage, entry_receiver) = BankingStage::new(
bank.clone(),
verified_receiver,
Some(Duration::from_millis(1)),
);
// wait for some ticks
sleep(Duration::from_millis(50));
// good tx
let keypair = mint.keypair();
let tx = Transaction::new(&keypair, keypair.pubkey(), 1, start_hash);
// good tx, but no verify
let tx_no_ver = Transaction::new(&keypair, keypair.pubkey(), 1, start_hash);
// bad tx, AccountNotFound
let keypair = Keypair::new();
let tx_anf = Transaction::new(&keypair, keypair.pubkey(), 1, start_hash);
// send 'em over
let recycler = PacketRecycler::default();
let packets = to_packets(&recycler, &[tx, tx_no_ver, tx_anf]);
// glad they all fit
assert_eq!(packets.len(), 1);
verified_sender // tx, no_ver, anf
.send(vec![(packets[0].clone(), vec![1u8, 0u8, 1u8])])
.unwrap();
drop(verified_sender);
let entries: Vec<_> = entry_receiver.iter().flat_map(|x| x).collect();
assert!(entries.len() > 1);
assert!(entries.verify(&start_hash));
assert_eq!(entries[entries.len() - 1].id, bank.last_id());
assert_eq!(banking_stage.join().unwrap(), ());
}
@ -344,11 +392,11 @@ mod tests {
// differently if either the server doesn't signal the ledger to add an
// Entry OR if the verifier tries to parallelize across multiple Entries.
let mint = Mint::new(2);
let bank = Bank::new(&mint);
let bank = Arc::new(Bank::new(&mint));
let recycler = PacketRecycler::default();
let (verified_sender, verified_receiver) = channel();
let (banking_stage, entry_receiver) =
BankingStage::new(Arc::new(bank), verified_receiver, None);
BankingStage::new(bank.clone(), verified_receiver, None);
// Process a batch that includes a transaction that receives two tokens.
let alice = Keypair::new();
@ -369,16 +417,14 @@ mod tests {
assert_eq!(banking_stage.join().unwrap(), ());
// Collect the ledger and feed it to a new bank.
let ventries: Vec<_> = entry_receiver.iter().collect();
// same assertion as below, really...
assert_eq!(ventries.len(), 2);
let entries: Vec<_> = entry_receiver.iter().flat_map(|x| x).collect();
// same assertion as running through the bank, really...
assert_eq!(entries.len(), 2);
// Assert the user holds one token, not two. If the stage only outputs one
// entry, then the second transaction will be rejected, because it drives
// the account balance below zero before the credit is added.
let bank = Bank::new(&mint);
for entries in ventries {
for entry in entries {
assert!(
bank.process_transactions(&entry.transactions)
@ -386,7 +432,6 @@ mod tests {
.all(|x| x.is_ok())
);
}
}
assert_eq!(bank.get_balance(&alice.pubkey()), 1);
}