From 77ec7e502f49bf6d95dc67276a8b208b2cb80ef3 Mon Sep 17 00:00:00 2001 From: Daniel Karzel Date: Tue, 16 Feb 2021 15:19:11 +1100 Subject: [PATCH] Distinguish permanent and transient error when watching tx --- swap/src/bitcoin/wallet.rs | 17 ++++++++++++----- swap/src/protocol/alice/swap.rs | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index 7b590007..1af6c26a 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -29,6 +29,7 @@ enum Error { Parse(std::num::ParseIntError), NotYetMined, JsonDeserialisation(reqwest::Error), + ElectrumConnection(electrum_client::Error), } pub struct Wallet { @@ -163,14 +164,20 @@ impl BroadcastSignedTransaction for Wallet { impl WatchForRawTransaction for Wallet { async fn watch_for_raw_transaction(&self, txid: Txid) -> Result { tracing::debug!("watching for tx: {}", txid); - retry(ConstantBackoff::new(Duration::from_secs(1)), || async { - let client = Client::new(self.rpc_url.as_ref())?; - let tx = client.transaction_get(&txid)?; + let tx = retry(ConstantBackoff::new(Duration::from_secs(1)), || async { + let client = Client::new(self.rpc_url.as_ref()) + .map_err(|err| backoff::Error::Permanent(Error::ElectrumConnection(err)))?; + let tx = client + .transaction_get(&txid) + .map_err(|_| backoff::Error::Transient(Error::NotYetMined))?; tracing::debug!("found tx: {}", txid); - Ok(tx) + + Result::<_, backoff::Error>::Ok(tx) }) .await - .map_err(|err| anyhow!("transient errors to be retried: {:?}", err)) + .map_err(|err| anyhow!("transient errors to be retried: {:?}", err))?; + + Ok(tx) } } diff --git a/swap/src/protocol/alice/swap.rs b/swap/src/protocol/alice/swap.rs index 7d8129d0..8e2870cb 100644 --- a/swap/src/protocol/alice/swap.rs +++ b/swap/src/protocol/alice/swap.rs @@ -86,7 +86,7 @@ async fn run_until_internal( swap_id: Uuid, db: Arc, ) -> Result { - info!("Current state:{}", state); + info!("Current state: {}", state); if is_target_state(&state) { Ok(state) } else {