Skip to content

Commit 9ce0acf

Browse files
NETWORKING: Upgrade Netty to 4.1.30 (#34417) (#34441)
* NETWORKING: Upgrade Netty to 4.1.30 (#34417) * closes #34411
1 parent 1c6c21f commit 9ce0acf

24 files changed

+115
-57
lines changed

buildSrc/version.properties

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ slf4j = 1.6.2
1515
# when updating the JNA version, also update the version in buildSrc/build.gradle
1616
jna = 4.5.1
1717

18+
netty = 4.1.30.Final
19+
1820
# test dependencies
1921
randomizedrunner = 2.7.0
2022
junit = 4.12

modules/transport-netty4/build.gradle

+10-9
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ compileTestJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-tr
3434

3535
dependencies {
3636
// network stack
37-
compile "io.netty:netty-buffer:4.1.16.Final"
38-
compile "io.netty:netty-codec:4.1.16.Final"
39-
compile "io.netty:netty-codec-http:4.1.16.Final"
40-
compile "io.netty:netty-common:4.1.16.Final"
41-
compile "io.netty:netty-handler:4.1.16.Final"
42-
compile "io.netty:netty-resolver:4.1.16.Final"
43-
compile "io.netty:netty-transport:4.1.16.Final"
37+
compile "io.netty:netty-buffer:${versions.netty}"
38+
compile "io.netty:netty-codec:${versions.netty}"
39+
compile "io.netty:netty-codec-http:${versions.netty}"
40+
compile "io.netty:netty-common:${versions.netty}"
41+
compile "io.netty:netty-handler:${versions.netty}"
42+
compile "io.netty:netty-resolver:${versions.netty}"
43+
compile "io.netty:netty-transport:${versions.netty}"
4444
}
4545

4646
dependencyLicenses {
@@ -111,6 +111,7 @@ thirdPartyAudit.excludes = [
111111
// from io.netty.util.internal.logging.InternalLoggerFactory (netty) - it's optional
112112
'org.slf4j.Logger',
113113
'org.slf4j.LoggerFactory',
114+
'org.slf4j.spi.LocationAwareLogger',
114115

115116
'com.google.protobuf.ExtensionRegistryLite',
116117
'com.google.protobuf.MessageLiteOrBuilder',
@@ -133,7 +134,6 @@ thirdPartyAudit.excludes = [
133134
'net.jpountz.xxhash.StreamingXXHash32',
134135
'net.jpountz.xxhash.XXHashFactory',
135136
'io.netty.internal.tcnative.CertificateRequestedCallback',
136-
'io.netty.internal.tcnative.CertificateRequestedCallback$KeyMaterial',
137137
'io.netty.internal.tcnative.CertificateVerifier',
138138
'io.netty.internal.tcnative.SessionTicketKey',
139139
'io.netty.internal.tcnative.SniHostNameMatcher',
@@ -146,6 +146,7 @@ thirdPartyAudit.excludes = [
146146
'io.netty.util.internal.PlatformDependent0$1',
147147
'io.netty.util.internal.PlatformDependent0$2',
148148
'io.netty.util.internal.PlatformDependent0$3',
149+
'io.netty.util.internal.PlatformDependent0$5',
149150
'io.netty.util.internal.shaded.org.jctools.queues.BaseLinkedQueueConsumerNodeRef',
150151
'io.netty.util.internal.shaded.org.jctools.queues.BaseLinkedQueueProducerNodeRef',
151152
'io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields',
@@ -160,7 +161,7 @@ thirdPartyAudit.excludes = [
160161

161162
'org.conscrypt.AllocatedBuffer',
162163
'org.conscrypt.BufferAllocator',
163-
'org.conscrypt.Conscrypt$Engines',
164+
'org.conscrypt.Conscrypt',
164165
'org.conscrypt.HandshakeListener'
165166
]
166167

modules/transport-netty4/licenses/netty-buffer-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
597adb653306470fb3ec1af3c0f3f30a37b1310a

modules/transport-netty4/licenses/netty-codec-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
515c8f609aaca28a94f984d89a9667dd3359c1b1

modules/transport-netty4/licenses/netty-codec-http-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1384c630e8a0eeef33ad12a28791dce6e1d8767c

modules/transport-netty4/licenses/netty-common-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5dca0c34d8f38af51a2398614e81888f51cf811a

modules/transport-netty4/licenses/netty-handler-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ecc076332ed103411347f4806a44ee32d9d9cb5f

modules/transport-netty4/licenses/netty-resolver-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5106fd687066ffd712e5295d32af4e2ac6482613

modules/transport-netty4/licenses/netty-transport-4.1.16.Final.jar.sha1

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3d27bb432a3b125167ac161b26415ad29ec17f02

modules/transport-netty4/src/main/plugin-metadata/plugin-security.policy

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ grant codeBase "${codebase.netty-common}" {
2323

2424
// netty makes and accepts socket connections
2525
permission java.net.SocketPermission "*", "accept,connect";
26+
27+
// Netty sets custom classloader for some of its internal threads
28+
permission java.lang.RuntimePermission "*", "setContextClassLoader";
2629
};
2730

2831
grant codeBase "${codebase.netty-transport}" {

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4BadRequestTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.http.netty4;
2121

2222
import io.netty.handler.codec.http.FullHttpResponse;
23+
import io.netty.util.ReferenceCounted;
2324
import org.elasticsearch.ElasticsearchException;
2425
import org.elasticsearch.common.network.NetworkService;
2526
import org.elasticsearch.common.settings.Settings;
@@ -92,6 +93,7 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC
9293
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
9394
final Collection<FullHttpResponse> responses =
9495
nettyHttpClient.get(transportAddress.address(), "/_cluster/settings?pretty=%");
96+
try {
9597
assertThat(responses, hasSize(1));
9698
assertThat(responses.iterator().next().status().code(), equalTo(400));
9799
final Collection<String> responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses);
@@ -101,6 +103,9 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC
101103
responseBodies.iterator().next(),
102104
containsString(
103105
"\"reason\":\"java.lang.IllegalArgumentException: unterminated escape sequence at end of string: %\""));
106+
} finally {
107+
responses.forEach(ReferenceCounted::release);
108+
}
104109
}
105110
}
106111
}

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpRequestSizeLimitIT.java

+21-8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.http.netty4;
2121

2222
import io.netty.handler.codec.http.FullHttpResponse;
23+
import io.netty.util.ReferenceCounted;
2324
import org.elasticsearch.ESNetty4IntegTestCase;
2425
import org.elasticsearch.common.collect.Tuple;
2526
import org.elasticsearch.common.network.NetworkModule;
@@ -80,17 +81,25 @@ public void testLimitsInFlightRequests() throws Exception {
8081
}
8182

8283
HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class);
83-
TransportAddress transportAddress = (TransportAddress) randomFrom(httpServerTransport.boundAddress
84+
TransportAddress transportAddress = randomFrom(httpServerTransport.boundAddress
8485
().boundAddresses());
8586

8687
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
8788
Collection<FullHttpResponse> singleResponse = nettyHttpClient.post(transportAddress.address(), requests[0]);
88-
assertThat(singleResponse, hasSize(1));
89-
assertAtLeastOnceExpectedStatus(singleResponse, HttpResponseStatus.OK);
89+
try {
90+
assertThat(singleResponse, hasSize(1));
91+
assertAtLeastOnceExpectedStatus(singleResponse, HttpResponseStatus.OK);
92+
} finally {
93+
singleResponse.forEach(ReferenceCounted::release);
94+
}
9095

9196
Collection<FullHttpResponse> multipleResponses = nettyHttpClient.post(transportAddress.address(), requests);
92-
assertThat(multipleResponses, hasSize(requests.length));
93-
assertAtLeastOnceExpectedStatus(multipleResponses, HttpResponseStatus.SERVICE_UNAVAILABLE);
97+
try {
98+
assertThat(multipleResponses, hasSize(requests.length));
99+
assertAtLeastOnceExpectedStatus(multipleResponses, HttpResponseStatus.SERVICE_UNAVAILABLE);
100+
} finally {
101+
multipleResponses.forEach(ReferenceCounted::release);
102+
}
94103
}
95104
}
96105

