Browse Source

HDFS-7046. HA NN can NPE upon transition to active. Contributed by
Kihwal Lee.

Kihwal Lee 10 years ago
parent
commit
9e35571965

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -782,6 +782,8 @@ Release 2.6.0 - UNRELEASED
     HDFS-7096. Fix TestRpcProgramNfs3 to use DFS_ENCRYPTION_KEY_PROVIDER_URI
     HDFS-7096. Fix TestRpcProgramNfs3 to use DFS_ENCRYPTION_KEY_PROVIDER_URI
     (clamb via cmccabe)
     (clamb via cmccabe)
 
 
+    HDFS-7046. HA NN can NPE upon transition to active. (kihwal)
+
     BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS
     BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS
   
   
       HDFS-6387. HDFS CLI admin tool for creating & deleting an
       HDFS-6387. HDFS CLI admin tool for creating & deleting an

+ 5 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -1156,8 +1156,9 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
       cacheManager.startMonitorThread();
       cacheManager.startMonitorThread();
       blockManager.getDatanodeManager().setShouldSendCachingCommands(true);
       blockManager.getDatanodeManager().setShouldSendCachingCommands(true);
     } finally {
     } finally {
-      writeUnlock();
       startingActiveService = false;
       startingActiveService = false;
+      checkSafeMode();
+      writeUnlock();
     }
     }
   }
   }
 
 
@@ -5570,6 +5571,9 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
       // Have to have write-lock since leaving safemode initializes
       // Have to have write-lock since leaving safemode initializes
       // repl queues, which requires write lock
       // repl queues, which requires write lock
       assert hasWriteLock();
       assert hasWriteLock();
+      if (inTransitionToActive()) {
+        return;
+      }
       // if smmthread is already running, the block threshold must have been 
       // if smmthread is already running, the block threshold must have been 
       // reached before, there is no need to enter the safe mode again
       // reached before, there is no need to enter the safe mode again
       if (smmthread == null && needEnter()) {
       if (smmthread == null && needEnter()) {