diff --git a/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/NativeLibraryLoader.java b/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/NativeLibraryLoader.java index ce424c930e1..d93933dee36 100644 --- a/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/NativeLibraryLoader.java +++ b/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/NativeLibraryLoader.java @@ -36,6 +36,8 @@ import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import static org.apache.hadoop.hdds.utils.NativeConstants.ROCKS_TOOLS_NATIVE_LIBRARY_NAME; + /** * Class to load Native Libraries. */ @@ -67,6 +69,10 @@ public static NativeLibraryLoader getInstance() { return instance; } + public static String getJniLibraryFileName() { + return appendLibOsSuffix("lib" + ROCKS_TOOLS_NATIVE_LIBRARY_NAME); + } + public static String getJniLibraryFileName(String libraryName) { return appendLibOsSuffix("lib" + libraryName); } @@ -99,9 +105,12 @@ private static String appendLibOsSuffix(String libraryFileName) { return libraryFileName + getLibOsSuffix(); } + public static boolean isLibraryLoaded() { + return isLibraryLoaded(ROCKS_TOOLS_NATIVE_LIBRARY_NAME); + } + public static boolean isLibraryLoaded(final String libraryName) { - return getInstance().librariesLoaded - .getOrDefault(libraryName, false); + return getInstance().librariesLoaded.getOrDefault(libraryName, false); } public synchronized boolean loadLibrary(final String libraryName, final List dependentFiles) { diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/checknative/CheckNative.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/checknative/CheckNative.java index 63b2b425c64..f19548a1fa7 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/checknative/CheckNative.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/shell/checknative/CheckNative.java @@ -19,10 +19,15 @@ package org.apache.hadoop.ozone.shell.checknative; import org.apache.hadoop.hdds.cli.GenericCli; +import org.apache.hadoop.hdds.utils.NativeLibraryLoader; +import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksObjectUtils; import org.apache.hadoop.io.erasurecode.ErasureCodeNative; -import org.apache.hadoop.util.NativeCodeLoader; import picocli.CommandLine; +import java.util.Collections; + +import static org.apache.hadoop.hdds.utils.NativeConstants.ROCKS_TOOLS_NATIVE_LIBRARY_NAME; + /** * CLI command to check if native libraries are loaded. */ @@ -36,12 +41,12 @@ public static void main(String[] argv) { @Override public Void call() throws Exception { - boolean nativeHadoopLoaded = NativeCodeLoader.isNativeCodeLoaded(); + boolean nativeHadoopLoaded = org.apache.hadoop.util.NativeCodeLoader.isNativeCodeLoaded(); String hadoopLibraryName = ""; String isalDetail = ""; boolean isalLoaded = false; if (nativeHadoopLoaded) { - hadoopLibraryName = NativeCodeLoader.getLibraryName(); + hadoopLibraryName = org.apache.hadoop.util.NativeCodeLoader.getLibraryName(); isalDetail = ErasureCodeNative.getLoadingFailureReason(); if (isalDetail != null) { @@ -50,12 +55,21 @@ public Void call() throws Exception { isalDetail = ErasureCodeNative.getLibraryName(); isalLoaded = true; } - } System.out.println("Native library checking:"); System.out.printf("hadoop: %b %s%n", nativeHadoopLoaded, hadoopLibraryName); System.out.printf("ISA-L: %b %s%n", isalLoaded, isalDetail); + + // Attempt to load the rocks-tools lib + boolean nativeRocksToolsLoaded = NativeLibraryLoader.getInstance().loadLibrary( + ROCKS_TOOLS_NATIVE_LIBRARY_NAME, + Collections.singletonList(ManagedRocksObjectUtils.getRocksDBLibFileName())); + String rocksToolsDetail = ""; + if (nativeRocksToolsLoaded) { + rocksToolsDetail = NativeLibraryLoader.getJniLibraryFileName(); + } + System.out.printf("rocks-tools: %b %s%n", nativeRocksToolsLoaded, rocksToolsDetail); return null; } } diff --git a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/checknative/TestCheckNative.java b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/checknative/TestCheckNative.java index 8e291056330..0dc1fde57fa 100644 --- a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/checknative/TestCheckNative.java +++ b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/checknative/TestCheckNative.java @@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.checknative; import org.apache.hadoop.ozone.shell.checknative.CheckNative; +import org.apache.ozone.test.tag.Native; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterAll; @@ -27,6 +28,7 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; +import static org.apache.hadoop.hdds.utils.NativeConstants.ROCKS_TOOLS_NATIVE_LIBRARY_NAME; import static org.assertj.core.api.Assertions.assertThat; import static java.nio.charset.StandardCharsets.UTF_8; @@ -59,6 +61,22 @@ public void testCheckNativeNotLoaded() throws UnsupportedEncodingException { assertThat(stdOut).contains("Native library checking:"); assertThat(stdOut).contains("hadoop: false"); assertThat(stdOut).contains("ISA-L: false"); + assertThat(stdOut).contains("rocks-tools: false"); + } + + @Native(ROCKS_TOOLS_NATIVE_LIBRARY_NAME) + @Test + public void testCheckNativeRocksToolsLoaded() throws UnsupportedEncodingException { + outputStream.reset(); + new CheckNative() + .run(new String[] {}); + // trims multiple spaces + String stdOut = outputStream.toString(DEFAULT_ENCODING) + .replaceAll(" +", " "); + assertThat(stdOut).contains("Native library checking:"); + assertThat(stdOut).contains("hadoop: false"); + assertThat(stdOut).contains("ISA-L: false"); + assertThat(stdOut).contains("rocks-tools: true"); } @AfterEach