You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by we...@apache.org on 2021/04/02 09:21:13 UTC
[hadoop] 03/09: HDFS-15300. RBF: updateActiveNamenode() is invalid
when RPC address is IP. Contributed by xuzq.
This is an automated email from the ASF dual-hosted git repository.
weichiu pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit a549b4a82efc2aed1c814210f112a356ab2905ea
Author: Ayush Saxena <ay...@apache.org>
AuthorDate: Tue May 12 21:48:44 2020 +0530
HDFS-15300. RBF: updateActiveNamenode() is invalid when RPC address is IP. Contributed by xuzq.
(cherry picked from commit 936bf09c3745cfec26fa9cfa0562f88b1f8be133)
---
.../src/main/java/org/apache/hadoop/net/NetUtils.java | 16 ++++++++++++++++
.../federation/resolver/MembershipNamenodeResolver.java | 4 +++-
.../hdfs/server/federation/FederationTestUtils.java | 11 +++++++++--
.../federation/resolver/TestNamenodeResolver.java | 17 +++++++++++++++++
4 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
index 5ded4b4..6c7e443 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
@@ -694,6 +694,22 @@ public class NetUtils {
}
/**
+ * Attempt to normalize the given string to "host:port"
+ * if it like "ip:port".
+ *
+ * @param ipPort maybe lik ip:port or host:port.
+ * @return host:port
+ */
+ public static String normalizeIP2HostName(String ipPort) {
+ if (null == ipPort || !ipPortPattern.matcher(ipPort).matches()) {
+ return ipPort;
+ }
+
+ InetSocketAddress address = createSocketAddr(ipPort);
+ return getHostPortString(address);
+ }
+
+ /**
* Return hostname without throwing exception.
* The returned hostname String format is "hostname".
* @return hostname
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java
index 6117e9a..6629003 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java
@@ -47,6 +47,7 @@ import org.apache.hadoop.hdfs.server.federation.store.protocol.NamenodeHeartbeat
import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateNamenodeRegistrationRequest;
import org.apache.hadoop.hdfs.server.federation.store.records.MembershipState;
import org.apache.hadoop.hdfs.server.federation.store.records.MembershipStats;
+import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.util.Time;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -263,7 +264,8 @@ public class MembershipNamenodeResolver
MembershipState record = MembershipState.newInstance(
routerId, report.getNameserviceId(), report.getNamenodeId(),
- report.getClusterId(), report.getBlockPoolId(), report.getRpcAddress(),
+ report.getClusterId(), report.getBlockPoolId(),
+ NetUtils.normalizeIP2HostName(report.getRpcAddress()),
report.getServiceAddress(), report.getLifelineAddress(),
report.getWebScheme(), report.getWebAddress(), report.getState(),
report.getSafemode());
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/FederationTestUtils.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/FederationTestUtils.java
index bf6f5a8..2017a45 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/FederationTestUtils.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/FederationTestUtils.java
@@ -138,8 +138,15 @@ public final class FederationTestUtils {
public static NamenodeStatusReport createNamenodeReport(String ns, String nn,
HAServiceState state) {
Random rand = new Random();
- NamenodeStatusReport report = new NamenodeStatusReport(ns, nn,
- "localhost:" + rand.nextInt(10000), "localhost:" + rand.nextInt(10000),
+ return createNamenodeReport(ns, nn, "localhost:"
+ + rand.nextInt(10000), state);
+ }
+
+ public static NamenodeStatusReport createNamenodeReport(String ns, String nn,
+ String rpcAddress, HAServiceState state) {
+ Random rand = new Random();
+ NamenodeStatusReport report = new NamenodeStatusReport(ns, nn, rpcAddress,
+ "localhost:" + rand.nextInt(10000),
"localhost:" + rand.nextInt(10000), "http",
"testwebaddress-" + ns + nn);
if (state == null) {
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestNamenodeResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestNamenodeResolver.java
index 932c861..df80037 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestNamenodeResolver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestNamenodeResolver.java
@@ -307,6 +307,23 @@ public class TestNamenodeResolver {
FederationNamenodeServiceState.ACTIVE, namenode1.getState());
}
+ @Test
+ public void testCacheUpdateOnNamenodeStateUpdateWithIp()
+ throws IOException {
+ final String rpcAddress = "127.0.0.1:10000";
+ assertTrue(namenodeResolver.registerNamenode(
+ createNamenodeReport(NAMESERVICES[0], NAMENODES[0], rpcAddress,
+ HAServiceState.STANDBY)));
+ stateStore.refreshCaches(true);
+
+ InetSocketAddress inetAddr = getInetSocketAddress(rpcAddress);
+ namenodeResolver.updateActiveNamenode(NAMESERVICES[0], inetAddr);
+ FederationNamenodeContext namenode =
+ namenodeResolver.getNamenodesForNameserviceId(NAMESERVICES[0]).get(0);
+ assertEquals("The namenode state should be ACTIVE post update.",
+ FederationNamenodeServiceState.ACTIVE, namenode.getState());
+ }
+
/**
* Creates InetSocketAddress from the given RPC address.
* @param rpcAddr RPC address (host:port).
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org