|
@@ -33,6 +33,7 @@ import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMESERVICE_ID;
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_SERVER_HTTPS_KEYPASSWORD_KEY;
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_PASSWORD_KEY;
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_SERVER_HTTPS_TRUSTSTORE_PASSWORD_KEY;
|
|
|
+import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT;
|
|
|
import static org.apache.hadoop.test.GenericTestUtils.assertExceptionContains;
|
|
|
import static org.apache.hadoop.test.PlatformAssumptions.assumeNotWindows;
|
|
|
import static org.hamcrest.CoreMatchers.not;
|
|
@@ -83,9 +84,9 @@ import com.google.common.collect.Sets;
|
|
|
|
|
|
public class TestDFSUtil {
|
|
|
|
|
|
- static final String NS1_NN_ADDR = "ns1-nn.example.com:9820";
|
|
|
- static final String NS1_NN1_ADDR = "ns1-nn1.example.com:9820";
|
|
|
- static final String NS1_NN2_ADDR = "ns1-nn2.example.com:9820";
|
|
|
+ private static final String NS1_NN_ADDR = "ns1-nn.example.com:9820";
|
|
|
+ private static final String NS1_NN1_ADDR = "ns1-nn1.example.com:9820";
|
|
|
+ private static final String NS1_NN2_ADDR = "ns1-nn2.example.com:9820";
|
|
|
|
|
|
/**
|
|
|
* Reset to default UGI settings since some tests change them.
|
|
@@ -273,13 +274,13 @@ public class TestDFSUtil {
|
|
|
assertEquals(1, nn1Map.size());
|
|
|
InetSocketAddress addr = nn1Map.get(null);
|
|
|
assertEquals("localhost", addr.getHostName());
|
|
|
- assertEquals(9000, addr.getPort());
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT, addr.getPort());
|
|
|
|
|
|
Map<String, InetSocketAddress> nn2Map = nnMap.get("nn2");
|
|
|
assertEquals(1, nn2Map.size());
|
|
|
addr = nn2Map.get(null);
|
|
|
assertEquals("localhost", addr.getHostName());
|
|
|
- assertEquals(9001, addr.getPort());
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT, addr.getPort());
|
|
|
|
|
|
// Test - can look up nameservice ID from service address
|
|
|
checkNameServiceId(conf, NN1_ADDRESS, "nn1");
|
|
@@ -314,7 +315,8 @@ public class TestDFSUtil {
|
|
|
Map<String, InetSocketAddress> defaultNsMap = addrMap.get(null);
|
|
|
assertEquals(1, defaultNsMap.size());
|
|
|
|
|
|
- assertEquals(9999, defaultNsMap.get(null).getPort());
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT,
|
|
|
+ defaultNsMap.get(null).getPort());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -491,6 +493,10 @@ public class TestDFSUtil {
|
|
|
final String NS1_NN2_HOST = "ns1-nn2.example.com:9820";
|
|
|
final String NS2_NN1_HOST = "ns2-nn1.example.com:9820";
|
|
|
final String NS2_NN2_HOST = "ns2-nn2.example.com:9820";
|
|
|
+ final String NS1_NN1_SERVICE_HOST = "ns1-nn1.example.com:9840";
|
|
|
+ final String NS1_NN2_SERVICE_HOST = "ns1-nn2.example.com:9840";
|
|
|
+ final String NS2_NN1_SERVICE_HOST = "ns2-nn1.example.com:9840";
|
|
|
+ final String NS2_NN2_SERVICE_HOST = "ns2-nn2.example.com:9840";
|
|
|
conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY, "hdfs://ns1");
|
|
|
|
|
|
// Two nameservices, each with two NNs.
|
|
@@ -524,12 +530,14 @@ public class TestDFSUtil {
|
|
|
assertEquals(NS2_NN1_HOST, map.get("ns2").get("ns2-nn1").toString());
|
|
|
assertEquals(NS2_NN2_HOST, map.get("ns2").get("ns2-nn2").toString());
|
|
|
|
|
|
- assertEquals(NS1_NN1_HOST,
|
|
|
+ assertEquals(NS1_NN1_SERVICE_HOST,
|
|
|
DFSUtil.getNamenodeServiceAddr(conf, "ns1", "ns1-nn1"));
|
|
|
- assertEquals(NS1_NN2_HOST,
|
|
|
+ assertEquals(NS1_NN2_SERVICE_HOST,
|
|
|
DFSUtil.getNamenodeServiceAddr(conf, "ns1", "ns1-nn2"));
|
|
|
- assertEquals(NS2_NN1_HOST,
|
|
|
+ assertEquals(NS2_NN1_SERVICE_HOST,
|
|
|
DFSUtil.getNamenodeServiceAddr(conf, "ns2", "ns2-nn1"));
|
|
|
+ assertEquals(NS2_NN2_SERVICE_HOST,
|
|
|
+ DFSUtil.getNamenodeServiceAddr(conf, "ns2", "ns2-nn2"));
|
|
|
|
|
|
// No nameservice was given and we can't determine which service addr
|
|
|
// to use as two nameservices could share a namenode ID.
|
|
@@ -555,9 +563,11 @@ public class TestDFSUtil {
|
|
|
|
|
|
// One nameservice with two NNs
|
|
|
final String NS1_NN1_HOST = "ns1-nn1.example.com:9820";
|
|
|
- final String NS1_NN1_HOST_SVC = "ns1-nn2.example.com:9821";
|
|
|
- final String NS1_NN2_HOST = "ns1-nn1.example.com:9820";
|
|
|
+ final String NS1_NN1_HOST_SVC = "ns1-nn1.example.com:9821";
|
|
|
+ final String NS1_NN1_HOST_DEFAULT_SVC = "ns1-nn1.example.com:9840";
|
|
|
+ final String NS1_NN2_HOST = "ns1-nn2.example.com:9820";
|
|
|
final String NS1_NN2_HOST_SVC = "ns1-nn2.example.com:9821";
|
|
|
+ final String NS1_NN2_HOST_DEFAULT_SVC = "ns1-nn2.example.com:9840";
|
|
|
|
|
|
conf.set(DFS_NAMESERVICES, "ns1");
|
|
|
conf.set(DFSUtil.addKeySuffixes(DFS_HA_NAMENODES_KEY_PREFIX, "ns1"),"nn1,nn2");
|
|
@@ -567,12 +577,15 @@ public class TestDFSUtil {
|
|
|
conf.set(DFSUtil.addKeySuffixes(
|
|
|
DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn2"), NS1_NN2_HOST);
|
|
|
|
|
|
- // The rpc address is used if no service address is defined
|
|
|
- assertEquals(NS1_NN1_HOST, DFSUtil.getNamenodeServiceAddr(conf, null, "nn1"));
|
|
|
- assertEquals(NS1_NN2_HOST, DFSUtil.getNamenodeServiceAddr(conf, null, "nn2"));
|
|
|
+ // The default service rpc address is used if no service address is defined
|
|
|
+ assertEquals(NS1_NN1_HOST_DEFAULT_SVC,
|
|
|
+ DFSUtil.getNamenodeServiceAddr(conf, null, "nn1"));
|
|
|
+ assertEquals(NS1_NN2_HOST_DEFAULT_SVC,
|
|
|
+ DFSUtil.getNamenodeServiceAddr(conf, null, "nn2"));
|
|
|
|
|
|
// A nameservice is specified explicitly
|
|
|
- assertEquals(NS1_NN1_HOST, DFSUtil.getNamenodeServiceAddr(conf, "ns1", "nn1"));
|
|
|
+ assertEquals(NS1_NN1_HOST_DEFAULT_SVC,
|
|
|
+ DFSUtil.getNamenodeServiceAddr(conf, "ns1", "nn1"));
|
|
|
assertEquals(null, DFSUtil.getNamenodeServiceAddr(conf, "invalid", "nn1"));
|
|
|
|
|
|
// The service addrs are used when they are defined
|
|
@@ -995,6 +1008,92 @@ public class TestDFSUtil {
|
|
|
Assert.assertEquals(null, DFSUtil.getPassword(conf,"invalid-alias"));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testGetNNServiceRpcAddresses() throws IOException {
|
|
|
+ Configuration conf = new HdfsConfiguration();
|
|
|
+ final String NN_HOST = "nn.example.com";
|
|
|
+ final String NN_ADDRESS = "hdfs://" + NN_HOST + ":9000/";
|
|
|
+ conf.set(FS_DEFAULT_NAME_KEY, NN_ADDRESS);
|
|
|
+
|
|
|
+ // No service RPC, no rpc
|
|
|
+ Map<String, Map<String, InetSocketAddress>> nsMap = DFSUtil
|
|
|
+ .getNNServiceRpcAddresses(conf);
|
|
|
+ assertEquals(1, nsMap.size());
|
|
|
+ InetSocketAddress address = nsMap.get(null).get(null);
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT,
|
|
|
+ address.getPort());
|
|
|
+ assertEquals(NN_HOST, address.getHostName());
|
|
|
+
|
|
|
+ // No service RPC
|
|
|
+ final String RPC_ADDRESS = NN_HOST + ":9191";
|
|
|
+ conf.set(DFS_NAMENODE_RPC_ADDRESS_KEY, RPC_ADDRESS);
|
|
|
+ nsMap = DFSUtil.getNNServiceRpcAddresses(conf);
|
|
|
+ assertEquals(1, nsMap.size());
|
|
|
+ address = nsMap.get(null).get(null);
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT,
|
|
|
+ address.getPort());
|
|
|
+ assertEquals(NN_HOST, address.getHostName());
|
|
|
+
|
|
|
+ // Service RPC present
|
|
|
+ final String SERVICE_RPC_ADDRESS = NN_HOST + ":9292";
|
|
|
+ conf.set(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, SERVICE_RPC_ADDRESS);
|
|
|
+ nsMap = DFSUtil.getNNServiceRpcAddresses(conf);
|
|
|
+ assertEquals(1, nsMap.size());
|
|
|
+ address = nsMap.get(null).get(null);
|
|
|
+ assertEquals(9292, address.getPort());
|
|
|
+ assertEquals(NN_HOST, address.getHostName());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testGetNNServiceRpcAddressesForHA() throws IOException {
|
|
|
+ Configuration conf = new HdfsConfiguration();
|
|
|
+
|
|
|
+ final String NS = "mycluster";
|
|
|
+ final String NN1_HOST = "nn1.example.com";
|
|
|
+ final String NN2_HOST = "nn2.example.com";
|
|
|
+ conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY, "hdfs://mycluster");
|
|
|
+
|
|
|
+ conf.set(DFS_NAMESERVICES, NS);
|
|
|
+ conf.set(DFSUtil.addKeySuffixes(DFS_HA_NAMENODES_KEY_PREFIX, NS),
|
|
|
+ "nn1,nn2");
|
|
|
+ conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_RPC_ADDRESS_KEY, NS, "nn1"),
|
|
|
+ NN1_HOST + ":9820");
|
|
|
+ conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_RPC_ADDRESS_KEY, NS, "nn2"),
|
|
|
+ NN2_HOST + ":9820");
|
|
|
+
|
|
|
+ assertTrue(HAUtil.isHAEnabled(conf, NS));
|
|
|
+
|
|
|
+ // Without Service RPC keys
|
|
|
+ Map<String, Map<String, InetSocketAddress>> nsMap =
|
|
|
+ DFSUtil.getNNServiceRpcAddresses(conf);
|
|
|
+ assertEquals(1, nsMap.size());
|
|
|
+ Map<String, InetSocketAddress> nnMap = nsMap.get(NS);
|
|
|
+ assertEquals(2, nnMap.size());
|
|
|
+ InetSocketAddress nn1Address = nnMap.get("nn1");
|
|
|
+ assertEquals(NN1_HOST, nn1Address.getHostName());
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT, nn1Address.getPort());
|
|
|
+ InetSocketAddress nn2Address = nnMap.get("nn2");
|
|
|
+ assertEquals(NN2_HOST, nn2Address.getHostName());
|
|
|
+ assertEquals(DFS_NAMENODE_SERVICE_RPC_PORT_DEFAULT, nn2Address.getPort());
|
|
|
+
|
|
|
+ // With Service RPC keys
|
|
|
+ final int CUSTOM_SERVICE_PORT = 9191;
|
|
|
+ conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY,
|
|
|
+ NS, "nn1"), NN1_HOST + ":" + CUSTOM_SERVICE_PORT);
|
|
|
+ conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY,
|
|
|
+ NS, "nn2"), NN2_HOST + ":" + CUSTOM_SERVICE_PORT);
|
|
|
+ nsMap = DFSUtil.getNNServiceRpcAddresses(conf);
|
|
|
+ assertEquals(1, nsMap.size());
|
|
|
+ nnMap = nsMap.get(NS);
|
|
|
+ assertEquals(2, nnMap.size());
|
|
|
+ nn1Address = nnMap.get("nn1");
|
|
|
+ assertEquals(NN1_HOST, nn1Address.getHostName());
|
|
|
+ assertEquals(CUSTOM_SERVICE_PORT, nn1Address.getPort());
|
|
|
+ nn2Address = nnMap.get("nn2");
|
|
|
+ assertEquals(NN2_HOST, nn2Address.getHostName());
|
|
|
+ assertEquals(CUSTOM_SERVICE_PORT, nn2Address.getPort());
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testGetNNServiceRpcAddressesForNsIds() throws IOException {
|
|
|
Configuration conf = new HdfsConfiguration();
|
|
@@ -1017,13 +1116,13 @@ public class TestDFSUtil {
|
|
|
}
|
|
|
|
|
|
Map<String, Map<String, InetSocketAddress>> nnMap = DFSUtil
|
|
|
- .getNNServiceRpcAddressesForCluster(conf);
|
|
|
+ .getNNServiceRpcAddresses(conf);
|
|
|
assertEquals(1, nnMap.size());
|
|
|
assertTrue(nnMap.containsKey("nn1"));
|
|
|
|
|
|
conf.set(DFS_INTERNAL_NAMESERVICES_KEY, "nn3");
|
|
|
try {
|
|
|
- DFSUtil.getNNServiceRpcAddressesForCluster(conf);
|
|
|
+ DFSUtil.getNNServiceRpcAddresses(conf);
|
|
|
fail("Should fail for misconfiguration");
|
|
|
} catch (IOException ignored) {
|
|
|
}
|