From 982960a1845c9c6760b0256970a216e9c5ac34dd Mon Sep 17 00:00:00 2001 From: Jacky Lee Date: Wed, 8 Jun 2022 21:30:07 +0800 Subject: [PATCH] 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 Co-authored-by: stczwd Signed-off-by: David Li --- java/c/src/main/java/org/apache/arrow/c/jni/JniWrapper.java | 2 +- .../main/java/org/apache/arrow/dataset/file/JniWrapper.java | 2 +- .../main/java/org/apache/arrow/dataset/jni/JniWrapper.java | 2 +- .../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 04a143a7a99f2..9e1c19b100e98 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 @@ private 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 f69d8205192c0..6e65803a333db 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 e10eda0b45e8d..1a9d4188c168f 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 83825776b763d..e20e1e351c542 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 @@ public class NativeMemoryPool implements AutoCloseable { private final long nativeInstanceId; - static { - JniLoader.get().ensureLoaded(); - } - private NativeMemoryPool(long nativeInstanceId) { this.nativeInstanceId = nativeInstanceId; } @@ -35,6 +31,7 @@ private NativeMemoryPool(long nativeInstanceId) { * 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 static NativeMemoryPool getDefault() { * from the listener in advance. */ public static NativeMemoryPool createListenable(ReservationListener listener) { + JniLoader.get().ensureLoaded(); return new NativeMemoryPool(createListenableMemoryPool(listener)); }