From 562ac8b7afc50be76128ea67789b9f0282a79bcd Mon Sep 17 00:00:00 2001 From: Siddharth Date: Sat, 28 Mar 2020 11:29:34 -0700 Subject: [PATCH] HDDS-3273. getConf does not return all OM addresses. (#727) --- .../java/org/apache/hadoop/ozone/OmUtils.java | 32 +++++++++++++++++++ .../hadoop/ozone/freon/OzoneGetConf.java | 6 +++- .../org/apache/hadoop/ozone/TestOmUtils.java | 25 +++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java index 87522e3d650..3552e79f413 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java @@ -29,8 +29,12 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import java.util.stream.Collectors; @@ -89,6 +93,34 @@ public static InetSocketAddress getOmAddress(Configuration conf) { return NetUtils.createSocketAddr(getOmRpcAddress(conf)); } + /** + * Return list of OM addresses by service ids - when HA is enabled. + * + * @param conf {@link Configuration} + * @return {service.id -> [{@link InetSocketAddress}]} + */ + public static Map> getOmHAAddressesById( + Configuration conf) { + Map> result = new HashMap<>(); + for (String serviceId : conf.getTrimmedStringCollection( + OZONE_OM_SERVICE_IDS_KEY)) { + if (!result.containsKey(serviceId)) { + result.put(serviceId, new ArrayList<>()); + } + for (String nodeId : getOMNodeIds(conf, serviceId)) { + String rpcAddr = getOmRpcAddress(conf, + addKeySuffixes(OZONE_OM_ADDRESS_KEY, serviceId, nodeId)); + if (rpcAddr != null) { + result.get(serviceId).add(NetUtils.createSocketAddr(rpcAddr)); + } else { + LOG.warn("Address undefined for nodeId: {} for service {}", nodeId, + serviceId); + } + } + } + return result; + } + /** * Retrieve the socket address that is used by OM. * @param conf diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/freon/OzoneGetConf.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/freon/OzoneGetConf.java index 3c60e5956d4..83283d473eb 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/freon/OzoneGetConf.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/freon/OzoneGetConf.java @@ -253,7 +253,11 @@ static class OzoneManagersCommandHandler extends CommandHandler { @Override public int doWorkInternal(OzoneGetConf tool, String[] args) throws IOException { - tool.printOut(OmUtils.getOmAddress(tool.getConf()).getHostName()); + if (OmUtils.isServiceIdsDefined(tool.getConf())) { + tool.printOut(OmUtils.getOmHAAddressesById(tool.getConf()).toString()); + } else { + tool.printOut(OmUtils.getOmAddress(tool.getConf()).getHostName()); + } return 0; } } diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/TestOmUtils.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/TestOmUtils.java index 7f374102754..cdbb786a77c 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/TestOmUtils.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/TestOmUtils.java @@ -19,6 +19,7 @@ package org.apache.hadoop.ozone; import org.apache.commons.io.FileUtils; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.db.DBCheckpoint; import org.apache.hadoop.io.IOUtils; import org.junit.Rule; @@ -31,9 +32,13 @@ import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.net.InetSocketAddress; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SERVICE_IDS_KEY; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -113,6 +118,26 @@ public void createOMDirThrowsIfCannotCreate() throws IOException { // expecting exception } + @Test + public void testGetOmHAAddressesById() { + OzoneConfiguration conf = new OzoneConfiguration(); + conf.set(OZONE_OM_SERVICE_IDS_KEY, "ozone1"); + conf.set("ozone.om.nodes.ozone1", "node1,node2,node3"); + conf.set("ozone.om.address.ozone1.node1", "1.1.1.1"); + conf.set("ozone.om.address.ozone1.node2", "1.1.1.2"); + conf.set("ozone.om.address.ozone1.node3", "1.1.1.3"); + Map> addresses = + OmUtils.getOmHAAddressesById(conf); + assertFalse(addresses.isEmpty()); + List rpcAddrs = addresses.get("ozone1"); + assertFalse(rpcAddrs.isEmpty()); + assertTrue(rpcAddrs.stream().anyMatch( + a -> a.getAddress().getHostAddress().equals("1.1.1.1"))); + assertTrue(rpcAddrs.stream().anyMatch( + a -> a.getAddress().getHostAddress().equals("1.1.1.2"))); + assertTrue(rpcAddrs.stream().anyMatch( + a -> a.getAddress().getHostAddress().equals("1.1.1.3"))); + } } class TestDBCheckpoint implements DBCheckpoint {