diff --git a/changelog.d/24300_systemd_socket_activation.fix.md b/changelog.d/24300_systemd_socket_activation.fix.md new file mode 100644 index 0000000000000..29965b8b4b9da --- /dev/null +++ b/changelog.d/24300_systemd_socket_activation.fix.md @@ -0,0 +1,6 @@ +Fix collection from systemd sockets. + +Systemd sockets are passed in blocking mode, but tokio expects them to be in non-blocking mode. +Therefore, always set sockets from systemd to non-blocking. + +authors: j-c-fuchs aagor diff --git a/src/sources/util/net/tcp/mod.rs b/src/sources/util/net/tcp/mod.rs index c6b7ae429cff8..139b6bc4a5718 100644 --- a/src/sources/util/net/tcp/mod.rs +++ b/src/sources/util/net/tcp/mod.rs @@ -54,9 +54,12 @@ pub async fn try_bind_tcp_listener( match addr { SocketListenAddr::SocketAddr(addr) => tls.bind(&addr).await.map_err(Into::into), SocketListenAddr::SystemdFd(offset) => match listenfd.take_tcp_listener(offset)? { - Some(listener) => TcpListener::from_std(listener) - .map(Into::into) - .map_err(Into::into), + Some(listener) => { + listener.set_nonblocking(true)?; + TcpListener::from_std(listener) + .map(Into::into) + .map_err(Into::into) + } None => { Err(io::Error::new(io::ErrorKind::AddrInUse, "systemd fd already consumed").into()) } diff --git a/src/sources/util/net/udp.rs b/src/sources/util/net/udp.rs index 82b043e80d578..6f6002964332b 100644 --- a/src/sources/util/net/udp.rs +++ b/src/sources/util/net/udp.rs @@ -13,7 +13,10 @@ pub async fn try_bind_udp_socket( match addr { SocketListenAddr::SocketAddr(addr) => UdpSocket::bind(&addr).await, SocketListenAddr::SystemdFd(offset) => match listenfd.take_udp_socket(offset)? { - Some(socket) => UdpSocket::from_std(socket), + Some(socket) => { + socket.set_nonblocking(true)?; + UdpSocket::from_std(socket) + } None => Err(io::Error::new( io::ErrorKind::AddrInUse, "systemd fd already consumed",