diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/ServerSocketSuspendTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/ServerSocketSuspendTest.java index cfcd8db9d6..32557291cf 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/ServerSocketSuspendTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/ServerSocketSuspendTest.java @@ -72,15 +72,19 @@ public class ServerSocketSuspendTest extends AbstractServerSocketTest { } } + Thread.sleep(TIMEOUT / 1000000); + try { long startTime = System.nanoTime(); for (int i = 0; i < NUM_CHANNELS; i ++) { + System.err.println(i + ": " + System.currentTimeMillis()); Socket s = new Socket(); s.connect(addr, 10000); sockets.add(s); } long endTime = System.nanoTime(); + System.err.println(endTime - startTime); Assert.assertTrue(endTime - startTime < TIMEOUT); } finally { for (Socket s: sockets) { diff --git a/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java b/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java index c57b4b2afc..c7fce485bc 100644 --- a/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java +++ b/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java @@ -17,17 +17,16 @@ package io.netty.bootstrap; import io.netty.buffer.MessageBuf; import io.netty.buffer.Unpooled; - import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInboundMessageHandler; import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInboundMessageHandler; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; +import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.ServerChannel; import io.netty.channel.socket.SocketChannel; @@ -232,6 +231,7 @@ public class ServerBootstrap extends AbstractBootstrap { try { childGroup.register(child); } catch (Throwable t) { + child.unsafe().closeForcibly(); logger.warn("Failed to register an accepted channel: " + child, t); } } diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index 46096f882d..49d854f82c 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -547,6 +547,15 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha } } + @Override + public final void closeForcibly() { + try { + doClose(); + } catch (Exception e) { + logger.warn("Failed to close a channel.", e); + } + } + @Override public final void deregister(final ChannelFuture future) { if (eventLoop().inEventLoop()) { diff --git a/transport/src/main/java/io/netty/channel/Channel.java b/transport/src/main/java/io/netty/channel/Channel.java index 788daedce8..ea0d3e6969 100755 --- a/transport/src/main/java/io/netty/channel/Channel.java +++ b/transport/src/main/java/io/netty/channel/Channel.java @@ -248,6 +248,12 @@ public interface Channel extends AttributeMap, ChannelOutboundInvoker, ChannelFu */ void close(ChannelFuture future); + /** + * Closes the {@link Channel} immediately without firing any events. Probably only useful + * when registration attempt failed. + */ + void closeForcibly(); + /** * Deregister the {@link Channel} of the {@link ChannelFuture} from {@link EventLoop} and notify the * {@link ChannelFuture} once the operation was complete. diff --git a/transport/src/main/java/io/netty/channel/socket/oio/OioEventLoopGroup.java b/transport/src/main/java/io/netty/channel/socket/oio/OioEventLoopGroup.java index d2232cadfe..75e65d8056 100644 --- a/transport/src/main/java/io/netty/channel/socket/oio/OioEventLoopGroup.java +++ b/transport/src/main/java/io/netty/channel/socket/oio/OioEventLoopGroup.java @@ -19,9 +19,9 @@ package io.netty.channel.socket.oio; import io.netty.channel.Channel; import io.netty.channel.ChannelException; import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelTaskScheduler; import io.netty.channel.EventLoop; import io.netty.channel.EventLoopGroup; -import io.netty.channel.ChannelTaskScheduler; import java.util.Collections; import java.util.Queue;