This is an automated email from the ASF dual-hosted git repository. lizhanhui pushed a commit to branch free_direct_byte_buffer in repository https://gitbox.apache.org/repos/asf/rocketmq.git
commit d12ece13d3cf92fdbbbc136c07012c79f9e2600d Author: Li Zhanhui <lizhan...@gmail.com> AuthorDate: Fri Nov 10 17:24:49 2023 +0800 Reuse helper methods from Netty to free direct byte buffer, making codebase JDK 9+ compatible Signed-off-by: Li Zhanhui <lizhan...@gmail.com> --- .../java/org/apache/rocketmq/common/UtilAll.java | 61 +--------------------- .../org/apache/rocketmq/common/UtilAllTest.java | 10 ---- 2 files changed, 2 insertions(+), 69 deletions(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java index 95b6b09b41..d017791f8e 100644 --- a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java @@ -16,21 +16,18 @@ */ package org.apache.rocketmq.common; +import io.netty.util.internal.PlatformDependent; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.nio.ByteBuffer; import java.nio.file.Files; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -46,15 +43,11 @@ import java.util.function.Supplier; import java.util.zip.CRC32; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; -import org.apache.commons.lang3.JavaVersion; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; import org.apache.commons.validator.routines.InetAddressValidator; import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.logging.org.slf4j.Logger; import org.apache.rocketmq.logging.org.slf4j.LoggerFactory; -import sun.misc.Unsafe; -import sun.nio.ch.DirectBuffer; public class UtilAll { private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); @@ -707,57 +700,7 @@ public class UtilAll { } public static void cleanBuffer(final ByteBuffer buffer) { - if (buffer == null || !buffer.isDirect() || buffer.capacity() == 0) { - return; - } - if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9)) { - try { - Field field = Unsafe.class.getDeclaredField("theUnsafe"); - field.setAccessible(true); - Unsafe unsafe = (Unsafe) field.get(null); - Method cleaner = method(unsafe, "invokeCleaner", new Class[] {ByteBuffer.class}); - cleaner.invoke(unsafe, viewed(buffer)); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } else { - invoke(invoke(viewed(buffer), "cleaner"), "clean"); - } - } - - public static Object invoke(final Object target, final String methodName, final Class<?>... args) { - return AccessController.doPrivileged(new PrivilegedAction<Object>() { - @Override - public Object run() { - try { - Method method = method(target, methodName, args); - method.setAccessible(true); - return method.invoke(target); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - }); - } - - public static Method method(Object target, String methodName, Class<?>[] args) throws NoSuchMethodException { - try { - return target.getClass().getMethod(methodName, args); - } catch (NoSuchMethodException e) { - return target.getClass().getDeclaredMethod(methodName, args); - } - } - - private static ByteBuffer viewed(ByteBuffer buffer) { - if (!buffer.isDirect()) { - throw new IllegalArgumentException("buffer is non-direct"); - } - ByteBuffer viewedBuffer = (ByteBuffer) ((DirectBuffer) buffer).attachment(); - if (viewedBuffer == null) { - return buffer; - } else { - return viewed(viewedBuffer); - } + PlatformDependent.freeDirectBuffer(buffer); } public static void ensureDirOK(final String dirName) { diff --git a/common/src/test/java/org/apache/rocketmq/common/UtilAllTest.java b/common/src/test/java/org/apache/rocketmq/common/UtilAllTest.java index 94bb390eb6..cb288578cc 100644 --- a/common/src/test/java/org/apache/rocketmq/common/UtilAllTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/UtilAllTest.java @@ -219,16 +219,6 @@ public class UtilAllTest { UtilAll.cleanBuffer(ByteBuffer.allocate(0)); } - @Test(expected = NoSuchMethodException.class) - public void testMethod() throws NoSuchMethodException { - UtilAll.method(new Object(), "noMethod", null); - } - - @Test(expected = IllegalStateException.class) - public void testInvoke() throws Exception { - UtilAll.invoke(new Object(), "noMethod"); - } - @Test public void testCalculateFileSizeInPath() throws Exception { /**