From a32a036e3326e3d026be1174aca5d0260af2e136 Mon Sep 17 00:00:00 2001 From: xorsum Date: Thu, 2 Apr 2026 11:02:32 +0800 Subject: [PATCH] avoid static init, retriable after failure --- .../auron/jni/AuronCallNativeWrapper.java | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/auron-core/src/main/java/org/apache/auron/jni/AuronCallNativeWrapper.java b/auron-core/src/main/java/org/apache/auron/jni/AuronCallNativeWrapper.java index 661d8070e..02e1996c9 100644 --- a/auron-core/src/main/java/org/apache/auron/jni/AuronCallNativeWrapper.java +++ b/auron-core/src/main/java/org/apache/auron/jni/AuronCallNativeWrapper.java @@ -53,27 +53,7 @@ public class AuronCallNativeWrapper { private Schema arrowSchema; private long nativeRuntimePtr; private Consumer batchConsumer; - - // initialize native environment - static { - LOG.info("Initializing native environment (batchSize=" - + AuronAdaptor.getInstance().getAuronConfiguration().get(AuronConfiguration.BATCH_SIZE) + ", " - + "memoryFraction=" - + AuronAdaptor.getInstance().getAuronConfiguration().get(AuronConfiguration.MEMORY_FRACTION) + ")"); - - // arrow configuration - System.setProperty("arrow.struct.conflict.policy", "CONFLICT_APPEND"); - - // preload JNI bridge classes - try { - Class.forName("org.apache.auron.jni.JniBridge"); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Cannot load JniBridge class", e); - } - - AuronAdaptor.getInstance().loadAuronLib(); - Runtime.getRuntime().addShutdownHook(new Thread(JniBridge::onExit)); - } + private static volatile boolean initialized = false; public AuronCallNativeWrapper( BufferAllocator arrowAllocator, @@ -90,6 +70,7 @@ public AuronCallNativeWrapper( this.stageId = stageId; this.taskId = taskId; + init(); LOG.warn("Start executing native plan"); this.nativeRuntimePtr = JniBridge.callNative( nativeMemory, @@ -97,6 +78,37 @@ public AuronCallNativeWrapper( this); } + private static void init() { + if (!initialized) { + synchronized (AuronCallNativeWrapper.class) { + if (!initialized) { + // initialize native environment + LOG.info("Initializing native environment (batchSize=" + + AuronAdaptor.getInstance().getAuronConfiguration().get(AuronConfiguration.BATCH_SIZE) + + ", " + + "memoryFraction=" + + AuronAdaptor.getInstance().getAuronConfiguration().get(AuronConfiguration.MEMORY_FRACTION) + + ")"); + + // arrow configuration + System.setProperty("arrow.struct.conflict.policy", "CONFLICT_APPEND"); + + // preload JNI bridge classes + try { + Class.forName("org.apache.auron.jni.JniBridge"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Cannot load JniBridge class", e); + } + + AuronAdaptor.getInstance().loadAuronLib(); + Runtime.getRuntime().addShutdownHook(new Thread(JniBridge::onExit)); + + initialized = true; + } + } + } + } + /** * Loads and processes the next batch of data from the native plan. *