From 586bda5b1388fe9c6903fd6fd3b7898a8734ef66 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Sat, 1 Jul 2023 20:33:04 +0200 Subject: [PATCH] Fix Netty leak on event loop shutdown Follow up to #96856, turns out this wasn't safe to remove after all. We can't go back to the previous solution though since that had double invocation issues => use notify-once for now until this is fixed in Netty. --- .../elasticsearch/transport/netty4/Netty4TcpChannel.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/Netty4TcpChannel.java b/modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/Netty4TcpChannel.java index 3956e04ba0aab..ad205c6f28783 100644 --- a/modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/Netty4TcpChannel.java +++ b/modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/Netty4TcpChannel.java @@ -20,6 +20,7 @@ import org.elasticsearch.core.IOUtils; import org.elasticsearch.core.Releasables; import org.elasticsearch.transport.TcpChannel; +import org.elasticsearch.transport.TransportException; import java.net.InetSocketAddress; @@ -161,7 +162,13 @@ public InetSocketAddress getRemoteAddress() { @Override public void sendMessage(BytesReference reference, ActionListener listener) { - channel.writeAndFlush(Netty4Utils.toByteBuf(reference), addPromise(listener, channel)); + // We need to both guard against double resolving the listener and not resolving it in case of event loop shutdown so we need to + // use #notifyOnce here until https://github.com/netty/netty/issues/8007 is resolved. + var wrapped = ActionListener.notifyOnce(listener); + channel.writeAndFlush(Netty4Utils.toByteBuf(reference), addPromise(wrapped, channel)); + if (channel.eventLoop().isShutdown()) { + wrapped.onFailure(new TransportException("Cannot send message, event loop is shutting down.")); + } } public Channel getNettyChannel() {