You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2022/06/08 13:30:15 UTC

[arrow] branch master updated: ARROW-16566: [Java] Initialize JNI components on use instead of statically (#13146)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 982960a184 ARROW-16566: [Java] Initialize JNI components on use instead of statically (#13146)
982960a184 is described below

commit 982960a1845c9c6760b0256970a216e9c5ac34dd
Author: Jacky Lee <li...@baidu.com>
AuthorDate: Wed Jun 8 21:30:07 2022 +0800

    ARROW-16566: [Java] Initialize JNI components on use instead of statically (#13146)
    
    We are using Arrow in Spark. When speculation is turned on, it is possible for the task to be forcibly killed during the running process. It means, `JniLoader.get().ensureLoaded()` maybe failed with `ClosedByInterruptException` when the task was killed, and it should be accepted with this.
    However, `NativeMemoryPool` use it as a static code, this leads to an init failure every time the NativeMemroyPool is trying to initialized and can never succeed. It would always fail to init `NativeMemoryPool` with `java.lang.NoClassDefFoundError: Could not initialize class org.apache.arrow.dataset.jni.NativeMemoryPool`.
    
    Lead-authored-by: jackylee-ch <li...@baidu.com>
    Co-authored-by: stczwd <qc...@163.com>
    Signed-off-by: David Li <li...@gmail.com>
---
 java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java         | 2 +-
 .../src/main/java/org/apache/arrow/dataset/file/JniWrapper.java     | 2 +-
 .../src/main/java/org/apache/arrow/dataset/jni/JniWrapper.java      | 2 +-
 .../main/java/org/apache/arrow/dataset/jni/NativeMemoryPool.java    | 6 ++----
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java b/java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java
index 04a143a7a9..9e1c19b100 100644
--- a/java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java
+++ b/java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java
@@ -24,6 +24,7 @@ public class JniWrapper {
   private static final JniWrapper INSTANCE = new JniWrapper();
 
   public static JniWrapper get() {
+    JniLoader.get().ensureLoaded();
     return INSTANCE;
   }
 
@@ -34,7 +35,6 @@ public class JniWrapper {
       throw new UnsupportedOperationException(
           "The Java C Data Interface implementation is currently only supported on 64-bit systems");
     }
-    JniLoader.get().ensureLoaded();
   }
 
   public native void releaseSchema(long memoryAddress);
diff --git a/java/dataset/src/main/java/org/apache/arrow/dataset/file/JniWrapper.java b/java/dataset/src/main/java/org/apache/arrow/dataset/file/JniWrapper.java
index f69d820519..6e65803a33 100644
--- a/java/dataset/src/main/java/org/apache/arrow/dataset/file/JniWrapper.java
+++ b/java/dataset/src/main/java/org/apache/arrow/dataset/file/JniWrapper.java
@@ -27,11 +27,11 @@ public class JniWrapper {
   private static final JniWrapper INSTANCE = new JniWrapper();
   
   public static JniWrapper get() {
+    JniLoader.get().ensureLoaded();
     return INSTANCE;
   }
 
   private JniWrapper() {
-    JniLoader.get().ensureLoaded();
   }
 
   /**
diff --git a/java/dataset/src/main/java/org/apache/arrow/dataset/jni/JniWrapper.java b/java/dataset/src/main/java/org/apache/arrow/dataset/jni/JniWrapper.java
index e10eda0b45..1a9d4188c1 100644
--- a/java/dataset/src/main/java/org/apache/arrow/dataset/jni/JniWrapper.java
+++ b/java/dataset/src/main/java/org/apache/arrow/dataset/jni/JniWrapper.java
@@ -25,11 +25,11 @@ public class JniWrapper {
   private static final JniWrapper INSTANCE = new JniWrapper();
 
   public static JniWrapper get() {
+    JniLoader.get().ensureLoaded();
     return INSTANCE;
   }
 
   private JniWrapper() {
-    JniLoader.get().ensureLoaded();
   }
 
   /**
diff --git a/java/dataset/src/main/java/org/apache/arrow/dataset/jni/NativeMemoryPool.java b/java/dataset/src/main/java/org/apache/arrow/dataset/jni/NativeMemoryPool.java
index 83825776b7..e20e1e351c 100644
--- a/java/dataset/src/main/java/org/apache/arrow/dataset/jni/NativeMemoryPool.java
+++ b/java/dataset/src/main/java/org/apache/arrow/dataset/jni/NativeMemoryPool.java
@@ -23,10 +23,6 @@ package org.apache.arrow.dataset.jni;
 public class NativeMemoryPool implements AutoCloseable {
   private final long nativeInstanceId;
 
-  static {
-    JniLoader.get().ensureLoaded();
-  }
-
   private NativeMemoryPool(long nativeInstanceId) {
     this.nativeInstanceId = nativeInstanceId;
   }
@@ -35,6 +31,7 @@ public class NativeMemoryPool implements AutoCloseable {
    * Get the default memory pool. This will return arrow::default_memory_pool() directly.
    */
   public static NativeMemoryPool getDefault() {
+    JniLoader.get().ensureLoaded();
     return new NativeMemoryPool(getDefaultMemoryPool());
   }
 
@@ -44,6 +41,7 @@ public class NativeMemoryPool implements AutoCloseable {
    * from the listener in advance.
    */
   public static NativeMemoryPool createListenable(ReservationListener listener) {
+    JniLoader.get().ensureLoaded();
     return new NativeMemoryPool(createListenableMemoryPool(listener));
   }