@@ -105,13 +114,17 @@ public void testDoesNotLimitExcludedRequests() throws Exception {
105114
}
106115

107116
HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class);
108-
TransportAddress transportAddress = (TransportAddress) randomFrom(httpServerTransport.boundAddress
117+
TransportAddress transportAddress = randomFrom(httpServerTransport.boundAddress
109118
().boundAddresses());
110119

111120
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
112121
Collection<FullHttpResponse> responses = nettyHttpClient.put(transportAddress.address(), requestUris);
113-
assertThat(responses, hasSize(requestUris.length));
114-
assertAllInExpectedStatus(responses, HttpResponseStatus.OK);
122+
try {
123+
assertThat(responses, hasSize(requestUris.length));
124+
assertAllInExpectedStatus(responses, HttpResponseStatus.OK);
125+
} finally {
126+
responses.forEach(ReferenceCounted::release);
127+
}
115128
}
116129
}
117130

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java

+24-15
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.netty.handler.codec.http.HttpHeaderNames;
3333
import io.netty.handler.codec.http.HttpResponseStatus;
3434
import io.netty.handler.codec.http.HttpVersion;
35+
import io.netty.util.ReferenceCounted;
3536
import org.elasticsearch.common.network.NetworkService;
3637
import org.elasticsearch.common.settings.Setting;
3738
import org.elasticsearch.common.settings.Settings;
@@ -108,8 +109,12 @@ public void testThatHttpPipeliningWorksWhenEnabled() throws Exception {
108109

109110
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
110111
Collection<FullHttpResponse> responses = nettyHttpClient.get(transportAddress.address(), requests.toArray(new String[]{}));
111-
Collection<String> responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses);
112-
assertThat(responseBodies, contains(requests.toArray()));
112+
try {
113+
Collection<String> responseBodies = Netty4HttpClient.returnHttpResponseBodies(responses);
114+
assertThat(responseBodies, contains(requests.toArray()));
115+
} finally {
116+
responses.forEach(ReferenceCounted::release);
117+
}
113118
}
114119
}
115120

