From 366a97076f640364052e68848442c821ed33ea33 Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Mon, 27 Nov 2023 13:57:18 +0100 Subject: [PATCH] Retry broadcasts after 500ms if they failed due to an HTTP error Due to the rate-limiting applied by many Esplora servers we often receive HTTP 429 ('too many requests') errors during syncing. Here, we simply give broadcasting transactions a second chance after a slight delay of 500ms to ease the pain of immediate failures. Generally, rebroadcasting will then be initiated by the `OuputSweeper`. --- src/tx_broadcaster.rs | 48 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/tx_broadcaster.rs b/src/tx_broadcaster.rs index 92805ae95..ae98373c6 100644 --- a/src/tx_broadcaster.rs +++ b/src/tx_broadcaster.rs @@ -1,4 +1,4 @@ -use crate::logger::{log_error, log_trace, Logger}; +use crate::logger::{log_debug, log_error, log_trace, Logger}; use lightning::chain::chaininterface::BroadcasterInterface; @@ -10,6 +10,7 @@ use tokio::sync::mpsc; use tokio::sync::Mutex; use std::ops::Deref; +use std::time::Duration; const BCAST_PACKAGE_QUEUE_SIZE: usize = 50; @@ -40,14 +41,43 @@ where Ok(()) => { log_trace!(self.logger, "Successfully broadcast transaction {}", tx.txid()); } - Err(e) => { - log_error!( - self.logger, - "Failed to broadcast transaction {}: {}", - tx.txid(), - e - ); - } + Err(e) => match e { + esplora_client::Error::Reqwest(_) => { + // Wait 500 ms and retry in case we get a `Reqwest` error (typically + // 429) + tokio::time::sleep(Duration::from_millis(500)).await; + log_error!( + self.logger, + "Sync failed due to HTTP connection error, retrying: {}", + e + ); + match self.esplora_client.broadcast(tx).await { + Ok(()) => { + log_debug!( + self.logger, + "Successfully broadcast transaction {}", + tx.txid() + ); + } + Err(e) => { + log_error!( + self.logger, + "Failed to broadcast transaction {}: {}", + tx.txid(), + e + ); + } + } + } + _ => { + log_error!( + self.logger, + "Failed to broadcast transaction {}: {}", + tx.txid(), + e + ); + } + }, } } }