From 0417e9af1bc2ec52f670a9b4b562006302de5113 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Thu, 8 Apr 2021 14:28:20 +0200 Subject: [PATCH] tools/async_io: do not error on Accept for StaticIncoming in proxmox-backup-proxy, we log and discard any errors on 'accept', so that we can continue to server requests in proxmox-backup-api, we just have the StaticIncoming that accepts, which will forward any errors from the underlying TcpListener this patch also logs and discards the errors, like in the proxy. Otherwise it could happen that if the api-daemon has more files open than the proxy, it will shut itself down because of a 'too many open files' error if there are many open connections (the service should also restart on exit i think, but this is a separate issue) Signed-off-by: Dominik Csapak --- src/tools/async_io.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/tools/async_io.rs b/src/tools/async_io.rs index 997c02fa..844afaa9 100644 --- a/src/tools/async_io.rs +++ b/src/tools/async_io.rs @@ -6,6 +6,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use futures::stream::{Stream, TryStream}; +use futures::ready; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use tokio::net::TcpListener; use hyper::client::connect::Connection; @@ -108,10 +109,15 @@ impl hyper::server::accept::Accept for StaticIncoming { self: Pin<&mut Self>, cx: &mut Context, ) -> Poll>> { - match self.get_mut().0.poll_accept(cx) { - Poll::Pending => Poll::Pending, - Poll::Ready(Ok((conn, _addr))) => Poll::Ready(Some(Ok(conn))), - Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))), + let this = self.get_mut(); + loop { + match ready!(this.0.poll_accept(cx)) { + Ok((conn, _addr)) => return Poll::Ready(Some(Ok(conn))), + Err(err) => { + eprintln!("error accepting connection: {}", err); + continue; + } + } } } }