From e3925be90771e17ac9c5ac860bbb7499b088074f Mon Sep 17 00:00:00 2001 From: Scott Mitchell Date: Mon, 15 Sep 2014 14:20:56 -0400 Subject: [PATCH] HTTP/2 Unit Tests EventLoopGroup cleanup Motivation: The HTTP/2 unit tests are suffering from OOME on the master branch. These unit tests allocating a large number of threads (~706 peak live) which may be related to this memory pressure. Modifications: Each EventLoopGroup shutdown operation will have a `sync()` call. Result: Lower peek live thread count and less associated memory pressure. --- .../codec/http2/DataCompressionHttp2Test.java | 11 ++++++++--- .../DelegatingHttp2HttpConnectionHandlerTest.java | 11 ++++++++--- .../codec/http2/Http2ConnectionRoundtripTest.java | 10 +++++++--- .../codec/http2/Http2FrameRoundtripTest.java | 11 ++++++++--- .../codec/http2/InboundHttp2ToHttpAdapterTest.java | 11 ++++++++--- .../io/netty/handler/ssl/JettySslEngineTest.java | 14 +++++++++----- 6 files changed, 48 insertions(+), 20 deletions(-) diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/DataCompressionHttp2Test.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/DataCompressionHttp2Test.java index ae9b3bb097..533ff7e7e7 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/DataCompressionHttp2Test.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/DataCompressionHttp2Test.java @@ -43,10 +43,12 @@ import io.netty.handler.codec.compression.ZlibWrapper; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http2.Http2TestUtil.Http2Runnable; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -134,9 +136,12 @@ public class DataCompressionHttp2Test { dataCapture = null; } serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); serverAdapter = null; clientAdapter = null; serverConnection = null; diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/DelegatingHttp2HttpConnectionHandlerTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/DelegatingHttp2HttpConnectionHandlerTest.java index 21023f1138..4dc25a31e3 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/DelegatingHttp2HttpConnectionHandlerTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/DelegatingHttp2HttpConnectionHandlerTest.java @@ -47,10 +47,12 @@ import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -129,9 +131,12 @@ public class DelegatingHttp2HttpConnectionHandlerTest { capturedData = null; } serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); } @Test diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2ConnectionRoundtripTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2ConnectionRoundtripTest.java index 2ec7a572a0..9ac1f5bd8c 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2ConnectionRoundtripTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2ConnectionRoundtripTest.java @@ -41,6 +41,7 @@ import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http2.Http2TestUtil.Http2Runnable; import io.netty.util.CharsetUtil; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.List; @@ -122,9 +123,12 @@ public class Http2ConnectionRoundtripTest { @After public void teardown() throws Exception { serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); } @Test diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameRoundtripTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameRoundtripTest.java index d5e48cdc73..7c5c235863 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameRoundtripTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameRoundtripTest.java @@ -40,10 +40,12 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http2.Http2TestUtil.Http2Runnable; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -118,9 +120,12 @@ public class Http2FrameRoundtripTest { capturedData.get(i).release(); } serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); serverAdapter = null; } diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/InboundHttp2ToHttpAdapterTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/InboundHttp2ToHttpAdapterTest.java index b4cc72e98b..f58d3ab348 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/InboundHttp2ToHttpAdapterTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/InboundHttp2ToHttpAdapterTest.java @@ -46,10 +46,12 @@ import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http2.Http2TestUtil.Http2Runnable; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -145,9 +147,12 @@ public class InboundHttp2ToHttpAdapterTest { cleanupCapturedRequests(); cleanupCapturedResponses(); serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); clientDelegator = null; serverDelegator = null; clientChannel = null; diff --git a/handler/src/test/java/io/netty/handler/ssl/JettySslEngineTest.java b/handler/src/test/java/io/netty/handler/ssl/JettySslEngineTest.java index 0bbbd90291..c46c1668bf 100644 --- a/handler/src/test/java/io/netty/handler/ssl/JettySslEngineTest.java +++ b/handler/src/test/java/io/netty/handler/ssl/JettySslEngineTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeNoException; +import static org.mockito.Mockito.verify; import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; @@ -35,6 +36,7 @@ import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import io.netty.handler.ssl.util.SelfSignedCertificate; import io.netty.util.NetUtil; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.security.cert.CertificateException; @@ -51,7 +53,6 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.verify; public class JettySslEngineTest { private static final String APPLICATION_LEVEL_PROTOCOL = "my-protocol"; @@ -102,9 +103,12 @@ public class JettySslEngineTest { public void tearDown() throws InterruptedException { if (serverChannel != null) { serverChannel.close().sync(); - sb.group().shutdownGracefully(); - sb.childGroup().shutdownGracefully(); - cb.group().shutdownGracefully(); + Future serverGroup = sb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future serverChildGroup = sb.childGroup().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + Future clientGroup = cb.group().shutdownGracefully(0, 0, TimeUnit.MILLISECONDS); + serverGroup.sync(); + serverChildGroup.sync(); + clientGroup.sync(); } clientChannel = null; serverChannel = null; @@ -206,7 +210,7 @@ public class JettySslEngineTest { } private static void writeAndVerifyReceived(ByteBuf message, Channel sendChannel, CountDownLatch receiverLatch, - MessageReciever receiver) throws Exception { + MessageReciever receiver) throws Exception { List dataCapture = null; try { sendChannel.writeAndFlush(message);