This is an automated email from the ASF dual-hosted git repository.
swamirishi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new e31e68ab2a HDDS-10560. Link rocksdb lib to Ozone rocksdb tools lib
relative path instead of absolute path (#6414)
e31e68ab2a is described below
commit e31e68ab2a11b920f53a2573fce8a07bbac4cd77
Author: Swaminathan Balachandran <[email protected]>
AuthorDate: Mon Apr 8 11:06:49 2024 -0700
HDDS-10560. Link rocksdb lib to Ozone rocksdb tools lib relative path
instead of absolute path (#6414)
---
.../utils/db/managed/JniLibNamePropertyWriter.java | 5 ++--
.../utils/db/managed/ManagedRocksObjectUtils.java | 8 +++++
hadoop-hdds/rocks-native/pom.xml | 4 ++-
hadoop-hdds/rocks-native/src/CMakeLists.txt | 24 ++++++++++-----
.../hadoop/hdds/utils/NativeLibraryLoader.java | 35 ++++++++++++++++------
.../utils/db/managed/ManagedRawSSTFileReader.java | 4 ++-
.../hadoop/hdds/utils/TestNativeLibraryLoader.java | 3 +-
7 files changed, 60 insertions(+), 23 deletions(-)
diff --git
a/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/JniLibNamePropertyWriter.java
b/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/JniLibNamePropertyWriter.java
index 46fbeb412a..0d79a1c833 100644
---
a/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/JniLibNamePropertyWriter.java
+++
b/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/JniLibNamePropertyWriter.java
@@ -17,7 +17,6 @@
*/
package org.apache.hadoop.hdds.utils.db.managed;
-import org.rocksdb.util.Environment;
import java.io.IOException;
import java.io.OutputStreamWriter;
@@ -39,8 +38,8 @@ public final class JniLibNamePropertyWriter {
String filePath = args[0];
try (Writer writer = new OutputStreamWriter(
Files.newOutputStream(Paths.get(filePath)), StandardCharsets.UTF_8)) {
- writer.write("rocksdbLibName=" +
- Environment.getJniLibraryFileName("rocksdb"));
+ String libName = ManagedRocksObjectUtils.getRocksDBLibFileName();
+ writer.write("rocksdbLibName=" + libName);
} catch (IOException e) {
e.printStackTrace();
}
diff --git
a/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRocksObjectUtils.java
b/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRocksObjectUtils.java
index 9c86a47d74..148abee7fc 100644
---
a/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRocksObjectUtils.java
+++
b/hadoop-hdds/managed-rocksdb/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRocksObjectUtils.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.hdds.ratis.RatisHelper;
import org.apache.hadoop.hdds.utils.LeakDetector;
import org.apache.ratis.util.UncheckedAutoCloseable;
import org.rocksdb.RocksDB;
+import org.rocksdb.util.Environment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -94,4 +95,11 @@ public final class ManagedRocksObjectUtils {
public static void loadRocksDBLibrary() {
RocksDB.loadLibrary();
}
+
+ /**
+ * Returns RocksDB library file name.
+ */
+ public static String getRocksDBLibFileName() {
+ return Environment.getJniLibraryFileName("rocksdb");
+ }
}
diff --git a/hadoop-hdds/rocks-native/pom.xml b/hadoop-hdds/rocks-native/pom.xml
index 180ae93699..de8c68a480 100644
--- a/hadoop-hdds/rocks-native/pom.xml
+++ b/hadoop-hdds/rocks-native/pom.xml
@@ -253,6 +253,8 @@
<configuration>
<target>
<mkdir dir="${project.build.directory}/native/rocksdb"/>
+ <copy
file="${project.build.directory}/rocksdbjni/${rocksdbLibName}"
+
tofile="${project.build.directory}/native/rocksdb/${rocksdbLibName}" />
<exec executable="cmake" failonerror="true"
dir="${project.build.directory}/native/rocksdb">
<env key="CFLAGS" value="-fPIC"/>
<env key="CXXFLAGS" value="-fPIC"/>
@@ -263,7 +265,7 @@
<arg line="-DCMAKE_STANDARDS=${cmake.standards}"/>
<arg
line="-DROCKSDB_HEADERS=${project.build.directory}/rocksdb/rocksdb-${rocksdb.version}/include"/>
<arg
line="-DROCKSDB_TOOLS_LIB=${project.build.directory}/rocksdb/rocksdb-${rocksdb.version}"/>
- <arg
line="-DROCKSDB_LIB=${project.build.directory}/rocksdbjni/${rocksdbLibName}"/>
+ <arg
line="-DROCKSDB_LIB=${project.build.directory}/native/rocksdb/${rocksdbLibName}"/>
</exec>
<exec executable="make"
dir="${project.build.directory}/native/rocksdb" failonerror="true"/>
<delete
dir="${project.build.directory}/rocksdb/rocksdb-${rocksdb.version}"
diff --git a/hadoop-hdds/rocks-native/src/CMakeLists.txt
b/hadoop-hdds/rocks-native/src/CMakeLists.txt
index 4639e2a8c9..eb4fb8d46f 100644
--- a/hadoop-hdds/rocks-native/src/CMakeLists.txt
+++ b/hadoop-hdds/rocks-native/src/CMakeLists.txt
@@ -30,7 +30,14 @@ find_package(JNI REQUIRED)
include_directories(${JNI_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD ${CMAKE_STANDARDS})
-set(linked_libraries "")
+set(CMAKE_SKIP_BUILD_RPATH FALSE)
+
+set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+set(CMAKE_INSTALL_RPATH "")
+
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
+
if(NOT GENERATED_JAVAH)
message(FATAL_ERROR "You must set the CMake variable GENERATED_JAVAH")
endif()
@@ -38,17 +45,18 @@ include_directories(${GENERATED_JAVAH})
if(${SST_DUMP_INCLUDE})
include_directories(${ROCKSDB_HEADERS})
set(SOURCE_FILES ${NATIVE_DIR}/ManagedRawSSTFileReader.cpp
${NATIVE_DIR}/ManagedRawSSTFileIterator.cpp
${NATIVE_DIR}/cplusplus_to_java_convert.h)
- ADD_LIBRARY(rocksdb SHARED IMPORTED)
- set_target_properties(
- rocksdb
- PROPERTIES
- IMPORTED_LOCATION ${ROCKSDB_LIB})
ADD_LIBRARY(rocks_tools STATIC IMPORTED)
set_target_properties(
rocks_tools
PROPERTIES
IMPORTED_LOCATION ${ROCKSDB_TOOLS_LIB}/librocksdb_tools.a)
- set(linked_libraries ${linked_libraries} rocks_tools rocksdb)
endif()
+
add_library(ozone_rocksdb_tools SHARED ${SOURCE_FILES})
-target_link_libraries(ozone_rocksdb_tools ${linked_libraries})
+
+
+target_link_libraries(ozone_rocksdb_tools PRIVATE ${ROCKSDB_LIB})
+target_link_libraries(ozone_rocksdb_tools PRIVATE rocks_tools)
+set_target_properties(ozone_rocksdb_tools PROPERTIES
+ BUILD_WITH_INSTALL_RPATH FALSE
+ LINK_FLAGS "-Wl,-rpath -Wl,'$ORIGIN'")
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 10df236f88..ce424c930e 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
@@ -19,6 +19,7 @@
package org.apache.hadoop.hdds.utils;
import com.google.common.annotations.VisibleForTesting;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.ozone.util.ShutdownHookManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +29,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -101,7 +104,7 @@ public class NativeLibraryLoader {
.getOrDefault(libraryName, false);
}
- public synchronized boolean loadLibrary(final String libraryName) {
+ public synchronized boolean loadLibrary(final String libraryName, final
List<String> dependentFiles) {
if (isLibraryLoaded(libraryName)) {
return true;
}
@@ -116,9 +119,9 @@ public class NativeLibraryLoader {
}
if (!loaded) {
- Optional<File> file = copyResourceFromJarToTemp(libraryName);
- if (file.isPresent()) {
- System.load(file.get().getAbsolutePath());
+ Pair<Optional<File>, List<File>> files =
copyResourceFromJarToTemp(libraryName, dependentFiles);
+ if (files.getKey().isPresent()) {
+ System.load(files.getKey().get().getAbsolutePath());
loaded = true;
}
}
@@ -137,19 +140,20 @@ public class NativeLibraryLoader {
// Added function to make this testable
@VisibleForTesting
- static InputStream getResourceStream(String libraryFileName) {
+ static InputStream getResourceStream(String libraryFileName) throws
IOException {
return NativeLibraryLoader.class.getClassLoader()
.getResourceAsStream(libraryFileName);
}
- private Optional<File> copyResourceFromJarToTemp(final String libraryName)
+ private Pair<Optional<File>, List<File>> copyResourceFromJarToTemp(final
String libraryName,
+ final
List<String> dependentFileNames)
throws IOException {
final String libraryFileName = getJniLibraryFileName(libraryName);
InputStream is = null;
try {
is = getResourceStream(libraryFileName);
if (is == null) {
- return Optional.empty();
+ return Pair.of(Optional.empty(), null);
}
final String nativeLibDir =
@@ -160,15 +164,28 @@ public class NativeLibraryLoader {
// create a temporary file to copy the library to
final File temp = File.createTempFile(libraryName, getLibOsSuffix(),
dir);
if (!temp.exists()) {
- return Optional.empty();
+ return Pair.of(Optional.empty(), null);
} else {
temp.deleteOnExit();
}
Files.copy(is, temp.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ List<File> dependentFiles = new ArrayList<>();
+ for (String fileName : dependentFileNames) {
+ if (is != null) {
+ is.close();
+ }
+ is = getResourceStream(fileName);
+ File file = new File(dir, fileName);
+ Files.copy(is, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ if (file.exists()) {
+ file.deleteOnExit();
+ }
+ dependentFiles.add(file);
+ }
ShutdownHookManager.get().addShutdownHook(temp::delete,
LIBRARY_SHUTDOWN_HOOK_PRIORITY);
- return Optional.of(temp);
+ return Pair.of(Optional.of(temp), dependentFiles);
} finally {
if (is != null) {
is.close();
diff --git
a/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRawSSTFileReader.java
b/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRawSSTFileReader.java
index 7c8783b439..2a58dfce4c 100644
---
a/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRawSSTFileReader.java
+++
b/hadoop-hdds/rocks-native/src/main/java/org/apache/hadoop/hdds/utils/db/managed/ManagedRawSSTFileReader.java
@@ -23,6 +23,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Closeable;
+import java.util.Arrays;
import java.util.function.Function;
import static
org.apache.hadoop.hdds.utils.NativeConstants.ROCKS_TOOLS_NATIVE_LIBRARY_NAME;
@@ -34,7 +35,8 @@ public class ManagedRawSSTFileReader<T> implements Closeable {
public static boolean loadLibrary() throws NativeLibraryNotLoadedException {
ManagedRocksObjectUtils.loadRocksDBLibrary();
- if
(!NativeLibraryLoader.getInstance().loadLibrary(ROCKS_TOOLS_NATIVE_LIBRARY_NAME))
{
+ if
(!NativeLibraryLoader.getInstance().loadLibrary(ROCKS_TOOLS_NATIVE_LIBRARY_NAME,
Arrays.asList(
+ ManagedRocksObjectUtils.getRocksDBLibFileName()))) {
throw new
NativeLibraryNotLoadedException(ROCKS_TOOLS_NATIVE_LIBRARY_NAME);
}
return true;
diff --git
a/hadoop-hdds/rocks-native/src/test/java/org/apache/hadoop/hdds/utils/TestNativeLibraryLoader.java
b/hadoop-hdds/rocks-native/src/test/java/org/apache/hadoop/hdds/utils/TestNativeLibraryLoader.java
index 8f18f8d1e4..f0074e0a1a 100644
---
a/hadoop-hdds/rocks-native/src/test/java/org/apache/hadoop/hdds/utils/TestNativeLibraryLoader.java
+++
b/hadoop-hdds/rocks-native/src/test/java/org/apache/hadoop/hdds/utils/TestNativeLibraryLoader.java
@@ -28,6 +28,7 @@ import org.mockito.MockedStatic;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Path;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
@@ -72,7 +73,7 @@ public class TestNativeLibraryLoader {
mockedNativeLibraryLoader.when(() ->
NativeLibraryLoader.getResourceStream(anyString()))
.thenReturn(new ByteArrayInputStream(new byte[]{0, 1, 2, 3}));
String dummyLibraryName = "dummy_lib";
- NativeLibraryLoader.getInstance().loadLibrary(dummyLibraryName);
+ NativeLibraryLoader.getInstance().loadLibrary(dummyLibraryName,
Collections.emptyList());
NativeLibraryLoader.isLibraryLoaded(dummyLibraryName);
// Checking if the resource with random was copied to a temp file.
File[] libPath = new File(nativeLibraryDirectoryLocation == null ? "" :
nativeLibraryDirectoryLocation)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]