You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ra...@apache.org on 2019/10/27 17:09:06 UTC
[hadoop] 10/10: HDFS-14818. Check native pmdk lib by 'hadoop
checknative' command. Contributed by Feilong He.
This is an automated email from the ASF dual-hosted git repository.
rakeshr pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit 2db0b8f6ca590452159472250dd6d082c87a0911
Author: Rakesh Radhakrishnan <ra...@apache.org>
AuthorDate: Sun Sep 22 22:02:54 2019 +0530
HDFS-14818. Check native pmdk lib by 'hadoop checknative' command. Contributed by Feilong He.
(cherry picked from commit 659c88801d008bb352d10a1cb3bd0e401486cc9b)
---
.../hadoop-common/src/CMakeLists.txt | 2 +-
.../org/apache/hadoop/io/nativeio/NativeIO.java | 28 +++++++++++++++++-----
.../apache/hadoop/util/NativeLibraryChecker.java | 10 ++++++++
.../src/org/apache/hadoop/io/nativeio/NativeIO.c | 14 ++++++++++-
.../src/org/apache/hadoop/io/nativeio/pmdk_load.c | 28 +++++++++++-----------
.../src/org/apache/hadoop/io/nativeio/pmdk_load.h | 5 ----
.../datanode/fsdataset/impl/FsDatasetCache.java | 15 +++++++++---
7 files changed, 72 insertions(+), 30 deletions(-)
diff --git a/hadoop-common-project/hadoop-common/src/CMakeLists.txt b/hadoop-common-project/hadoop-common/src/CMakeLists.txt
index 771c685..10591f6 100644
--- a/hadoop-common-project/hadoop-common/src/CMakeLists.txt
+++ b/hadoop-common-project/hadoop-common/src/CMakeLists.txt
@@ -170,7 +170,7 @@ if(REQUIRE_PMDK)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${STORED_CMAKE_FIND_LIBRARY_SUFFIXES})
if(PMDK_LIBRARY)
- GET_FILENAME_COMPONENT(HADOOP_PMDK_LIBRARY ${PMDK_LIBRARY} NAME)
+ GET_FILENAME_COMPONENT(HADOOP_PMDK_LIBRARY ${PMDK_LIBRARY} REALPATH)
set(PMDK_SOURCE_FILES ${SRC}/io/nativeio/pmdk_load.c)
else(PMDK_LIBRARY)
MESSAGE(FATAL_ERROR "The required PMDK library is NOT found. PMDK_LIBRARY=${PMDK_LIBRARY}")
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java
index e18d70e..f2b3456 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java
@@ -119,16 +119,19 @@ public class NativeIO {
public String getMessage() {
String msg;
switch (stateCode) {
+ // -1 represents UNSUPPORTED.
case -1:
- msg = "The native code is built without PMDK support.";
+ msg = "The native code was built without PMDK support.";
break;
+ // 1 represents PMDK_LIB_NOT_FOUND.
case 1:
- msg = "The native code is built with PMDK support, but PMDK libs " +
- "are NOT found in execution environment or failed to be loaded.";
+ msg = "The native code was built with PMDK support, but PMDK libs " +
+ "were NOT found in execution environment or failed to be loaded.";
break;
+ // 0 represents SUPPORTED.
case 0:
- msg = "The native code is built with PMDK support, and PMDK libs " +
- "are loaded successfully.";
+ msg = "The native code was built with PMDK support, and PMDK libs " +
+ "were loaded successfully.";
break;
default:
msg = "The state code: " + stateCode + " is unrecognized!";
@@ -139,7 +142,7 @@ public class NativeIO {
// Denotes the state of supporting PMDK. The value is set by JNI.
private static SupportState pmdkSupportState =
- SupportState.PMDK_LIB_NOT_FOUND;
+ SupportState.UNSUPPORTED;
private static final Logger LOG = LoggerFactory.getLogger(NativeIO.class);
@@ -176,6 +179,14 @@ public class NativeIO {
LOG.error("The state code: " + stateCode + " is unrecognized!");
}
+ public static String getPmdkSupportStateMessage() {
+ if (getPmdkLibPath() != null) {
+ return pmdkSupportState.getMessage() +
+ " The pmdk lib path: " + getPmdkLibPath();
+ }
+ return pmdkSupportState.getMessage();
+ }
+
public static boolean isPmdkAvailable() {
LOG.info(pmdkSupportState.getMessage());
return pmdkSupportState == SupportState.SUPPORTED;
@@ -241,8 +252,13 @@ public class NativeIO {
NativeIO.POSIX.pmemSync(region.getAddress(), region.getLength());
}
}
+
+ public static String getPmdkLibPath() {
+ return POSIX.getPmdkLibPath();
+ }
}
+ private static native String getPmdkLibPath();
private static native boolean isPmemCheck(long address, long length);
private static native PmemMappedRegion pmemCreateMapFile(String path,
long length);
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/NativeLibraryChecker.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/NativeLibraryChecker.java
index 776839c..2338824 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/NativeLibraryChecker.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/NativeLibraryChecker.java
@@ -28,6 +28,7 @@ import org.apache.hadoop.io.compress.bzip2.Bzip2Factory;
import org.apache.hadoop.io.compress.zlib.ZlibFactory;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.io.nativeio.NativeIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,6 +70,7 @@ public class NativeLibraryChecker {
boolean snappyLoaded = false;
boolean isalLoaded = false;
boolean zStdLoaded = false;
+ boolean pmdkLoaded = false;
// lz4 is linked within libhadoop
boolean lz4Loaded = nativeHadoopLoaded;
boolean bzip2Loaded = Bzip2Factory.isNativeBzip2Loaded(conf);
@@ -80,6 +82,7 @@ public class NativeLibraryChecker {
String zlibLibraryName = "";
String snappyLibraryName = "";
String isalDetail = "";
+ String pmdkDetail = "";
String zstdLibraryName = "";
String lz4LibraryName = "";
String bzip2LibraryName = "";
@@ -110,6 +113,12 @@ public class NativeLibraryChecker {
isalLoaded = true;
}
+ pmdkDetail = NativeIO.POSIX.getPmdkSupportStateMessage();
+ pmdkLoaded = NativeIO.POSIX.isPmdkAvailable();
+ if (pmdkLoaded) {
+ pmdkDetail = NativeIO.POSIX.Pmem.getPmdkLibPath();
+ }
+
openSslDetail = OpensslCipher.getLoadingFailureReason();
if (openSslDetail != null) {
openSslLoaded = false;
@@ -148,6 +157,7 @@ public class NativeLibraryChecker {
System.out.printf("bzip2: %b %s%n", bzip2Loaded, bzip2LibraryName);
System.out.printf("openssl: %b %s%n", openSslLoaded, openSslDetail);
System.out.printf("ISA-L: %b %s%n", isalLoaded, isalDetail);
+ System.out.printf("PMDK: %b %s%n", pmdkLoaded, pmdkDetail);
if (Shell.WINDOWS) {
System.out.printf("winutils: %b %s%n", winutilsExists, winutilsPath);
diff --git a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/NativeIO.c b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
index 3a0641b..b0b5151 100644
--- a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
+++ b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
@@ -292,10 +292,13 @@ static int loadPmdkLib(JNIEnv *env) {
if (mid == 0) {
return 0;
}
+
if (strlen(errMsg) > 0) {
+ // Set PMDK support state to 1 which represents PMDK_LIB_NOT_FOUND.
(*env)->CallStaticVoidMethod(env, clazz, mid, 1);
return 0;
}
+ // Set PMDK support state to 0 which represents SUPPORTED.
(*env)->CallStaticVoidMethod(env, clazz, mid, 0);
return 1;
}
@@ -1620,7 +1623,7 @@ JNIEXPORT void JNICALL Java_org_apache_hadoop_io_nativeio_NativeIO_00024POSIX_pm
char msg[1000];
succeed = pmdkLoader->pmem_msync(address, length);
// succeed = -1 failure
- if (succeed = -1) {
+ if (succeed == -1) {
snprintf(msg, sizeof(msg), "Failed to msync region. address: %x, length: %x, error msg: %s", address, length, pmem_errormsg());
THROW(env, "java/io/IOException", msg);
return;
@@ -1631,6 +1634,15 @@ JNIEXPORT void JNICALL Java_org_apache_hadoop_io_nativeio_NativeIO_00024POSIX_pm
#endif
}
+JNIEXPORT jstring JNICALL Java_org_apache_hadoop_io_nativeio_NativeIO_00024POSIX_getPmdkLibPath
+ (JNIEnv * env, jclass thisClass) {
+ jstring libpath = NULL;
+
+ #ifdef HADOOP_PMDK_LIBRARY
+ libpath = (*env)->NewStringUTF(env, HADOOP_PMDK_LIBRARY);
+ #endif
+ return libpath;
+ }
#ifdef __cplusplus
}
diff --git a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.c b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.c
index f7d6cfb..502508c 100644
--- a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.c
+++ b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.c
@@ -59,11 +59,11 @@ static const char* load_functions() {
void load_pmdk_lib(char* err, size_t err_len) {
const char* errMsg;
const char* library = NULL;
-#ifdef UNIX
- Dl_info dl_info;
-#else
- LPTSTR filename = NULL;
-#endif
+ #ifdef UNIX
+ Dl_info dl_info;
+ #else
+ LPTSTR filename = NULL;
+ #endif
err[0] = '\0';
@@ -88,15 +88,15 @@ void load_pmdk_lib(char* err, size_t err_len) {
snprintf(err, err_len, "Loading functions from PMDK failed: %s", errMsg);
}
-#ifdef UNIX
- if(dladdr(pmdkLoader->pmem_map_file, &dl_info)) {
- library = dl_info.dli_fname;
- }
-#else
- if (GetModuleFileName(pmdkLoader->libec, filename, 256) > 0) {
- library = filename;
- }
-#endif
+ #ifdef UNIX
+ if (dladdr(pmdkLoader->pmem_map_file, &dl_info)) {
+ library = dl_info.dli_fname;
+ }
+ #else
+ if (GetModuleFileName(pmdkLoader->libec, filename, 256) > 0) {
+ library = filename;
+ }
+ #endif
if (library == NULL) {
library = HADOOP_PMDK_LIBRARY;
diff --git a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.h b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.h
index c93a076..a668377 100644
--- a/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.h
+++ b/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.h
@@ -80,11 +80,6 @@ void *myDlsym(void *handle, const char *symbol) {
#endif
/**
- * Return 0 if not support, 1 otherwise.
- */
-int build_support_pmdk();
-
-/**
* Initialize and load PMDK library, returning error message if any.
*
* @param err The err message buffer.
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetCache.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetCache.java
index 2e85eaa..8c2a758 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetCache.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetCache.java
@@ -267,8 +267,8 @@ public class FsDatasetCache {
Value prevValue = mappableBlockMap.get(key);
boolean deferred = false;
- if (!dataset.datanode.getShortCircuitRegistry().
- processBlockMunlockRequest(key)) {
+ if (cacheLoader.isTransientCache() && !dataset.datanode.
+ getShortCircuitRegistry().processBlockMunlockRequest(key)) {
deferred = true;
}
if (prevValue == null) {
@@ -438,7 +438,11 @@ public class FsDatasetCache {
}
LOG.debug("Successfully cached {}. We are now caching {} bytes in"
+ " total.", key, newUsedBytes);
- dataset.datanode.getShortCircuitRegistry().processBlockMlockEvent(key);
+ // Only applicable to DRAM cache.
+ if (cacheLoader.isTransientCache()) {
+ dataset.datanode.
+ getShortCircuitRegistry().processBlockMlockEvent(key);
+ }
numBlocksCached.addAndGet(1);
dataset.datanode.getMetrics().incrBlocksCached(1);
success = true;
@@ -476,6 +480,11 @@ public class FsDatasetCache {
}
private boolean shouldDefer() {
+ // Currently, defer condition is just checked for DRAM cache case.
+ if (!cacheLoader.isTransientCache()) {
+ return false;
+ }
+
/* If revocationTimeMs == 0, this is an immediate uncache request.
* No clients were anchored at the time we made the request. */
if (revocationTimeMs == 0) {
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org