From 4d498201886e23d41e8c522e8d96e4588004f048 Mon Sep 17 00:00:00 2001 From: Sagar Dhawan Date: Mon, 8 Jul 2019 11:23:21 -0700 Subject: [PATCH] Handle replicator errors without panicking (#4957) * Handle replicator errors without panicking * Typo * Handle error with match instead of if-let * Discard error --- core/src/replicator.rs | 51 ++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/core/src/replicator.rs b/core/src/replicator.rs index 70fb65bf12..7dee1cb677 100644 --- a/core/src/replicator.rs +++ b/core/src/replicator.rs @@ -466,7 +466,15 @@ impl Replicator { // check if the storage account exists let balance = client.poll_get_balance(&storage_keypair.pubkey()); if balance.is_err() || balance.unwrap() == 0 { - let (blockhash, _fee_calculator) = client.get_recent_blockhash().expect("blockhash"); + let blockhash = match client.get_recent_blockhash() { + Ok((blockhash, _)) => blockhash, + Err(_) => { + return Err(Error::IO(::new( + io::ErrorKind::Other, + "unable to get recent blockhash, can't submit proof", + ))) + } + }; let ix = storage_instruction::create_replicator_storage_account( &keypair.pubkey(), @@ -493,16 +501,25 @@ impl Replicator { // No point if we've got no storage account... let nodes = self.cluster_info.read().unwrap().tvu_peers(); let client = crate::gossip_service::get_client(&nodes); - assert!( - client - .poll_get_balance(&self.storage_keypair.pubkey()) - .unwrap() - > 0 - ); + let storage_balance = client.poll_get_balance(&self.storage_keypair.pubkey()); + if storage_balance.is_err() || storage_balance.unwrap() == 0 { + error!("Unable to submit mining proof, no storage account"); + return; + } // ...or no lamports for fees - assert!(client.poll_get_balance(&self.keypair.pubkey()).unwrap() > 0); + let balance = client.poll_get_balance(&self.keypair.pubkey()); + if balance.is_err() || balance.unwrap() == 0 { + error!("Unable to submit mining proof, insufficient Replicator Account balance"); + return; + } - let (blockhash, _) = client.get_recent_blockhash().expect("No recent blockhash"); + let blockhash = match client.get_recent_blockhash() { + Ok((blockhash, _)) => blockhash, + Err(_) => { + error!("unable to get recent blockhash, can't submit proof"); + return; + } + }; let instruction = storage_instruction::mining_proof( &self.storage_keypair.pubkey(), self.sha_state, @@ -516,14 +533,14 @@ impl Replicator { message, blockhash, ); - client - .send_and_confirm_transaction( - &[&self.keypair, &self.storage_keypair], - &mut transaction, - 10, - 0, - ) - .expect("transfer didn't work!"); + if let Err(err) = client.send_and_confirm_transaction( + &[&self.keypair, &self.storage_keypair], + &mut transaction, + 10, + 0, + ) { + error!("Error: {:?}; while sending mining proof", err); + } } pub fn close(self) {