This is an automated email from the ASF dual-hosted git repository.

sodonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 767c2fbeed HDDS-7228. ChecksumByteBufferImpl.update() is expensive 
(#3759)
767c2fbeed is described below

commit 767c2fbeed3c2a0537a7eb53a321486f1e03f8c4
Author: Wei-Chiu Chuang <[email protected]>
AuthorDate: Wed Oct 11 02:05:23 2023 -0700

    HDDS-7228. ChecksumByteBufferImpl.update() is expensive (#3759)
---
 .../ozone/common/ChecksumByteBufferImpl.java       | 32 +++++++++++++++++++++-
 hadoop-ozone/dist/src/shell/ozone/ozone            |  6 ++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChecksumByteBufferImpl.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChecksumByteBufferImpl.java
index 5de86b80a2..5fab7eacdf 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChecksumByteBufferImpl.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChecksumByteBufferImpl.java
@@ -17,6 +17,10 @@
  */
 package org.apache.hadoop.ozone.common;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
 import java.nio.ByteBuffer;
 import java.util.zip.Checksum;
 
@@ -25,7 +29,24 @@ import java.util.zip.Checksum;
  */
 public class ChecksumByteBufferImpl implements ChecksumByteBuffer {
 
-  private Checksum checksum;
+  private static final Logger LOG =
+      LoggerFactory.getLogger(ChecksumByteBufferImpl.class);
+
+  private final Checksum checksum;
+
+  private static final Field IS_READY_ONLY_FIELD;
+
+  static {
+    Field f = null;
+    try {
+      f = ByteBuffer.class
+          .getDeclaredField("isReadOnly");
+      f.setAccessible(true);
+    } catch (NoSuchFieldException e) {
+      LOG.error("No isReadOnly field in ByteBuffer", e);
+    }
+    IS_READY_ONLY_FIELD = f;
+  }
 
   public ChecksumByteBufferImpl(Checksum impl) {
     this.checksum = impl;
@@ -36,6 +57,15 @@ public class ChecksumByteBufferImpl implements 
ChecksumByteBuffer {
   //        should be refactored to simply call checksum.update(buffer), as the
   //        Checksum interface has been enhanced to allow this since Java 9.
   public void update(ByteBuffer buffer) {
+    // this is a hack to not do memory copy.
+    if (IS_READY_ONLY_FIELD != null) {
+      try {
+        IS_READY_ONLY_FIELD.setBoolean(buffer, false);
+      } catch (IllegalAccessException e) {
+        LOG.error("Cannot access isReadOnly in ByteBuffer", e);
+      }
+    }
+
     if (buffer.hasArray()) {
       checksum.update(buffer.array(), buffer.position() + buffer.arrayOffset(),
           buffer.remaining());
diff --git a/hadoop-ozone/dist/src/shell/ozone/ozone 
b/hadoop-ozone/dist/src/shell/ozone/ozone
index 854ee462ee..5a154cb1a8 100755
--- a/hadoop-ozone/dist/src/shell/ozone/ozone
+++ b/hadoop-ozone/dist/src/shell/ozone/ozone
@@ -93,6 +93,9 @@ function ozonecmd_case
   if [[ "${JAVA_MAJOR_VERSION}" == "17" ]]; then
       OZONE_MODULE_ACCESS_ARGS="--add-opens java.base/java.lang=ALL-UNNAMED 
--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED --add-exports 
java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED"
   fi
+  if [[ "${JAVA_MAJOR_VERSION}" -ge 9 ]]; then
+    OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-opens 
java.base/java.nio=ALL-UNNAMED"
+  fi
 
   case ${subcmd} in
     auditparser)
@@ -157,6 +160,7 @@ function ozonecmd_case
     sh | shell)
       OZONE_CLASSNAME=org.apache.hadoop.ozone.shell.OzoneShell
       ozone_deprecate_envvar HDFS_OM_SH_OPTS OZONE_SH_OPTS
+      OZONE_SH_OPTS="${OZONE_SH_OPTS} ${OZONE_MODULE_ACCESS_ARGS}"
       OZONE_RUN_ARTIFACT_NAME="ozone-tools"
     ;;
     s3)
@@ -201,6 +205,7 @@ function ozonecmd_case
     ;;
     fs)
       OZONE_CLASSNAME=org.apache.hadoop.fs.ozone.OzoneFsShell
+      OZONE_FS_OPTS="${OZONE_FS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}"
       OZONE_RUN_ARTIFACT_NAME="ozone-tools"
     ;;
     daemonlog)
@@ -229,6 +234,7 @@ function ozonecmd_case
     ;;
     debug)
       OZONE_CLASSNAME=org.apache.hadoop.ozone.debug.OzoneDebug
+      OZONE_DEBUG_OPTS="${OZONE_DEBUG_OPTS} ${OZONE_MODULE_ACCESS_ARGS}"
       OZONE_RUN_ARTIFACT_NAME="ozone-tools"
     ;;
     checknative)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to