I think it may also not be unregistering closed datagram sockets, but I haven't traced that.
 Sounds like a bug... will investigate
 Fixed... sorry for the delay.

EpollDatagramChannel never calls fireChannelActive() after connect()
NioDatagramChannel extends AbstractNioChannel and AbstractNioUnsafe call fulfillConnectPromise(), which calls fireChannelActive()

AbstractEpollUnsafe and EpollDatagramChannel have no equivalent call, so channelActive() is never called on the pipeline.

transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java
transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java
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 f3809865c08..53465608bf0 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
@@ -483,6 +483,7 @@ public void connect(SocketAddress remote, SocketAddress local, ChannelPromise ch
             boolean success = false;
             try {
                 try {
+                    boolean wasActive = isActive();
                     InetSocketAddress remoteAddress = (InetSocketAddress) remote;
                     if (local != null) {
                         InetSocketAddress localAddress = (InetSocketAddress) local;
@@ -493,6 +494,12 @@ public void connect(SocketAddress remote, SocketAddress local, ChannelPromise ch
                     EpollDatagramChannel.this.remote = remoteAddress;
                     EpollDatagramChannel.this.local = Native.localAddress(fd().intValue());
                     success = true;
+
+                    // Regardless if the connection attempt was cancelled, channelActive() event should be triggered,
+                    // because what happened is what happened.
+                    if (!wasActive && isActive()) {
+                        pipeline().fireChannelActive();
+                    }
                 } finally {
                     if (!success) {
                         doClose();
