diff --git a/.changes/next-release/bugfix-NettyNIOHTTPClient-366cfb9.json b/.changes/next-release/bugfix-NettyNIOHTTPClient-366cfb9.json new file mode 100644 index 00000000000..184559aa58a --- /dev/null +++ b/.changes/next-release/bugfix-NettyNIOHTTPClient-366cfb9.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "Netty NIO HTTP Client", + "contributor": "olivergillespie", + "description": "Don't force Netty's unpooled ByteBuffer allocator when using the JDK SSL provider. The underlying Netty issue (netty/netty#9768) has been fixed in later versions." +} diff --git a/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/AwaitCloseChannelPoolMap.java b/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/AwaitCloseChannelPoolMap.java index 82e3edc764a..ff5c87e5703 100644 --- a/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/AwaitCloseChannelPoolMap.java +++ b/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/AwaitCloseChannelPoolMap.java @@ -131,7 +131,6 @@ protected SimpleChannelPoolAwareChannelPool newPool(URI key) { ChannelPipelineInitializer pipelineInitializer = new ChannelPipelineInitializer(protocol, protocolNegotiation, sslContext, - sslProvider, maxStreams, initialWindowSize, healthCheckPingPeriod, diff --git a/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializer.java b/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializer.java index 6b6e7b7ca1d..dfefb60cf28 100644 --- a/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializer.java +++ b/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializer.java @@ -24,11 +24,9 @@ import static software.amazon.awssdk.utils.NumericUtils.saturatedCast; import static software.amazon.awssdk.utils.StringUtils.lowerCase; -import io.netty.buffer.UnpooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.pool.AbstractChannelPoolHandler; import io.netty.channel.pool.ChannelPool; @@ -44,7 +42,6 @@ import io.netty.handler.ssl.ApplicationProtocolNegotiationHandler; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslHandler; -import io.netty.handler.ssl.SslProvider; import java.net.URI; import java.time.Duration; import java.util.concurrent.CompletableFuture; @@ -64,7 +61,6 @@ public final class ChannelPipelineInitializer extends AbstractChannelPoolHandler private final Protocol protocol; private final ProtocolNegotiation protocolNegotiation; private final SslContext sslCtx; - private final SslProvider sslProvider; private final long clientMaxStreams; private final int clientInitialWindowSize; private final Duration healthCheckPingPeriod; @@ -75,7 +71,6 @@ public final class ChannelPipelineInitializer extends AbstractChannelPoolHandler public ChannelPipelineInitializer(Protocol protocol, ProtocolNegotiation protocolNegotiation, SslContext sslCtx, - SslProvider sslProvider, long clientMaxStreams, int clientInitialWindowSize, Duration healthCheckPingPeriod, @@ -85,7 +80,6 @@ public ChannelPipelineInitializer(Protocol protocol, this.protocol = protocol; this.protocolNegotiation = protocolNegotiation; this.sslCtx = sslCtx; - this.sslProvider = sslProvider; this.clientMaxStreams = clientMaxStreams; this.clientInitialWindowSize = clientInitialWindowSize; this.healthCheckPingPeriod = healthCheckPingPeriod; @@ -108,12 +102,6 @@ public void channelCreated(Channel ch) { pipeline.addLast(sslHandler); pipeline.addLast(SslCloseCompletionEventHandler.getInstance()); - - // Use unpooled allocator to avoid increased heap memory usage from Netty 4.1.43. - // See https://github.com/netty/netty/issues/9768 - if (sslProvider == SslProvider.JDK) { - ch.config().setOption(ChannelOption.ALLOCATOR, UnpooledByteBufAllocator.DEFAULT); - } } configureProtocolHandlers(ch, pipeline, protocol, sslCtxPresent); diff --git a/http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializerTest.java b/http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializerTest.java index 4b1aeb85073..109a38e3a5e 100644 --- a/http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializerTest.java +++ b/http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/internal/ChannelPipelineInitializerTest.java @@ -15,18 +15,14 @@ package software.amazon.awssdk.http.nio.netty.internal; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static software.amazon.awssdk.http.SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS; -import io.netty.buffer.UnpooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelOption; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.channel.pool.ChannelPool; import io.netty.handler.codec.http2.Http2MultiplexHandler; @@ -50,15 +46,6 @@ public class ChannelPipelineInitializerTest { private final URI TARGET_URI = URI.create("https://some-awesome-service-1234.amazonaws.com:8080"); private static final SslProvider SSL_PROVIDER = SslProvider.JDK; - @Test - public void channelConfigOptionCheck() { - ChannelPipelineInitializer pipelineInitializer = createChannelPipelineInitializer(Protocol.HTTP1_1, ProtocolNegotiation.ASSUME_PROTOCOL); - Channel channel = new EmbeddedChannel(); - pipelineInitializer.channelCreated(channel); - - assertThat(channel.config().getOption(ChannelOption.ALLOCATOR), is(UnpooledByteBufAllocator.DEFAULT)); - } - @Test @EnabledIf("alpnSupported") public void h2AlpnEnabled_shouldUseAlpn() { @@ -126,7 +113,6 @@ private ChannelPipelineInitializer createChannelPipelineInitializer(Protocol pro return new ChannelPipelineInitializer(protocol, protocolNegotiation, sslContextProvider.sslContext(), - SSL_PROVIDER, 100, 1024, Duration.ZERO,