From 4de3c79a05fef7ba2df43327d6275b32ff8d5244 Mon Sep 17 00:00:00 2001 From: Nadav Ivgi Date: Tue, 14 May 2024 21:44:34 +0300 Subject: [PATCH] Add timeout to Daemon communication with bitcoind --- src/daemon.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/daemon.rs b/src/daemon.rs index 90e38a931..936768c50 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -23,6 +23,9 @@ use crate::util::{HeaderList, DEFAULT_BLOCKHASH}; use crate::errors::*; +// Used for the connection, read and write timeouts +const DAEMON_TIMEOUT: Duration = Duration::from_secs(5); + fn parse_hash(value: &Value) -> Result where T: FromStr, @@ -129,8 +132,13 @@ struct Connection { fn tcp_connect(addr: SocketAddr, signal: &Waiter) -> Result { loop { - match TcpStream::connect(addr) { - Ok(conn) => return Ok(conn), + match TcpStream::connect_timeout(&addr, DAEMON_TIMEOUT) { + Ok(conn) => { + // can only fail if DAEMON_TIMEOUT is 0 + conn.set_read_timeout(Some(DAEMON_TIMEOUT)).unwrap(); + conn.set_write_timeout(Some(DAEMON_TIMEOUT)).unwrap(); + return Ok(conn); + } Err(err) => { warn!("failed to connect daemon at {}: {}", addr, err); signal.wait(Duration::from_secs(3), false)?;