From 3ad037470ec4677a7e1e1cee476c1b752603aab7 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Thu, 19 Sep 2019 08:51:10 +0200 Subject: [PATCH] Correctly reset cached local and remote address when disconnect() is called (#9545) Motivation: We should correctly reset the cached local and remote address when a Channel.disconnect() is called and the channel has a notion of disconnect vs close (for example DatagramChannel implementations). Modifications: - Correctly reset cached kicak abd remote address - Update testcase to cover it and so ensure all transports work in a consistent way Result: Correctly handle disconnect() --- .../testsuite/transport/socket/DatagramUnicastTest.java | 5 +++++ .../java/io/netty/channel/epoll/AbstractEpollChannel.java | 5 +++++ .../java/io/netty/channel/epoll/EpollDatagramChannel.java | 1 + .../java/io/netty/channel/kqueue/AbstractKQueueChannel.java | 5 +++++ .../java/io/netty/channel/kqueue/KQueueDatagramChannel.java | 1 + .../src/main/java/io/netty/channel/AbstractChannel.java | 3 +++ 6 files changed, 20 insertions(+) diff --git a/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java b/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java index 9bd8f38b38..aca8b607be 100644 --- a/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java +++ b/testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramUnicastTest.java @@ -298,9 +298,14 @@ public class DatagramUnicastTest extends AbstractDatagramTest { } assertTrue(cc.isConnected()); + assertNotNull(cc.localAddress()); + assertNotNull(cc.remoteAddress()); + // Test what happens when we call disconnect() cc.disconnect().syncUninterruptibly(); assertFalse(cc.isConnected()); + assertNotNull(cc.localAddress()); + assertNull(cc.remoteAddress()); ChannelFuture future = cc.writeAndFlush( buf.retain().duplicate()).awaitUninterruptibly(); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java index 2f26e0731f..41354197ce 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java @@ -191,6 +191,11 @@ abstract class AbstractEpollChannel extends AbstractChannel implements UnixChann } } + void resetCachedAddresses() { + local = socket.localAddress(); + remote = socket.remoteAddress(); + } + @Override protected void doDisconnect() throws Exception { doClose(); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java index c28484806a..cb611ab41d 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java @@ -453,6 +453,7 @@ public final class EpollDatagramChannel extends AbstractEpollChannel implements protected void doDisconnect() throws Exception { socket.disconnect(); connected = active = false; + resetCachedAddresses(); } @Override diff --git a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java index c38a338e77..02d2a1c28d 100644 --- a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java +++ b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/AbstractKQueueChannel.java @@ -132,6 +132,11 @@ abstract class AbstractKQueueChannel extends AbstractChannel implements UnixChan doClose(); } + void resetCachedAddresses() { + local = socket.localAddress(); + remote = socket.remoteAddress(); + } + @Override protected boolean isCompatible(EventLoop loop) { return loop instanceof KQueueEventLoop; diff --git a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java index c23f61a41c..60ca51fecd 100644 --- a/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java +++ b/transport-native-kqueue/src/main/java/io/netty/channel/kqueue/KQueueDatagramChannel.java @@ -386,6 +386,7 @@ public final class KQueueDatagramChannel extends AbstractKQueueChannel implement protected void doDisconnect() throws Exception { socket.disconnect(); connected = active = false; + resetCachedAddresses(); } @Override diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index 0129f10e45..48e6a3a24c 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -578,6 +578,9 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha boolean wasActive = isActive(); try { doDisconnect(); + // Reset remoteAddress and localAddress + remoteAddress = null; + localAddress = null; } catch (Throwable t) { safeSetFailure(promise, t); closeIfClosed();