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

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


The following commit(s) were added to refs/heads/master by this push:
     new d2af35b9320 IGNITE-20532 Fix JavaNioAccess handling in JDK 14 and 
later. (#10969)
d2af35b9320 is described below

commit d2af35b9320b0acc227b61c4614b22debc554635
Author: Ivan Daschinskiy <[email protected]>
AuthorDate: Tue Oct 3 18:14:40 2023 +0300

    IGNITE-20532 Fix JavaNioAccess handling in JDK 14 and later. (#10969)
---
 bin/include/jvmdefaults.bat                        | 16 +++++++-
 bin/include/jvmdefaults.sh                         | 15 ++++++-
 deliveries/docker/apache-ignite/run.sh             |  1 +
 .../ignite/internal/util/FeatureChecker.java       |  2 +
 .../apache/ignite/internal/util/GridUnsafe.java    | 47 +++++++++++++++++-----
 modules/platforms/cpp/core/src/ignition.cpp        |  1 +
 .../Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs   |  1 +
 parent/pom.xml                                     |  3 +-
 8 files changed, 74 insertions(+), 12 deletions(-)

diff --git a/bin/include/jvmdefaults.bat b/bin/include/jvmdefaults.bat
index e9002a41412..13ebc69dfc7 100644
--- a/bin/include/jvmdefaults.bat
+++ b/bin/include/jvmdefaults.bat
@@ -43,7 +43,7 @@ if %java_version% GEQ 9 if %java_version% LSS 11 (
     %current_value%
 )
 
-if %java_version% GEQ 11 if %java_version% LSS 15 (
+if %java_version% GEQ 11 if %java_version% LSS 14 (
     set value= ^
     --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED ^
     --add-exports=java.base/sun.nio.ch=ALL-UNNAMED ^
@@ -55,8 +55,22 @@ if %java_version% GEQ 11 if %java_version% LSS 15 (
     %current_value%
 )
 
+if %java_version% GEQ 14 if %java_version% LSS 15 (
+    set value= ^
+    --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED ^
+    --add-exports=java.base/sun.nio.ch=ALL-UNNAMED ^
+    --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED ^
+    --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED ^
+    --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED 
^
+    --add-opens=java.base/jdk.internal.access=ALL-UNNAMED ^
+    --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED ^
+    --illegal-access=permit ^
+    %current_value%
+)
+
 if %java_version% GEQ 15 (
     set value= ^
+    --add-opens=java.base/jdk.internal.access=ALL-UNNAMED ^
     --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED ^
     --add-opens=java.base/sun.nio.ch=ALL-UNNAMED ^
     --add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED ^
diff --git a/bin/include/jvmdefaults.sh b/bin/include/jvmdefaults.sh
index f0d2519c5c0..962b10e4695 100644
--- a/bin/include/jvmdefaults.sh
+++ b/bin/include/jvmdefaults.sh
@@ -41,7 +41,7 @@ getJavaSpecificOpts() {
           --add-modules=java.xml.bind \
           ${current_value}"
 
-  elif [ "${version}" -ge 11 ] && [ "${version}" -lt 15 ]; then
+  elif [ "${version}" -ge 11 ] && [ "${version}" -lt 14 ]; then
       value="\
           --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
           --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
@@ -52,8 +52,21 @@ getJavaSpecificOpts() {
           --illegal-access=permit \
           ${current_value}"
 
+  elif [ "${version}" -ge 14 ] && [ "${version}" -lt 15 ]; then
+        value="\
+            --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
+            --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+            --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
+            --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED 
\
+            
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
+            --add-opens=java.base/jdk.internal.access=ALL-UNNAMED \
+            --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED 
\
+            --illegal-access=permit \
+            ${current_value}"
+
   elif [ "${version}" -ge 15 ] ; then
       value="\
+          --add-opens=java.base/jdk.internal.access=ALL-UNNAMED \
           --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED \
           --add-opens=java.base/sun.nio.ch=ALL-UNNAMED \
           --add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
diff --git a/deliveries/docker/apache-ignite/run.sh 
b/deliveries/docker/apache-ignite/run.sh
index 7e88a36b21f..bacb588325c 100755
--- a/deliveries/docker/apache-ignite/run.sh
+++ b/deliveries/docker/apache-ignite/run.sh
@@ -98,6 +98,7 @@ elif [ "${version}" -ge 11 ] ; then
         --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
         
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
         --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED \
+        --add-opens=java.base/jdk.internal.access=ALL-UNNAMED \
         --illegal-access=permit \
         ${JVM_OPTS}"
 fi
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/FeatureChecker.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/FeatureChecker.java
index f017be33a8b..b53e52c183e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/FeatureChecker.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/FeatureChecker.java
@@ -28,10 +28,12 @@ public class FeatureChecker {
         "--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED\n" 
+
         
"--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED\n" +
         "--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED\n" 
+
+        "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED\n" +
         "--illegal-access=permit";
 
     /** Required Options to Run on Java 15 and higher. */
     public static final String JAVA_15_OPTIONS =
+        "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED\n" +
         "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED\n" +
         "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED\n" +
         "--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED\n" +
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
index ef215493cac..ce9476f4916 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
@@ -117,6 +117,12 @@ public abstract class GridUnsafe {
     /** Whether to use newDirectByteBuffer(long, long) constructor */
     private static final boolean IS_DIRECT_BUF_LONG_CAP = 
majorJavaVersion(jdkVersion()) >= 21;
 
+    /** Whether {@link jdk.internal.access.JavaNioAccess} has new byte buffer 
api. */
+    private static final boolean HAS_JAVA_NIO_ACCESS_NEW_API = 
majorJavaVersion(jdkVersion()) >= 14;
+
+    /** Whether {@link jdk.internal.access.JavaNioAccess#newDirectByteBuffer} 
has param of type {@link java.lang.foreign.MemorySegment}. */
+    private static final boolean HAS_JAVA_NIO_ACCESS_MEMORY_SEGMENT_PARAM = 
majorJavaVersion(jdkVersion()) >= 19;
+
     /** Cleaner code for direct {@code java.nio.ByteBuffer}. */
     private static final DirectBufferCleaner DIRECT_BUF_CLEANER =
         majorJavaVersion(jdkVersion()) < 9
@@ -174,6 +180,9 @@ public abstract class GridUnsafe {
                 directBufCtor = createAndTestNewDirectBufferCtor();
             }
             catch (Exception e) {
+                if (!HAS_JAVA_NIO_ACCESS_NEW_API)
+                    throw e;
+
                 try {
                     nioAccessObj = javaNioAccessObject();
                     directBufMtd = newDirectBufferMethod(nioAccessObj);
@@ -257,7 +266,11 @@ public abstract class GridUnsafe {
         @NotNull Method newDirectBufMtd,
         @NotNull Object javaNioAccessObj) {
         try {
-            ByteBuffer buf = 
(ByteBuffer)newDirectBufMtd.invoke(javaNioAccessObj, ptr, len, null);
+            ByteBuffer buf;
+            if (HAS_JAVA_NIO_ACCESS_NEW_API)
+                buf = (ByteBuffer)newDirectBufMtd.invoke(javaNioAccessObj, 
ptr, len, null, null);
+            else
+                buf = (ByteBuffer)newDirectBufMtd.invoke(javaNioAccessObj, 
ptr, len, null);
 
             assert buf.isDirect();
 
@@ -1617,17 +1630,17 @@ public abstract class GridUnsafe {
      * @throws RuntimeException If getting access to the private API is failed.
      */
     private static Object javaNioAccessObject() {
-        String pkgName = miscPackage();
+        String pkgName = getSharedSecretsPackage();
 
         try {
-            Class<?> cls = Class.forName(pkgName + ".misc.SharedSecrets");
+            Class<?> cls = Class.forName(pkgName + ".SharedSecrets");
 
             Method mth = cls.getMethod("getJavaNioAccess");
 
             return mth.invoke(null);
         }
         catch (ReflectiveOperationException e) {
-            throw new RuntimeException(pkgName + ".misc.JavaNioAccess class is 
unavailable."
+            throw new RuntimeException(pkgName + ".JavaNioAccess class is 
unavailable."
                 + FeatureChecker.JAVA_VER_SPECIFIC_WARN, e);
         }
     }
@@ -1644,24 +1657,40 @@ public abstract class GridUnsafe {
         try {
             Class<?> cls = nioAccessObj.getClass();
 
-            Method mtd = IS_DIRECT_BUF_LONG_CAP ? 
cls.getMethod("newDirectByteBuffer", long.class, long.class, Object.class) :
-                    cls.getMethod("newDirectByteBuffer", long.class, 
int.class, Object.class);
+            Method mtd;
+            if (HAS_JAVA_NIO_ACCESS_NEW_API) {
+                Class<?> forthParamCls;
+                if (HAS_JAVA_NIO_ACCESS_MEMORY_SEGMENT_PARAM)
+                    forthParamCls = 
Class.forName("java.lang.foreign.MemorySegment");
+                else
+                    forthParamCls = 
Class.forName("jdk.internal.access.foreign.MemorySegmentProxy");
+
+                mtd = cls.getMethod("newDirectByteBuffer", long.class, 
int.class, Object.class, forthParamCls);
+            }
+            else
+                mtd = cls.getMethod("newDirectByteBuffer", long.class, 
int.class, Object.class);
 
             mtd.setAccessible(true);
 
             return mtd;
         }
         catch (ReflectiveOperationException e) {
-            throw new RuntimeException(miscPackage() + 
".JavaNioAccess#newDirectByteBuffer() method is unavailable."
+            throw new RuntimeException(getSharedSecretsPackage() + 
".JavaNioAccess#newDirectByteBuffer() method is unavailable."
                 + FeatureChecker.JAVA_VER_SPECIFIC_WARN, e);
         }
     }
 
     /** */
-    @NotNull private static String miscPackage() {
+    @NotNull private static String getSharedSecretsPackage() {
         int javaVer = majorJavaVersion(jdkVersion());
 
-        return javaVer < 9 ? "sun" : "jdk.internal";
+        if (javaVer < 9)
+            return "sun.misc";
+
+        if (javaVer < 12)
+            return "jdk.internal.misc";
+
+        return "jdk.internal.access";
     }
 
     /**
diff --git a/modules/platforms/cpp/core/src/ignition.cpp 
b/modules/platforms/cpp/core/src/ignition.cpp
index ea4190664af..ccc5c7dbf13 100644
--- a/modules/platforms/cpp/core/src/ignition.cpp
+++ b/modules/platforms/cpp/core/src/ignition.cpp
@@ -153,6 +153,7 @@ namespace ignite
                 // Those are only needed for Java 15+, but Java 15 can not be 
detected easily using JNI,
                 // so just putting it here in case we are running on 15+. It 
is OK to have them on Java 9-14 too.
                 // See 
https://docs.oracle.com/en/java/javase/17/docs/specs/jni/functions.html#getversion
+                
opts.push_back(CopyChars("--add-opens=java.base/jdk.internal.access=ALL-UNNAMED"));
                 
opts.push_back(CopyChars("--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED"));
                 
opts.push_back(CopyChars("--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"));
                 
opts.push_back(CopyChars("--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED"));
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
index 47b685a2223..30f3fc669e7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
@@ -52,6 +52,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
             
"--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED",
             "--illegal-access=permit",
 
+            "--add-opens=java.base/jdk.internal.access=ALL-UNNAMED",
             "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED",
             "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED",
             "--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
diff --git a/parent/pom.xml b/parent/pom.xml
index d67b144c193..24da59734c0 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -918,7 +918,7 @@
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
                         <configuration>
-                            
<argLine>--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED 
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED 
--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED 
--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED 
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED 
--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED 
--illegal-access=permit</argLine>
+                            
<argLine>--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED 
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED 
--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED 
--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED 
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED 
--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED 
--add-opens=java.base/jdk.internal.access=ALL-UNNAMED --illegal-access=permit</ 
[...]
                         </configuration>
                     </plugin>
 
@@ -1012,6 +1012,7 @@
                         <artifactId>maven-surefire-plugin</artifactId>
                         <configuration>
                             <argLine>
+                                
--add-opens=java.base/jdk.internal.access=ALL-UNNAMED
                                 
--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
                                 --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
                                 
--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED

Reply via email to