@@ -139,21 +144,25 @@ public void testThatHttpPipeliningCanBeDisabled() throws Exception {
139144

140145
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
141146
Collection<FullHttpResponse> responses = nettyHttpClient.get(transportAddress.address(), requests.toArray(new String[]{}));
142-
List<String> responseBodies = new ArrayList<>(Netty4HttpClient.returnHttpResponseBodies(responses));
143-
// we can not be sure about the order of the responses, but the slow ones should come last
144-
assertThat(responseBodies, hasSize(numberOfRequests));
145-
for (int i = 0; i < numberOfRequests - slowIds.size(); i++) {
146-
assertThat(responseBodies.get(i), matches("/\\d+"));
147-
}
147+
try {
148+
List<String> responseBodies = new ArrayList<>(Netty4HttpClient.returnHttpResponseBodies(responses));
149+
// we can not be sure about the order of the responses, but the slow ones should come last
150+
assertThat(responseBodies, hasSize(numberOfRequests));
151+
for (int i = 0; i < numberOfRequests - slowIds.size(); i++) {
152+
assertThat(responseBodies.get(i), matches("/\\d+"));
153+
}
148154

149-
final Set<Integer> ids = new HashSet<>();
150-
for (int i = 0; i < slowIds.size(); i++) {
151-
final String response = responseBodies.get(numberOfRequests - slowIds.size() + i);
152-
assertThat(response, matches("/slow/\\d+" ));
153-
assertTrue(ids.add(Integer.parseInt(response.split("/")[2])));
154-
}
155+
final Set<Integer> ids = new HashSet<>();
156+
for (int i = 0; i < slowIds.size(); i++) {
157+
final String response = responseBodies.get(numberOfRequests - slowIds.size() + i);
158+
assertThat(response, matches("/slow/\\d+"));
159+
assertTrue(ids.add(Integer.parseInt(response.split("/")[2])));
160+
}
155161

156-
assertThat(slowIds, equalTo(ids));
162+
assertThat(slowIds, equalTo(ids));
163+
} finally {
164+
responses.forEach(ReferenceCounted::release);
165+
}
157166
}
158167
}
159168

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java

+23-10
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,23 @@ public void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadC
220220
HttpUtil.setContentLength(request, contentLength);
221221

222222
final FullHttpResponse response = client.post(remoteAddress.address(), request);
223-
assertThat(response.status(), equalTo(expectedStatus));
224-
if (expectedStatus.equals(HttpResponseStatus.CONTINUE)) {
225-
final FullHttpRequest continuationRequest =
226-
new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", Unpooled.EMPTY_BUFFER);
227-
final FullHttpResponse continuationResponse = client.post(remoteAddress.address(), continuationRequest);
228-
229-
assertThat(continuationResponse.status(), is(HttpResponseStatus.OK));
230-
assertThat(new String(ByteBufUtil.getBytes(continuationResponse.content()), StandardCharsets.UTF_8), is("done"));
223+
try {
224+
assertThat(response.status(), equalTo(expectedStatus));
225+
if (expectedStatus.equals(HttpResponseStatus.CONTINUE)) {
226+
final FullHttpRequest continuationRequest =
227+
new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", Unpooled.EMPTY_BUFFER);
228+
final FullHttpResponse continuationResponse = client.post(remoteAddress.address(), continuationRequest);
229+
try {
230+
assertThat(continuationResponse.status(), is(HttpResponseStatus.OK));
231+
assertThat(
232+
new String(ByteBufUtil.getBytes(continuationResponse.content()), StandardCharsets.UTF_8), is("done")
233+
);
234+
} finally {
235+
continuationResponse.release();
236+
}
237+
}
238+
} finally {
239+
response.release();
231240
}
232241
}
233242
}
@@ -293,10 +302,14 @@ public void dispatchBadRequest(final RestRequest request,
293302
final FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, url);
294303

