X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-block-sync%2Fsrc%2Fhttp.rs;h=1f5f046c0f87dd904820e7f97718b1a3ba16ac15;hb=b465318e12e4374d7e7cb3c00036fded340f155a;hp=a33d919d05179c7adccc8bf40fc7ed86b467bb21;hpb=1efc0c85eb94e6ac8251bcb059432acd32a6a55e;p=rust-lightning diff --git a/lightning-block-sync/src/http.rs b/lightning-block-sync/src/http.rs index a33d919d..1f5f046c 100644 --- a/lightning-block-sync/src/http.rs +++ b/lightning-block-sync/src/http.rs @@ -1,3 +1,6 @@ +//! Simple HTTP implementation which supports both async and traditional execution environments +//! with minimal dependencies. This is used as the basis for REST and RPC clients. + use chunked_transfer; use serde_json; @@ -155,16 +158,19 @@ impl HttpClient { let endpoint = self.stream.peer_addr().unwrap(); match self.send_request(request).await { Ok(bytes) => Ok(bytes), - Err(e) => match e.kind() { - std::io::ErrorKind::ConnectionReset | - std::io::ErrorKind::ConnectionAborted | - std::io::ErrorKind::UnexpectedEof => { - // Reconnect if the connection was closed. This may happen if the server's - // keep-alive limits are reached. - *self = Self::connect(endpoint)?; - self.send_request(request).await - }, - _ => Err(e), + Err(_) => { + // Reconnect and retry on fail. This can happen if the connection was closed after + // the keep-alive limits are reached, or generally if the request timed out due to + // Bitcoin Core being stuck on a long-running operation or its RPC queue being + // full. + // Block 100ms before retrying the request as in many cases the source of the error + // may be persistent for some time. + #[cfg(feature = "tokio")] + tokio::time::sleep(Duration::from_millis(100)).await; + #[cfg(not(feature = "tokio"))] + std::thread::sleep(Duration::from_millis(100)); + *self = Self::connect(endpoint)?; + self.send_request(request).await }, } }