[#4241] Ensure NioEventLoopGroup.shutdownGracefully(...) with no quiet period shutdown as fast as expected.
Motivation: If the user uses 0 as quiet period we should shutdown without any delay if possible. Modifications: Ensure we not introduce extra delay when a shutdown quit period of 0 is used. Result: EventLoop shutdown as fast as expected.
This commit is contained in:
parent
76a3ea699d
commit
aa6e6ae307
@ -696,7 +696,12 @@ public abstract class SingleThreadEventExecutor extends AbstractScheduledEventEx
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// There were tasks in the queue. Wait a little bit more until no tasks are queued for the quiet period.
|
// There were tasks in the queue. Wait a little bit more until no tasks are queued for the quiet period or
|
||||||
|
// terminate if the quiet period is 0.
|
||||||
|
// See https://github.com/netty/netty/issues/4241
|
||||||
|
if (gracefulShutdownQuietPeriod == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
wakeup(true);
|
wakeup(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,11 @@ import io.netty.channel.socket.SocketChannel;
|
|||||||
import io.netty.util.concurrent.DefaultEventExecutorGroup;
|
import io.netty.util.concurrent.DefaultEventExecutorGroup;
|
||||||
import io.netty.util.concurrent.EventExecutor;
|
import io.netty.util.concurrent.EventExecutor;
|
||||||
import io.netty.util.concurrent.EventExecutorGroup;
|
import io.netty.util.concurrent.EventExecutorGroup;
|
||||||
|
import io.netty.util.concurrent.Future;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public abstract class AbstractEventLoopTest {
|
public abstract class AbstractEventLoopTest {
|
||||||
@ -60,6 +63,24 @@ public abstract class AbstractEventLoopTest {
|
|||||||
assertSame(executor, future.channel().pipeline().context(TestChannelHandler2.class).executor());
|
assertSame(executor, future.channel().pipeline().context(TestChannelHandler2.class).executor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 5000)
|
||||||
|
public void testShutdownGracefullyNoQuietPeriod() throws Exception {
|
||||||
|
EventLoopGroup loop = newEventLoopGroup();
|
||||||
|
ServerBootstrap b = new ServerBootstrap();
|
||||||
|
b.group(loop)
|
||||||
|
.channel(newChannel())
|
||||||
|
.childHandler(new ChannelInboundHandlerAdapter());
|
||||||
|
|
||||||
|
// Not close the Channel to ensure the EventLoop is still shutdown in time.
|
||||||
|
b.bind(0).sync().channel();
|
||||||
|
|
||||||
|
Future<?> f = loop.shutdownGracefully(0, 1, TimeUnit.MINUTES);
|
||||||
|
assertTrue(loop.awaitTermination(2, TimeUnit.SECONDS));
|
||||||
|
assertTrue(f.syncUninterruptibly().isSuccess());
|
||||||
|
assertTrue(loop.isShutdown());
|
||||||
|
assertTrue(loop.isTerminated());
|
||||||
|
}
|
||||||
|
|
||||||
private static final class TestChannelHandler extends ChannelDuplexHandler { }
|
private static final class TestChannelHandler extends ChannelDuplexHandler { }
|
||||||
|
|
||||||
private static final class TestChannelHandler2 extends ChannelDuplexHandler {
|
private static final class TestChannelHandler2 extends ChannelDuplexHandler {
|
||||||
|
Loading…
Reference in New Issue
Block a user