Browse Source

HDFS-16014: Fix an issue in checking native pmdk lib by 'hadoop checknative' command (#3762)

PHILO-HE 3 years ago
parent
commit
8e08f43e03

+ 1 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java

@@ -141,7 +141,7 @@ public class NativeIO {
       }
       }
     }
     }
 
 
-    // Denotes the state of supporting PMDK. The value is set by JNI.
+    // Denotes the state of supporting PMDK. The actual value is set via JNI.
     private static SupportState pmdkSupportState =
     private static SupportState pmdkSupportState =
         SupportState.UNSUPPORTED;
         SupportState.UNSUPPORTED;
 
 

+ 12 - 3
hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/nativeio/pmdk_load.c

@@ -35,13 +35,14 @@
 #endif
 #endif
 
 
 PmdkLibLoader * pmdkLoader;
 PmdkLibLoader * pmdkLoader;
+// 1 represents loaded. Otherwise, not loaded.
+int pmdkLoaded;
 
 
 /**
 /**
  *  pmdk_load.c
  *  pmdk_load.c
  *  Utility of loading the libpmem library and the required functions.
  *  Utility of loading the libpmem library and the required functions.
  *  Building of this codes won't rely on any libpmem source codes, but running
  *  Building of this codes won't rely on any libpmem source codes, but running
  *  into this will rely on successfully loading of the dynamic library.
  *  into this will rely on successfully loading of the dynamic library.
- *
  */
  */
 
 
 static const char* load_functions() {
 static const char* load_functions() {
@@ -56,6 +57,10 @@ static const char* load_functions() {
   return NULL;
   return NULL;
 }
 }
 
 
+/**
+ * It should be idempotent to call this function for checking
+ * whether PMDK lib is successfully loaded.
+ */
 void load_pmdk_lib(char* err, size_t err_len) {
 void load_pmdk_lib(char* err, size_t err_len) {
   const char* errMsg;
   const char* errMsg;
   const char* library = NULL;
   const char* library = NULL;
@@ -67,10 +72,13 @@ void load_pmdk_lib(char* err, size_t err_len) {
 
 
   err[0] = '\0';
   err[0] = '\0';
 
 
-  if (pmdkLoader != NULL) {
+  if (pmdkLoaded == 1) {
     return;
     return;
   }
   }
-  pmdkLoader = calloc(1, sizeof(PmdkLibLoader));
+
+  if (pmdkLoader == NULL) {
+    pmdkLoader = calloc(1, sizeof(PmdkLibLoader));
+  }
 
 
   // Load PMDK library
   // Load PMDK library
   #ifdef UNIX
   #ifdef UNIX
@@ -103,4 +111,5 @@ void load_pmdk_lib(char* err, size_t err_len) {
   }
   }
 
 
   pmdkLoader->libname = strdup(library);
   pmdkLoader->libname = strdup(library);
+  pmdkLoaded = 1;
 }
 }