diff --git a/buildSrc/version.properties b/buildSrc/version.properties index afd6efb7d6fe2..3a50b7204d2e7 100644 --- a/buildSrc/version.properties +++ b/buildSrc/version.properties @@ -15,6 +15,8 @@ slf4j = 1.6.2 # when updating the JNA version, also update the version in buildSrc/build.gradle jna = 4.5.1 +netty = 4.1.30.Final + # test dependencies randomizedrunner = 2.7.0 junit = 4.12 diff --git a/modules/transport-netty4/build.gradle b/modules/transport-netty4/build.gradle index 16fddaad046b9..210b440ebb91a 100644 --- a/modules/transport-netty4/build.gradle +++ b/modules/transport-netty4/build.gradle @@ -34,13 +34,13 @@ compileTestJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-tr dependencies { // network stack - compile "io.netty:netty-buffer:4.1.16.Final" - compile "io.netty:netty-codec:4.1.16.Final" - compile "io.netty:netty-codec-http:4.1.16.Final" - compile "io.netty:netty-common:4.1.16.Final" - compile "io.netty:netty-handler:4.1.16.Final" - compile "io.netty:netty-resolver:4.1.16.Final" - compile "io.netty:netty-transport:4.1.16.Final" + compile "io.netty:netty-buffer:${versions.netty}" + compile "io.netty:netty-codec:${versions.netty}" + compile "io.netty:netty-codec-http:${versions.netty}" + compile "io.netty:netty-common:${versions.netty}" + compile "io.netty:netty-handler:${versions.netty}" + compile "io.netty:netty-resolver:${versions.netty}" + compile "io.netty:netty-transport:${versions.netty}" } dependencyLicenses { @@ -111,6 +111,7 @@ thirdPartyAudit.excludes = [ // from io.netty.util.internal.logging.InternalLoggerFactory (netty) - it's optional 'org.slf4j.Logger', 'org.slf4j.LoggerFactory', + 'org.slf4j.spi.LocationAwareLogger', 'com.google.protobuf.ExtensionRegistryLite', 'com.google.protobuf.MessageLiteOrBuilder', @@ -133,7 +134,6 @@ thirdPartyAudit.excludes = [ 'net.jpountz.xxhash.StreamingXXHash32', 'net.jpountz.xxhash.XXHashFactory', 'io.netty.internal.tcnative.CertificateRequestedCallback', - 'io.netty.internal.tcnative.CertificateRequestedCallback$KeyMaterial', 'io.netty.internal.tcnative.CertificateVerifier', 'io.netty.internal.tcnative.SessionTicketKey', 'io.netty.internal.tcnative.SniHostNameMatcher', @@ -146,6 +146,7 @@ thirdPartyAudit.excludes = [ 'io.netty.util.internal.PlatformDependent0$1', 'io.netty.util.internal.PlatformDependent0$2', 'io.netty.util.internal.PlatformDependent0$3', + 'io.netty.util.internal.PlatformDependent0$5', 'io.netty.util.internal.shaded.org.jctools.queues.BaseLinkedQueueConsumerNodeRef', 'io.netty.util.internal.shaded.org.jctools.queues.BaseLinkedQueueProducerNodeRef', 'io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields', @@ -160,7 +161,7 @@ thirdPartyAudit.excludes = [ 'org.conscrypt.AllocatedBuffer', 'org.conscrypt.BufferAllocator', - 'org.conscrypt.Conscrypt$Engines', + 'org.conscrypt.Conscrypt', 'org.conscrypt.HandshakeListener' ] diff --git a/modules/transport-netty4/licenses/netty-buffer-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-buffer-4.1.16.Final.jar.sha1 deleted file mode 100644 index c546222971985..0000000000000 --- a/modules/transport-netty4/licenses/netty-buffer-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -63b5fa95c74785e16f2c30ce268bc222e35c8cb5 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-buffer-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-buffer-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..070bb3f8332a9 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-buffer-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +597adb653306470fb3ec1af3c0f3f30a37b1310a \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-codec-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-codec-4.1.16.Final.jar.sha1 deleted file mode 100644 index 1e6c241ea0b17..0000000000000 --- a/modules/transport-netty4/licenses/netty-codec-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -d84a1f21768b7309c2954521cf5a1f46c2309eb1 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-codec-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-codec-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..cd0786f3e9f16 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-codec-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +515c8f609aaca28a94f984d89a9667dd3359c1b1 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-codec-http-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-codec-http-4.1.16.Final.jar.sha1 deleted file mode 100644 index 71c33af1c5fc2..0000000000000 --- a/modules/transport-netty4/licenses/netty-codec-http-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -d64312378b438dfdad84267c599a053327c6f02a \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-codec-http-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-codec-http-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..e795cce1ba081 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-codec-http-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +1384c630e8a0eeef33ad12a28791dce6e1d8767c \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-common-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-common-4.1.16.Final.jar.sha1 deleted file mode 100644 index 3edf5fcea59b3..0000000000000 --- a/modules/transport-netty4/licenses/netty-common-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -177a6b30cca92f6f5f9873c9befd681377a4c328 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-common-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-common-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..079e35ecc4c42 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-common-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +5dca0c34d8f38af51a2398614e81888f51cf811a \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-handler-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-handler-4.1.16.Final.jar.sha1 deleted file mode 100644 index cba27387268d1..0000000000000 --- a/modules/transport-netty4/licenses/netty-handler-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -fec0e63e7dd7f4eeef7ea8dc47a1ff32dfc7ebc2 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-handler-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-handler-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..50b87cdac13f6 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-handler-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +ecc076332ed103411347f4806a44ee32d9d9cb5f \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-resolver-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-resolver-4.1.16.Final.jar.sha1 deleted file mode 100644 index 3571d2ecfdc48..0000000000000 --- a/modules/transport-netty4/licenses/netty-resolver-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -f6eb553b53fb3a90a8ac1170697093fed82eae28 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-resolver-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-resolver-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..2ef4d8951431d --- /dev/null +++ b/modules/transport-netty4/licenses/netty-resolver-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +5106fd687066ffd712e5295d32af4e2ac6482613 \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-transport-4.1.16.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-transport-4.1.16.Final.jar.sha1 deleted file mode 100644 index e502d4c77084c..0000000000000 --- a/modules/transport-netty4/licenses/netty-transport-4.1.16.Final.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -3c8ee2c4d4a1cbb947a5c184c7aeb2204260958b \ No newline at end of file diff --git a/modules/transport-netty4/licenses/netty-transport-4.1.30.Final.jar.sha1 b/modules/transport-netty4/licenses/netty-transport-4.1.30.Final.jar.sha1 new file mode 100644 index 0000000000000..e4febd661cb42 --- /dev/null +++ b/modules/transport-netty4/licenses/netty-transport-4.1.30.Final.jar.sha1 @@ -0,0 +1 @@ +3d27bb432a3b125167ac161b26415ad29ec17f02 \ No newline at end of file diff --git a/modules/transport-netty4/src/main/plugin-metadata/plugin-security.policy b/modules/transport-netty4/src/main/plugin-metadata/plugin-security.policy index 32b2dc9bd1540..b8099025e47bf 100644 --- a/modules/transport-netty4/src/main/plugin-metadata/plugin-security.policy +++ b/modules/transport-netty4/src/main/plugin-metadata/plugin-security.policy @@ -23,6 +23,9 @@ grant codeBase "${codebase.netty-common}" { // netty makes and accepts socket connections permission java.net.SocketPermission "*", "accept,connect"; + + // Netty sets custom classloader for some of its internal threads + permission java.lang.RuntimePermission "*", "setContextClassLoader"; }; grant codeBase "${codebase.netty-transport}" { diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4BadRequestTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4BadRequestTests.java index 094f339059876..556c0fd01cff6 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4BadRequestTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4BadRequestTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.http.netty4; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.ReferenceCounted; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Settings; @@ -92,6 +93,7 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { final Collection responses = nettyHttpClient.get(transportAddress.address(), "/_cluster/settings?pretty=%"); + try { assertThat(responses, hasSize(1)); assertThat(responses.iterator().next().status().code(), equalTo(400)); final Collection responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses); @@ -101,6 +103,9 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC responseBodies.iterator().next(), containsString( "\"reason\":\"java.lang.IllegalArgumentException: unterminated escape sequence at end of string: %\"")); + } finally { + responses.forEach(ReferenceCounted::release); + } } } } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpRequestSizeLimitIT.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpRequestSizeLimitIT.java index d99820bb86465..0ab9f4bbc1055 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpRequestSizeLimitIT.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpRequestSizeLimitIT.java @@ -20,6 +20,7 @@ package org.elasticsearch.http.netty4; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.ReferenceCounted; import org.elasticsearch.ESNetty4IntegTestCase; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.network.NetworkModule; @@ -80,17 +81,25 @@ public void testLimitsInFlightRequests() throws Exception { } HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class); - TransportAddress transportAddress = (TransportAddress) randomFrom(httpServerTransport.boundAddress + TransportAddress transportAddress = randomFrom(httpServerTransport.boundAddress ().boundAddresses()); try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection singleResponse = nettyHttpClient.post(transportAddress.address(), requests[0]); - assertThat(singleResponse, hasSize(1)); - assertAtLeastOnceExpectedStatus(singleResponse, HttpResponseStatus.OK); + try { + assertThat(singleResponse, hasSize(1)); + assertAtLeastOnceExpectedStatus(singleResponse, HttpResponseStatus.OK); + } finally { + singleResponse.forEach(ReferenceCounted::release); + } Collection multipleResponses = nettyHttpClient.post(transportAddress.address(), requests); - assertThat(multipleResponses, hasSize(requests.length)); - assertAtLeastOnceExpectedStatus(multipleResponses, HttpResponseStatus.SERVICE_UNAVAILABLE); + try { + assertThat(multipleResponses, hasSize(requests.length)); + assertAtLeastOnceExpectedStatus(multipleResponses, HttpResponseStatus.SERVICE_UNAVAILABLE); + } finally { + multipleResponses.forEach(ReferenceCounted::release); + } } } @@ -105,13 +114,17 @@ public void testDoesNotLimitExcludedRequests() throws Exception { } HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class); - TransportAddress transportAddress = (TransportAddress) randomFrom(httpServerTransport.boundAddress + TransportAddress transportAddress = randomFrom(httpServerTransport.boundAddress ().boundAddresses()); try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection responses = nettyHttpClient.put(transportAddress.address(), requestUris); - assertThat(responses, hasSize(requestUris.length)); - assertAllInExpectedStatus(responses, HttpResponseStatus.OK); + try { + assertThat(responses, hasSize(requestUris.length)); + assertAllInExpectedStatus(responses, HttpResponseStatus.OK); + } finally { + responses.forEach(ReferenceCounted::release); + } } } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java index 77f8ec29db514..9dd97cb97d48a 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java @@ -32,6 +32,7 @@ import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; +import io.netty.util.ReferenceCounted; import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; @@ -108,8 +109,12 @@ public void testThatHttpPipeliningWorksWhenEnabled() throws Exception { try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection responses = nettyHttpClient.get(transportAddress.address(), requests.toArray(new String[]{})); - Collection responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses); - assertThat(responseBodies, contains(requests.toArray())); + try { + Collection responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses); + assertThat(responseBodies, contains(requests.toArray())); + } finally { + responses.forEach(ReferenceCounted::release); + } } } @@ -139,21 +144,25 @@ public void testThatHttpPipeliningCanBeDisabled() throws Exception { try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection responses = nettyHttpClient.get(transportAddress.address(), requests.toArray(new String[]{})); - List responseBodies = new ArrayList<>(Netty4HttpClient.returnHttpResponseBodies(responses)); - // we can not be sure about the order of the responses, but the slow ones should come last - assertThat(responseBodies, hasSize(numberOfRequests)); - for (int i = 0; i < numberOfRequests - slowIds.size(); i++) { - assertThat(responseBodies.get(i), matches("/\\d+")); - } + try { + List responseBodies = new ArrayList<>(Netty4HttpClient.returnHttpResponseBodies(responses)); + // we can not be sure about the order of the responses, but the slow ones should come last + assertThat(responseBodies, hasSize(numberOfRequests)); + for (int i = 0; i < numberOfRequests - slowIds.size(); i++) { + assertThat(responseBodies.get(i), matches("/\\d+")); + } - final Set ids = new HashSet<>(); - for (int i = 0; i < slowIds.size(); i++) { - final String response = responseBodies.get(numberOfRequests - slowIds.size() + i); - assertThat(response, matches("/slow/\\d+" )); - assertTrue(ids.add(Integer.parseInt(response.split("/")[2]))); - } + final Set ids = new HashSet<>(); + for (int i = 0; i < slowIds.size(); i++) { + final String response = responseBodies.get(numberOfRequests - slowIds.size() + i); + assertThat(response, matches("/slow/\\d+")); + assertTrue(ids.add(Integer.parseInt(response.split("/")[2]))); + } - assertThat(slowIds, equalTo(ids)); + assertThat(slowIds, equalTo(ids)); + } finally { + responses.forEach(ReferenceCounted::release); + } } } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java index ed45f774f0c45..91a077cdcf220 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java @@ -220,14 +220,23 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC HttpUtil.setContentLength(request, contentLength); final FullHttpResponse response = client.post(remoteAddress.address(), request); - assertThat(response.status(), equalTo(expectedStatus)); - if (expectedStatus.equals(HttpResponseStatus.CONTINUE)) { - final FullHttpRequest continuationRequest = - new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", Unpooled.EMPTY_BUFFER); - final FullHttpResponse continuationResponse = client.post(remoteAddress.address(), continuationRequest); - - assertThat(continuationResponse.status(), is(HttpResponseStatus.OK)); - assertThat(new String(ByteBufUtil.getBytes(continuationResponse.content()), StandardCharsets.UTF_8), is("done")); + try { + assertThat(response.status(), equalTo(expectedStatus)); + if (expectedStatus.equals(HttpResponseStatus.CONTINUE)) { + final FullHttpRequest continuationRequest = + new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", Unpooled.EMPTY_BUFFER); + final FullHttpResponse continuationResponse = client.post(remoteAddress.address(), continuationRequest); + try { + assertThat(continuationResponse.status(), is(HttpResponseStatus.OK)); + assertThat( + new String(ByteBufUtil.getBytes(continuationResponse.content()), StandardCharsets.UTF_8), is("done") + ); + } finally { + continuationResponse.release(); + } + } + } finally { + response.release(); } } } @@ -293,10 +302,14 @@ public void dispatchBadRequest(final RestRequest request, final FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, url); final FullHttpResponse response = client.post(remoteAddress.address(), request); - assertThat(response.status(), equalTo(HttpResponseStatus.BAD_REQUEST)); - assertThat( + try { + assertThat(response.status(), equalTo(HttpResponseStatus.BAD_REQUEST)); + assertThat( new String(response.content().array(), Charset.forName("UTF-8")), containsString("you sent a bad request and you should feel bad")); + } finally { + response.release(); + } } } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningDisabledIT.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningDisabledIT.java index 9f117d4ee21fc..9c36639a9f0a6 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningDisabledIT.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningDisabledIT.java @@ -19,6 +19,7 @@ package org.elasticsearch.http.netty4; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.ReferenceCounted; import org.elasticsearch.ESNetty4IntegTestCase; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; @@ -53,15 +54,19 @@ public void testThatNettyHttpServerDoesNotSupportPipelining() throws Exception { HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class); TransportAddress[] boundAddresses = httpServerTransport.boundAddress().boundAddresses(); - TransportAddress transportAddress = (TransportAddress) randomFrom(boundAddresses); + TransportAddress transportAddress = randomFrom(boundAddresses); try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection responses = nettyHttpClient.get(transportAddress.address(), requests); - assertThat(responses, hasSize(requests.length)); + try { + assertThat(responses, hasSize(requests.length)); - List opaqueIds = new ArrayList<>(Netty4HttpClient.returnOpaqueIds(responses)); + List opaqueIds = new ArrayList<>(Netty4HttpClient.returnOpaqueIds(responses)); - assertResponsesOutOfOrder(opaqueIds); + assertResponsesOutOfOrder(opaqueIds); + } finally { + responses.forEach(ReferenceCounted::release); + } } } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningEnabledIT.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningEnabledIT.java index cc3f22be453fb..95f0ce301dd18 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningEnabledIT.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningEnabledIT.java @@ -20,6 +20,7 @@ package org.elasticsearch.http.netty4; import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.util.ReferenceCounted; import org.elasticsearch.ESNetty4IntegTestCase; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; @@ -51,14 +52,18 @@ public void testThatNettyHttpServerSupportsPipelining() throws Exception { HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class); TransportAddress[] boundAddresses = httpServerTransport.boundAddress().boundAddresses(); - TransportAddress transportAddress = (TransportAddress) randomFrom(boundAddresses); + TransportAddress transportAddress = randomFrom(boundAddresses); try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) { Collection responses = nettyHttpClient.get(transportAddress.address(), requests); - assertThat(responses, hasSize(5)); + try { + assertThat(responses, hasSize(5)); - Collection opaqueIds = Netty4HttpClient.returnOpaqueIds(responses); - assertOpaqueIdsInOrder(opaqueIds); + Collection opaqueIds = Netty4HttpClient.returnOpaqueIds(responses); + assertOpaqueIdsInOrder(opaqueIds); + } finally { + responses.forEach(ReferenceCounted::release); + } } } diff --git a/x-pack/plugin/core/src/main/plugin-metadata/plugin-security.policy b/x-pack/plugin/core/src/main/plugin-metadata/plugin-security.policy index 0cd7a32bcc47b..70abb67a76240 100644 --- a/x-pack/plugin/core/src/main/plugin-metadata/plugin-security.policy +++ b/x-pack/plugin/core/src/main/plugin-metadata/plugin-security.policy @@ -15,6 +15,8 @@ grant { grant codeBase "${codebase.netty-common}" { // for reading the system-wide configuration for the backlog of established sockets permission java.io.FilePermission "/proc/sys/net/core/somaxconn", "read"; + // Netty sets custom classloader for some of its internal threads + permission java.lang.RuntimePermission "*", "setContextClassLoader"; }; grant codeBase "${codebase.netty-transport}" {