Enable test_replay (#2741)

* Enable test_replay

* Refactor get_last_id

* Fix test ledger path
This commit is contained in:
Sagar Dhawan
2019-02-12 15:03:11 -08:00
committed by GitHub
parent be71f49d80
commit 8f1b7c3fff
3 changed files with 40 additions and 26 deletions

View File

@ -235,8 +235,7 @@ impl StorageStage {
} }
} }
let last_id = client.get_last_id(); if let Some(last_id) = client.try_get_last_id(10) {
tx.sign(&[keypair.as_ref()], last_id); tx.sign(&[keypair.as_ref()], last_id);
if exit.load(Ordering::Relaxed) { if exit.load(Ordering::Relaxed) {
@ -257,6 +256,7 @@ impl StorageStage {
} }
} }
} }
}
Err(io::Error::new(io::ErrorKind::Other, "leader not found")) Err(io::Error::new(io::ErrorKind::Other, "leader not found"))
} }

View File

@ -238,11 +238,11 @@ impl ThinClient {
0 0
} }
/// Request the last Entry ID from the server. This method blocks /// Request the last Entry ID from the server without blocking.
/// until the server sends a response. /// Returns the last_id Hash or None if there was no response from the server.
pub fn get_last_id(&mut self) -> Hash { pub fn try_get_last_id(&mut self, mut num_retries: u64) -> Option<Hash> {
loop { loop {
trace!("get_last_id send_to {}", &self.rpc_addr); trace!("try_get_last_id send_to {}", &self.rpc_addr);
let response = self let response = self
.rpc_client .rpc_client
.make_rpc_request(1, RpcRequest::GetLastId, None); .make_rpc_request(1, RpcRequest::GetLastId, None);
@ -251,12 +251,27 @@ impl ThinClient {
Ok(value) => { Ok(value) => {
let last_id_str = value.as_str().unwrap(); let last_id_str = value.as_str().unwrap();
let last_id_vec = bs58::decode(last_id_str).into_vec().unwrap(); let last_id_vec = bs58::decode(last_id_str).into_vec().unwrap();
return Hash::new(&last_id_vec); return Some(Hash::new(&last_id_vec));
} }
Err(error) => { Err(error) => {
debug!("thin_client get_last_id error: {:?}", error); debug!("thin_client get_last_id error: {:?}", error);
num_retries -= 1;
if num_retries == 0 {
return None;
}
}
}
}
}
/// Request the last Entry ID from the server. This method blocks
/// until the server sends a response.
pub fn get_last_id(&mut self) -> Hash {
loop {
trace!("get_last_id send_to {}", &self.rpc_addr);
if let Some(hash) = self.try_get_last_id(10) {
return hash;
} }
};
} }
} }

View File

@ -250,7 +250,7 @@ pub mod tests {
let cref1 = Arc::new(RwLock::new(cluster_info1)); let cref1 = Arc::new(RwLock::new(cluster_info1));
let cur_hash = Hash::default(); let cur_hash = Hash::default();
let blocktree_path = get_tmp_ledger_path("test_replay"); let blocktree_path = get_tmp_ledger_path("test_tvu_exit");
let (blocktree, l_sender, l_receiver) = Blocktree::open_with_signal(&blocktree_path) let (blocktree, l_sender, l_receiver) = Blocktree::open_with_signal(&blocktree_path)
.expect("Expected to successfully open ledger"); .expect("Expected to successfully open ledger");
let vote_account_keypair = Arc::new(Keypair::new()); let vote_account_keypair = Arc::new(Keypair::new());
@ -283,7 +283,6 @@ pub mod tests {
/// Test that message sent from leader to target1 and replayed to target2 /// Test that message sent from leader to target1 and replayed to target2
#[test] #[test]
#[ignore]
fn test_replay() { fn test_replay() {
solana_logger::setup(); solana_logger::setup();
let leader = Node::new_localhost(); let leader = Node::new_localhost();
@ -327,6 +326,9 @@ pub mod tests {
let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance); let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance);
let tvu_addr = target1.info.tvu; let tvu_addr = target1.info.tvu;
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
// 2 tokens are consumed by the genesis
let starting_balance = starting_balance - 2;
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance);
//start cluster_info1 //start cluster_info1
let mut cluster_info1 = ClusterInfo::new(target1.info.clone()); let mut cluster_info1 = ClusterInfo::new(target1.info.clone());
@ -374,7 +376,6 @@ pub mod tests {
for i in 0..num_transfers { for i in 0..num_transfers {
let entry0 = Entry::new(&cur_hash, 0, i, vec![]); let entry0 = Entry::new(&cur_hash, 0, i, vec![]);
cur_hash = entry0.id; cur_hash = entry0.id;
bank.register_tick(&cur_hash);
let entry_tick0 = Entry::new(&cur_hash, 0, i + 1, vec![]); let entry_tick0 = Entry::new(&cur_hash, 0, i + 1, vec![]);
cur_hash = entry_tick0.id; cur_hash = entry_tick0.id;
@ -385,11 +386,9 @@ pub mod tests {
cur_hash, cur_hash,
0, 0,
); );
bank.register_tick(&cur_hash);
let entry_tick1 = Entry::new(&cur_hash, 0, i + 1, vec![]); let entry_tick1 = Entry::new(&cur_hash, 0, i + 1, vec![]);
cur_hash = entry_tick1.id; cur_hash = entry_tick1.id;
let entry1 = Entry::new(&cur_hash, 0, i + num_transfers, vec![tx0]); let entry1 = Entry::new(&cur_hash, 0, i + num_transfers, vec![tx0]);
bank.register_tick(&entry1.id);
let entry_tick2 = Entry::new(&entry1.id, 0, i + 1, vec![]); let entry_tick2 = Entry::new(&entry1.id, 0, i + 1, vec![]);
cur_hash = entry_tick2.id; cur_hash = entry_tick2.id;