Bladeren bron

HDFS-4210. Throw helpful exception when DNS entry for JournalNode cannot be resolved. Contributed by Charles Lamb and John Zhuge.

(cherry picked from commit a291306510b76d1d3382c31bea7eeb54c89c4fb4)
Xiao Chen 8 jaren geleden
bovenliggende
commit
1f2ab8b742

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

@@ -39,6 +39,9 @@ Release 2.7.6 - UNRELEASED
     HDFS-13112. Token expiration edits may cause log corruption or deadlock.
     HDFS-13112. Token expiration edits may cause log corruption or deadlock.
     (daryn via kihwal)
     (daryn via kihwal)
 
 
+    HDFS-4210. Throw helpful exception when DNS entry for JournalNode cannot be
+    resolved. (Charles Lamb and John Zhuge)
+
 Release 2.7.5 - 2017-12-14
 Release 2.7.5 - 2017-12-14
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 7 - 2
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java

@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.InetSocketAddress;
 import java.net.URI;
 import java.net.URI;
 import java.net.URL;
 import java.net.URL;
+import java.net.UnknownHostException;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
@@ -387,8 +388,12 @@ public class QuorumJournalManager implements JournalManager {
     
     
     List<InetSocketAddress> addrs = Lists.newArrayList();
     List<InetSocketAddress> addrs = Lists.newArrayList();
     for (String addr : parts) {
     for (String addr : parts) {
-      addrs.add(NetUtils.createSocketAddr(
-          addr, DFSConfigKeys.DFS_JOURNALNODE_RPC_PORT_DEFAULT));
+      InetSocketAddress isa = NetUtils.createSocketAddr(
+          addr, DFSConfigKeys.DFS_JOURNALNODE_RPC_PORT_DEFAULT);
+      if (isa.isUnresolved()) {
+        throw new UnknownHostException(addr);
+      }
+      addrs.add(isa);
     }
     }
     return addrs;
     return addrs;
   }
   }

+ 18 - 1
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQJMWithFaults.java

@@ -27,7 +27,9 @@ import java.io.Closeable;
 import java.io.IOException;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.InetSocketAddress;
 import java.net.InetSocketAddress;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URISyntaxException;
+import java.net.UnknownHostException;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Random;
 import java.util.Random;
@@ -53,7 +55,9 @@ import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.ipc.ProtobufRpcEngine;
 import org.apache.hadoop.ipc.ProtobufRpcEngine;
 import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.log4j.Level;
 import org.apache.log4j.Level;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.mockito.Mockito;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.mockito.stubbing.Answer;
@@ -125,7 +129,10 @@ public class TestQJMWithFaults {
     }
     }
     return ret;
     return ret;
   }
   }
-  
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   /**
   /**
    * Sets up two of the nodes to each drop a single RPC, at all
    * Sets up two of the nodes to each drop a single RPC, at all
    * possible combinations of RPCs. This may result in the
    * possible combinations of RPCs. This may result in the
@@ -185,6 +192,16 @@ public class TestQJMWithFaults {
     }
     }
   }
   }
   
   
+  /**
+   * Expect {@link UnknownHostException} if a hostname can't be resolved.
+   */
+  @Test
+  public void testUnresolvableHostName() throws Exception {
+    expectedException.expect(UnknownHostException.class);
+    new QuorumJournalManager(conf,
+        new URI("qjournal://" + "bogus:12345" + "/" + JID), FAKE_NSINFO);
+  }
+
   /**
   /**
    * Test case in which three JournalNodes randomly flip flop between
    * Test case in which three JournalNodes randomly flip flop between
    * up and down states every time they get an RPC.
    * up and down states every time they get an RPC.