Browse Source

HADOOP-1256. Fix NameNode so that multiple DatanodeDescriptors can no longer be created on startup. Contributed by Hairong.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@529330 13f79535-47bb-0310-9956-ffa450edef68
Doug Cutting 18 years ago
parent
commit
ad3dce67db
2 changed files with 10 additions and 3 deletions
  1. 3 0
      CHANGES.txt
  2. 7 3
      src/java/org/apache/hadoop/dfs/FSNamesystem.java

+ 3 - 0
CHANGES.txt

@@ -198,6 +198,9 @@ Trunk (unreleased changes)
     NullPointerException in JobControl.  
     NullPointerException in JobControl.  
     (Johan Oskarson via tomwhite)
     (Johan Oskarson via tomwhite)
 
 
+60. HADOOP-1256.  Fix NameNode so that multiple DataNodeDescriptors
+    can no longer be created on startup.  (Hairong Kuang via cutting)
+
 
 
 Release 0.12.3 - 2007-04-06
 Release 0.12.3 - 2007-04-06
 
 

+ 7 - 3
src/java/org/apache/hadoop/dfs/FSNamesystem.java

@@ -2008,7 +2008,12 @@ class FSNamesystem implements FSConstants {
     }
     }
     
     
     void unprotectedAddDatanode( DatanodeDescriptor nodeDescr ) {
     void unprotectedAddDatanode( DatanodeDescriptor nodeDescr ) {
-      datanodeMap.put( nodeDescr.getStorageID(), nodeDescr );
+      /* To keep host2DataNodeMap consistent with datanodeMap,
+         remove  from host2DataNodeMap the datanodeDescriptor removed
+         from datanodeMap before adding nodeDescr to host2DataNodeMap.
+       */
+      host2DataNodeMap.remove(
+          datanodeMap.put(nodeDescr.getStorageID(), nodeDescr));
       host2DataNodeMap.add(nodeDescr);
       host2DataNodeMap.add(nodeDescr);
       
       
       NameNode.stateChangeLog.debug(
       NameNode.stateChangeLog.debug(
@@ -2024,8 +2029,7 @@ class FSNamesystem implements FSConstants {
      */
      */
     void wipeDatanode( DatanodeID nodeID ) throws IOException {
     void wipeDatanode( DatanodeID nodeID ) throws IOException {
       String key = nodeID.getStorageID();
       String key = nodeID.getStorageID();
-      datanodeMap.remove(key);
-      host2DataNodeMap.remove(getDatanode( nodeID ));
+      host2DataNodeMap.remove(datanodeMap.remove(key));
       NameNode.stateChangeLog.debug(
       NameNode.stateChangeLog.debug(
           "BLOCK* NameSystem.wipeDatanode: "
           "BLOCK* NameSystem.wipeDatanode: "
           + nodeID.getName() + " storage " + key 
           + nodeID.getName() + " storage " + key