瀏覽代碼

HDDS-1096. OzoneManager#loadOMHAConfigs should use default ports in case port is not defined. Contributed by Hanisha Koneru.

Márton Elek 6 年之前
父節點
當前提交
7a57974f1f

+ 31 - 0
hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java

@@ -79,6 +79,24 @@ public final class OmUtils {
         getOmRpcPort(conf);
   }
 
+  /**
+   * Retrieve the socket address that is used by OM as specified by the confKey.
+   * Return null if the specified conf key is not set.
+   * @param conf configuration
+   * @param confKey configuration key to lookup address from
+   * @return Target InetSocketAddress for the OM RPC server.
+   */
+  public static String getOmRpcAddress(Configuration conf, String confKey) {
+    final Optional<String> host = getHostNameFromConfigKeys(conf, confKey);
+
+    if (host.isPresent()) {
+      return host.get() + ":" + getOmRpcPort(conf, confKey);
+    } else {
+      // The specified confKey is not set
+      return null;
+    }
+  }
+
   /**
    * Retrieve the socket address that should be used by clients to connect
    * to OM.
@@ -108,6 +126,19 @@ public final class OmUtils {
     return port.orElse(OZONE_OM_PORT_DEFAULT);
   }
 
+  /**
+   * Retrieve the port that is used by OM as specified by the confKey.
+   * Return default port if port is not specified in the confKey.
+   * @param conf configuration
+   * @param confKey configuration key to lookup address from
+   * @return Port on which OM RPC server will listen on
+   */
+  public static int getOmRpcPort(Configuration conf, String confKey) {
+    // If no port number is specified then we'll just try the defaultBindPort.
+    final Optional<Integer> port = getPortNumberFromConfigKeys(conf, confKey);
+    return port.orElse(OZONE_OM_PORT_DEFAULT);
+  }
+
   public static int getOmRestPort(Configuration conf) {
     // If no port number is specified then we'll just try the default
     // HTTP BindPort.

+ 53 - 0
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerConfiguration.java

@@ -20,6 +20,7 @@ package org.apache.hadoop.ozone.om;
 import org.apache.hadoop.hdds.HddsConfigKeys;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
@@ -34,6 +35,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collection;
@@ -94,6 +96,57 @@ public class TestOzoneManagerConfiguration {
     cluster.waitForClusterToBeReady();
   }
 
+  /**
+   * Test that if no OM address is specified, then the OM rpc server
+   * is started on localhost.
+   */
+  @Test
+  public void testNoConfiguredOMAddress() throws Exception {
+    startCluster();
+    om = cluster.getOzoneManager();
+
+    Assert.assertTrue(NetUtils.isLocalAddress(
+        om.getOmRpcServerAddr().getAddress()));
+  }
+
+  /**
+   * Test that if only the hostname is specified for om address, then the
+   * default port is used.
+   */
+  @Test
+  public void testDefaultPortIfNotSpecified() throws Exception {
+
+    String omNode1Id = "omNode1";
+    String omNode2Id = "omNode2";
+    String omNodesKeyValue = omNode1Id + "," + omNode2Id;
+    conf.set(OMConfigKeys.OZONE_OM_NODES_KEY, omNodesKeyValue);
+
+    String omNode1RpcAddrKey = getOMAddrKeyWithSuffix(null, omNode1Id);
+    String omNode2RpcAddrKey = getOMAddrKeyWithSuffix(null, omNode2Id);
+
+    conf.set(omNode1RpcAddrKey, "0.0.0.0");
+    conf.set(omNode2RpcAddrKey, "122.0.0.122");
+
+    // Set omNode1 as the current node. omNode1 address does not have a port
+    // number specified. So the default port should be taken.
+    conf.set(OMConfigKeys.OZONE_OM_NODE_ID_KEY, omNode1Id);
+
+    startCluster();
+    om = cluster.getOzoneManager();
+    Assert.assertEquals("0.0.0.0",
+        om.getOmRpcServerAddr().getHostName());
+    Assert.assertEquals(OMConfigKeys.OZONE_OM_PORT_DEFAULT,
+        om.getOmRpcServerAddr().getPort());
+
+    // Verify that the 2nd OMs address stored in the current OM also has the
+    // default port as the port is not specified
+    InetSocketAddress omNode2Addr = om.getPeerNodes().get(0).getRpcAddress();
+    Assert.assertEquals("122.0.0.122", omNode2Addr.getHostString());
+    Assert.assertEquals(OMConfigKeys.OZONE_OM_PORT_DEFAULT,
+        omNode2Addr.getPort());
+
+  }
+
   /**
    * Test a single node OM service (default setting for MiniOzoneCluster).
    * @throws Exception

+ 6 - 1
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java

@@ -360,7 +360,7 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
         }
         String rpcAddrKey = OmUtils.addKeySuffixes(OZONE_OM_ADDRESS_KEY,
             serviceId, nodeId);
-        String rpcAddrStr = conf.get(rpcAddrKey);
+        String rpcAddrStr = OmUtils.getOmRpcAddress(conf, rpcAddrKey);
         if (rpcAddrStr == null) {
           continue;
         }
@@ -2407,4 +2407,9 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
   public String getOMServiceId() {
     return omNodeDetails.getOMServiceId();
   }
+
+  @VisibleForTesting
+  public List<OMNodeDetails> getPeerNodes() {
+    return peerNodes;
+  }
 }