فهرست منبع

HDFS-3688. Namenode loses datanode hostname if datanode re-registers (Jason Lowe via daryn)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1364662 13f79535-47bb-0310-9956-ffa450edef68
Daryn Sharp 13 سال پیش
والد
کامیت
40519705d1

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

@@ -78,6 +78,9 @@ Release 0.23.3 - UNRELEASED
     HDFS-3646. LeaseRenewer can hold reference to inactive DFSClient
     instances forever (Kihwal Lee via daryn)
 
+    HDFS-3688. Namenode loses datanode hostname if datanode re-registers
+    (Jason Lowe via daryn)
+
 Release 0.23.2 - UNRELEASED
 
   INCOMPATIBLE CHANGES

+ 6 - 3
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java

@@ -35,7 +35,6 @@ import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_DNS_NAMESERVER_K
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HANDLER_COUNT_DEFAULT;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HANDLER_COUNT_KEY;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HOST_NAME_KEY;
-import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HTTPS_ADDRESS_KEY;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HTTP_ADDRESS_DEFAULT;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_HTTP_ADDRESS_KEY;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_KEY;
@@ -374,6 +373,7 @@ public class DataNode extends Configured
   private InetSocketAddress selfAddr;
   
   private volatile String hostName; // Host name of this datanode
+  private final String confHostName; 
   
   boolean isBlockTokenEnabled;
   BlockPoolTokenSecretManager blockPoolTokenSecretManager;
@@ -414,7 +414,8 @@ public class DataNode extends Configured
     this.userWithLocalPathAccess = conf
         .get(DFSConfigKeys.DFS_BLOCK_LOCAL_PATH_ACCESS_USER_KEY);
     try {
-      hostName = getHostName(conf);
+      confHostName = getHostName(conf);
+      hostName = confHostName;
       startDataNode(conf, dataDirs, resources);
     } catch (IOException ie) {
       shutdown();
@@ -830,7 +831,9 @@ public class DataNode extends Configured
    * before we can load any specific block pool.
    */
   private DatanodeRegistration createUnknownBPRegistration() {
-    DatanodeRegistration reg = new DatanodeRegistration(getMachineName());
+    DatanodeRegistration reg = new DatanodeRegistration(
+        confHostName + ":" + getPort());
+      
     reg.setInfoPort(infoServer.getPort());
     reg.setIpcPort(getIpcPort());
     return reg;

+ 35 - 2
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRegister.java

@@ -18,13 +18,18 @@
 
 package org.apache.hadoop.hdfs.server.datanode;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import java.net.InetSocketAddress;
 
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdfs.DFSConfigKeys;
+import org.apache.hadoop.hdfs.HdfsConfiguration;
 import org.apache.hadoop.hdfs.server.common.IncorrectVersionException;
 import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
 import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
@@ -62,4 +67,32 @@ public class TestDatanodeRegister {
       LOG.info("register() returned correct Exception: IncorrectVersionException");
     }
   }
+  
+  @Test
+  public void testDataNodeReregister() throws Exception {
+    
+    final String hostname = "somehostname";
+    Configuration conf = new HdfsConfiguration();
+    conf.set(DFSConfigKeys.FS_DEFAULT_NAME_KEY, "127.0.0.1:0");
+    conf.set(DFSConfigKeys.DFS_DATANODE_ADDRESS_KEY, "0.0.0.0:0");
+    conf.set(DFSConfigKeys.DFS_DATANODE_HTTP_ADDRESS_KEY, "0.0.0.0:0");
+    conf.set(DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_KEY, "0.0.0.0:0");
+    conf.set(DFSConfigKeys.DFS_DATANODE_HOST_NAME_KEY, hostname);
+    DataNode dn = new DataNode(conf, null);
+    try {
+      NamespaceInfo fakeNSInfo = mock(NamespaceInfo.class);
+      when(fakeNSInfo.getBuildVersion()).thenReturn("NSBuildVersion");
+      DatanodeRegistration bpReg = dn.createBPRegistration(fakeNSInfo);
+      assertEquals("Bad hostname in registration", hostname, bpReg.getHost());
+    
+      // set the datanode name to an IP address and verify the symbolic name
+      // is still used during registration
+      bpReg.setName("127.0.0.1:0");
+      dn.bpRegistrationSucceeded(bpReg, null);
+      bpReg = dn.createBPRegistration(fakeNSInfo);
+      assertEquals("Bad hostname in re-registration", hostname, bpReg.getHost());
+    } finally {
+      dn.shutdown();
+    }
+  }
 }