From a1fff79baa0ae06b4ae3e0fd6c3e1c6d184f0c2d Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Sun, 1 Sep 2024 14:32:59 +0200 Subject: [PATCH] Try reuse existing Netty pooled allocator singleton (Fixes #5168) --- .../buffer/impl/VertxByteBufAllocator.java | 10 ++++-- .../io/vertx/core/net/impl/TCPServerBase.java | 3 +- .../impl/VertxByteBufAllocatorTest.java | 31 +++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java diff --git a/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java b/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java index 48f02daf72d..0d3c31d18cf 100644 --- a/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java +++ b/src/main/java/io/vertx/core/buffer/impl/VertxByteBufAllocator.java @@ -22,11 +22,13 @@ public abstract class VertxByteBufAllocator extends AbstractByteBufAllocator { /** * Vert.x pooled allocator. */ - public static final ByteBufAllocator POOLED_ALLOCATOR = new PooledByteBufAllocator(true); + public static final ByteBufAllocator POOLED_ALLOCATOR = PooledByteBufAllocator.defaultPreferDirect() ? + PooledByteBufAllocator.DEFAULT : new PooledByteBufAllocator(true); /** * Vert.x shared unpooled allocator. */ - public static final ByteBufAllocator UNPOOLED_ALLOCATOR = new UnpooledByteBufAllocator(false); + public static final ByteBufAllocator UNPOOLED_ALLOCATOR = PooledByteBufAllocator.defaultPreferDirect() ? + UnpooledByteBufAllocator.DEFAULT : new UnpooledByteBufAllocator(false); private static final VertxByteBufAllocator UNSAFE_IMPL = new VertxByteBufAllocator() { @Override @@ -42,6 +44,10 @@ protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) { } }; + /** + * Vert.x shared unpooled allocator.
+ * Differently from {@link #POOLED_ALLOCATOR}, its heap buffers are not reference counted. + */ public static final VertxByteBufAllocator DEFAULT = PlatformDependent.hasUnsafe() ? UNSAFE_IMPL : IMPL; @Override diff --git a/src/main/java/io/vertx/core/net/impl/TCPServerBase.java b/src/main/java/io/vertx/core/net/impl/TCPServerBase.java index 08cac0c2773..3dfd22f573b 100644 --- a/src/main/java/io/vertx/core/net/impl/TCPServerBase.java +++ b/src/main/java/io/vertx/core/net/impl/TCPServerBase.java @@ -26,6 +26,7 @@ import io.vertx.core.Handler; import io.vertx.core.Promise; import io.vertx.core.buffer.impl.PartialPooledByteBufAllocator; +import io.vertx.core.buffer.impl.VertxByteBufAllocator; import io.vertx.core.impl.ContextInternal; import io.vertx.core.impl.future.PromiseInternal; import io.vertx.core.impl.VertxInternal; @@ -245,7 +246,7 @@ private synchronized Future listen(SocketAddress localAddress, ContextI if (options.isSsl()) { bootstrap.childOption(ChannelOption.ALLOCATOR, PartialPooledByteBufAllocator.INSTANCE); } else { - bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); + bootstrap.childOption(ChannelOption.ALLOCATOR, VertxByteBufAllocator.POOLED_ALLOCATOR); } bootstrap.childHandler(channelBalancer); diff --git a/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java b/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java new file mode 100644 index 00000000000..dace95f133d --- /dev/null +++ b/src/test/java/io/vertx/core/buffer/impl/VertxByteBufAllocatorTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011-2024 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + */ + +package io.vertx.core.buffer.impl; + +import org.junit.Assert; +import org.junit.Test; + +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.UnpooledByteBufAllocator; + +public class VertxByteBufAllocatorTest { + + @Test + public void shouldReuseTheExistingNettyAllocators() { + Assert.assertTrue(PooledByteBufAllocator.defaultPreferDirect()); + Assert.assertSame(PooledByteBufAllocator.DEFAULT, VertxByteBufAllocator.POOLED_ALLOCATOR); + Assert.assertSame(ByteBufAllocator.DEFAULT, VertxByteBufAllocator.POOLED_ALLOCATOR); + Assert.assertSame(UnpooledByteBufAllocator.DEFAULT, VertxByteBufAllocator.UNPOOLED_ALLOCATOR); + } + +}