295304
final FullHttpResponse response = client.post(remoteAddress.address(), request);
296-
assertThat(response.status(), equalTo(HttpResponseStatus.BAD_REQUEST));
297-
assertThat(
305+
try {
306+
assertThat(response.status(), equalTo(HttpResponseStatus.BAD_REQUEST));
307+
assertThat(
298308
new String(response.content().array(), Charset.forName("UTF-8")),
299309
containsString("you sent a bad request and you should feel bad"));
310+
} finally {
311+
response.release();
312+
}
300313
}
301314
}
302315

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningDisabledIT.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.elasticsearch.http.netty4;
2020

2121
import io.netty.handler.codec.http.FullHttpResponse;
22+
import io.netty.util.ReferenceCounted;
2223
import org.elasticsearch.ESNetty4IntegTestCase;
2324
import org.elasticsearch.common.network.NetworkModule;
2425
import org.elasticsearch.common.settings.Settings;
@@ -53,15 +54,19 @@ public void testThatNettyHttpServerDoesNotSupportPipelining() throws Exception {
5354

5455
HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class);
5556
TransportAddress[] boundAddresses = httpServerTransport.boundAddress().boundAddresses();
56-
TransportAddress transportAddress = (TransportAddress) randomFrom(boundAddresses);
57+
TransportAddress transportAddress = randomFrom(boundAddresses);
5758

5859
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
5960
Collection<FullHttpResponse> responses = nettyHttpClient.get(transportAddress.address(), requests);
60-
assertThat(responses, hasSize(requests.length));
61+
try {
62+
assertThat(responses, hasSize(requests.length));
6163

62-
List<String> opaqueIds = new ArrayList<>(Netty4HttpClient.returnOpaqueIds(responses));
64+
List<String> opaqueIds = new ArrayList<>(Netty4HttpClient.returnOpaqueIds(responses));
6365

64-
assertResponsesOutOfOrder(opaqueIds);
66+
assertResponsesOutOfOrder(opaqueIds);
67+
} finally {
68+
responses.forEach(ReferenceCounted::release);
69+
}
6570
}
6671
}
6772

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4PipeliningEnabledIT.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.http.netty4;
2121

2222
import io.netty.handler.codec.http.FullHttpResponse;
23+
import io.netty.util.ReferenceCounted;
2324
import org.elasticsearch.ESNetty4IntegTestCase;
2425
import org.elasticsearch.common.network.NetworkModule;
2526
import org.elasticsearch.common.settings.Settings;
@@ -51,14 +52,18 @@ public void testThatNettyHttpServerSupportsPipelining() throws Exception {
5152

5253
HttpServerTransport httpServerTransport = internalCluster().getInstance(HttpServerTransport.class);
5354
TransportAddress[] boundAddresses = httpServerTransport.boundAddress().boundAddresses();
54-
TransportAddress transportAddress = (TransportAddress) randomFrom(boundAddresses);
55+
TransportAddress transportAddress = randomFrom(boundAddresses);
5556

5657
try (Netty4HttpClient nettyHttpClient = new Netty4HttpClient()) {
5758
Collection<FullHttpResponse> responses = nettyHttpClient.get(transportAddress.address(), requests);
58-
assertThat(responses, hasSize(5));
59+
try {
60+
assertThat(responses, hasSize(5));
5961

60-
Collection<String> opaqueIds = Netty4HttpClient.returnOpaqueIds(responses);
61-
assertOpaqueIdsInOrder(opaqueIds);
62+
Collection<String> opaqueIds = Netty4HttpClient.returnOpaqueIds(responses);
63+
assertOpaqueIdsInOrder(opaqueIds);
64+
} finally {
65+
responses.forEach(ReferenceCounted::release);
66+
}
6267
}
6368
}
6469

x-pack/plugin/core/src/main/plugin-metadata/plugin-security.policy

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ grant {
1515
grant codeBase "${codebase.netty-common}" {
1616
// for reading the system-wide configuration for the backlog of established sockets
1717
permission java.io.FilePermission "/proc/sys/net/core/somaxconn", "read";
18+
// Netty sets custom classloader for some of its internal threads
19+
permission java.lang.RuntimePermission "*", "setContextClassLoader";
1820
};
1921

2022
grant codeBase "${codebase.netty-transport}" {

0 commit comments

Comments
 (0)