From 30e9d351dba48a0a5a6e94e194b2f4eeeb5100ff Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 1 Aug 2023 00:20:41 +0200 Subject: [PATCH] Register NioSocketChannel NioSocketChannel must be bound to an Eventloop during close(). This patch adds the smarts to associate it. JIRA: NETCONF-1030 Change-Id: I0fcb2d130f38f4f44c4c9979d81ea8c2e611b0a6 Signed-off-by: Robert Varga (cherry picked from commit 14538c723ef4888de48625e55c9cfa09c2410c50) --- transport/transport-tcp/pom.xml | 7 ---- .../transport/tcp/NettyTransportSupport.java | 2 +- .../netconf/transport/tcp/NioNettyImpl.java | 32 +++++++++++++++---- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/transport/transport-tcp/pom.xml b/transport/transport-tcp/pom.xml index 3100b233c9..be8b13c3d4 100644 --- a/transport/transport-tcp/pom.xml +++ b/transport/transport-tcp/pom.xml @@ -59,13 +59,6 @@ org.opendaylight.netconf transport-api - - - io.netty - netty-transport-native-epoll - linux-x86_64 - test - diff --git a/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NettyTransportSupport.java b/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NettyTransportSupport.java index e89c700ef7..ed12a12227 100644 --- a/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NettyTransportSupport.java +++ b/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NettyTransportSupport.java @@ -30,7 +30,7 @@ import org.slf4j.LoggerFactory; @NonNullByDefault public final class NettyTransportSupport { private static final Logger LOG = LoggerFactory.getLogger(NettyTransportSupport.class); - private static final AbstractNettyImpl IMPL = Epoll.isAvailable() ? new EpollNettyImpl() : new NioNettyImpl(); + private static final AbstractNettyImpl IMPL = Epoll.isAvailable() ? new EpollNettyImpl() : NioNettyImpl.INSTANCE; static { LOG.info("Netty transport backed by {}", IMPL); diff --git a/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NioNettyImpl.java b/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NioNettyImpl.java index 3e1f93cf45..c25f9b7db4 100644 --- a/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NioNettyImpl.java +++ b/transport/transport-tcp/src/main/java/org/opendaylight/netconf/transport/tcp/NioNettyImpl.java @@ -98,17 +98,37 @@ final class NioNettyImpl extends AbstractNettyImpl { SUPPORT = support; } - private final boolean supportsKeepalives; + static final NioNettyImpl INSTANCE; - NioNettyImpl() { - final var ch = new NioSocketChannel(); + static { + final var grp = new NioEventLoopGroup(); try { - supportsKeepalives = SUPPORT.configureKeepalives(ch.config()); - } finally { - ch.close(); + try { + final var ch = new NioSocketChannel(); + grp.register(ch).sync(); + + final boolean supportsKeepalives; + try { + supportsKeepalives = SUPPORT.configureKeepalives(ch.config()); + } finally { + ch.close().sync(); + } + INSTANCE = new NioNettyImpl(supportsKeepalives); + } finally { + grp.shutdownGracefully().sync(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ExceptionInInitializerError(e); } } + private final boolean supportsKeepalives; + + private NioNettyImpl(final boolean supportsKeepalives) { + this.supportsKeepalives = supportsKeepalives; + } + @Override Class channelClass() { return NioSocketChannel.class; -- 2.36.6