From 0fbe36b7e391b78b3d908e7db0631c3198464ab6 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 10 Apr 2025 17:12:18 +0200 Subject: [PATCH 01/20] patches I --- ...28242-Updates-async-profiler-support.patch | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch b/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch index 2901aaf99..bf9d654ad 100644 --- a/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch +++ b/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch @@ -4,8 +4,8 @@ Date: Tue, 6 Feb 2024 16:10:54 +0100 Subject: HBASE-28242: Updates async-profiler support --- - .../hadoop/hbase/http/ProfileServlet.java | 205 +++++++++++------- - 1 file changed, 121 insertions(+), 84 deletions(-) + .../hadoop/hbase/http/ProfileServlet.java | 207 +++++++++++------- + 1 file changed, 122 insertions(+), 85 deletions(-) diff --git a/hbase-http/src/main/java/org/apache/hadoop/hbase/http/ProfileServlet.java b/hbase-http/src/main/java/org/apache/hadoop/hbase/http/ProfileServlet.java index 83087dbed3..6139114717 100644 @@ -106,21 +106,22 @@ index 83087dbed3..6139114717 100644 ALLOC("alloc"), LOCK("lock"), - PAGE_FAULTS("page-faults"), +- CONTEXT_SWITCHES("context-switches"), +- CYCLES("cycles"), +- INSTRUCTIONS("instructions"), +- CACHE_REFERENCES("cache-references"), +- CACHE_MISSES("cache-misses"), +- BRANCHES("branches"), + ITIMER("itimer"), + BRANCH_INSTRUCTIONS("branch-instructions"), -+ BRANCH_MISSES("branch-misses"), -+ BUS_CYCLES("bus-cycles"), + BRANCH_MISSES("branch-misses"), + BUS_CYCLES("bus-cycles"), + CACHE_MISSES("cache-misses"), + CACHE_REFERENCES("cache-references"), - CONTEXT_SWITCHES("context-switches"), - CYCLES("cycles"), ++ CONTEXT_SWITCHES("context-switches"), ++ CYCLES("cycles"), + DTLB_LOAD_MISSES("dTLB-load-misses"), - INSTRUCTIONS("instructions"), -- CACHE_REFERENCES("cache-references"), -- CACHE_MISSES("cache-misses"), -- BRANCHES("branches"), -- BRANCH_MISSES("branch-misses"), -- BUS_CYCLES("bus-cycles"), ++ INSTRUCTIONS("instructions"), L1_DCACHE_LOAD_MISSES("L1-dcache-load-misses"), LLC_LOAD_MISSES("LLC-load-misses"), - DTLB_LOAD_MISSES("dTLB-load-misses"), From b5f96d547f5d38dda34212d9a1eade8f2a8262b6 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 10 Apr 2025 17:12:36 +0200 Subject: [PATCH 02/20] patches I --- .../patches/2.6.1/0005-log-statement.patch | 21 +++++++++++++++++++ .../2.6.1/0006-another-log-statement.patch | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 hbase/stackable/patches/2.6.1/0005-log-statement.patch create mode 100644 hbase/stackable/patches/2.6.1/0006-another-log-statement.patch diff --git a/hbase/stackable/patches/2.6.1/0005-log-statement.patch b/hbase/stackable/patches/2.6.1/0005-log-statement.patch new file mode 100644 index 000000000..15c724ed5 --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0005-log-statement.patch @@ -0,0 +1,21 @@ +From e863257c8f75ef7be7052b380d88feff3b488409 Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Thu, 10 Apr 2025 16:46:51 +0200 +Subject: log statement + +--- + .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 27bcef2f06..68e9f8cd06 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -769,6 +769,7 @@ public class HRegionServer extends Thread + + UNSAFE_RS_HOSTNAME_KEY + " is used"; + throw new IOException(msg); + } else { ++ LOG.info("Hostname: {}", rpcServices.isa.getHostName()); + return rpcServices.isa.getHostName(); + } + } else { diff --git a/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch b/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch new file mode 100644 index 000000000..1f03450a0 --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch @@ -0,0 +1,21 @@ +From 36f9523968315fa359f86ced664bd6bae9613e26 Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Thu, 10 Apr 2025 16:53:18 +0200 +Subject: another log statement + +--- + .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 68e9f8cd06..b632b93820 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -1691,6 +1691,7 @@ public class HRegionServer extends Thread + this.serverName = ServerName.valueOf(hostnameFromMasterPOV, + rpcServices.getSocketAddress().getPort(), this.startcode); + String expectedHostName = rpcServices.getSocketAddress().getHostName(); ++ LOG.info("Expected hostname: {}", expectedHostName); + // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it + // is set to disable. so we will use the ip of the RegionServer to compare with the + // hostname passed by the Master, see HBASE-27304 for details. From 303739ee1e773369f1551ee544bed8d70ff26b15 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 23 Apr 2025 14:56:13 +0200 Subject: [PATCH 03/20] wip: patch hbase to use listener endpoints --- hbase/stackable/bin/hbase-entrypoint.sh | 9 + ...rvername-with-external-host-and-port.patch | 454 ++++++++++++++++++ .../patches/2.6.1/0005-log-statement.patch | 21 - .../2.6.1/0006-another-log-statement.patch | 21 - 4 files changed, 463 insertions(+), 42 deletions(-) create mode 100644 hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch delete mode 100644 hbase/stackable/patches/2.6.1/0005-log-statement.patch delete mode 100644 hbase/stackable/patches/2.6.1/0006-another-log-statement.patch diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh index 3b5192016..14d96bb61 100755 --- a/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -16,6 +16,8 @@ HBASE_ROLE_NAME="$1" HBASE_ROLE_SERVICE_NAME="$2" # 16010 for master, 16020 for regionservers etc. HBASE_ROLE_SERVICE_PORT="$3" +# ui-http or ui-https +HBASE_PORT_NAME="$4" HBASE_ROLE_SERVICE_HOST="${HOSTNAME}.${HBASE_ROLE_SERVICE_NAME}" @@ -64,6 +66,7 @@ cp /stackable/tmp/hdfs/core-site.xml /stackable/conf cp /stackable/tmp/hbase/* /stackable/conf cp /stackable/tmp/log_config/log4j* /stackable/conf +# Kerberos if [ -f /stackable/kerberos/krb5.conf ]; then KERBEROS_REALM=$(grep -oP 'default_realm = \K.*' /stackable/kerberos/krb5.conf) export KERBEROS_REALM @@ -72,6 +75,12 @@ if [ -f /stackable/kerberos/krb5.conf ]; then sed -i -e s/\$\{env\.KERBEROS_REALM\}/"${KERBEROS_REALM}"/g /stackable/conf/hdfs-site.xml fi +# Service endpoints +HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) +HBASE_SERVICE_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_PORT_NAME}") +sed -i -e s/\$\{HBASE_SERVICE_HOST\}/"${HBASE_SERVICE_HOST}"/g /stackable/conf/hbase-site.xml +sed -i -e s/\$\{HBASE_SERVICE_PORT\}/"${HBASE_SERVICE_PORT}"/g /stackable/conf/hbase-site.xml + rm -f "${STACKABLE_LOG_DIR}/_vector/shutdown" prepare_signal_handlers /stackable/containerdebug --output="${STACKABLE_LOG_DIR}/containerdebug-state.json" --loop & diff --git a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch new file mode 100644 index 000000000..91eab41ca --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch @@ -0,0 +1,454 @@ +From 69c540f561f740596340b73ed1a77d5b115e1bee Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Wed, 16 Apr 2025 16:43:33 +0200 +Subject: extend servername with external host and port + +--- + .../hbase/shaded/protobuf/ProtobufUtil.java | 15 ++++++-- + .../org/apache/hadoop/hbase/ServerName.java | 35 ++++++++++++++++++- + .../src/main/protobuf/HBase.proto | 2 ++ + .../main/protobuf/RegionServerStatus.proto | 3 ++ + hbase-protocol/src/main/protobuf/HBase.proto | 2 ++ + .../src/main/protobuf/ZooKeeper.proto | 2 ++ + .../tmpl/master/RegionServerListTmpl.jamon | 2 +- + .../apache/hadoop/hbase/master/HMaster.java | 7 ++++ + .../hadoop/hbase/master/ServerManager.java | 4 ++- + .../hbase/regionserver/HRegionServer.java | 16 ++++++++- + .../resources/hbase-webapps/master/hbck.jsp | 2 +- + .../hbase-webapps/master/rsgroup.jsp | 10 +++--- + .../resources/hbase-webapps/master/table.jsp | 22 ++++++------ + .../hbase/zookeeper/MasterAddressTracker.java | 3 ++ + 14 files changed, 102 insertions(+), 23 deletions(-) + +diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java +index 0fe181b503..be121ea641 100644 +--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java ++++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java +@@ -417,6 +417,13 @@ public final class ProtobufUtil { + if (serverName.getStartcode() >= 0) { + builder.setStartCode(serverName.getStartcode()); + } ++ ++ if (serverName.getExternalHostname() != null) { ++ builder.setExternalHostName(serverName.getExternalHostname()); ++ } ++ if (serverName.getExternalPort() != null) { ++ builder.setExternalPort(serverName.getExternalPort()); ++ } + return builder.build(); + } + +@@ -428,6 +435,9 @@ public final class ProtobufUtil { + public static ServerName toServerName(final HBaseProtos.ServerName proto) { + if (proto == null) return null; + String hostName = proto.getHostName(); ++ String externalHostName = proto.getExternalHostName(); ++ Integer externalPort = proto.getExternalPort(); ++ + long startCode = -1; + int port = -1; + if (proto.hasPort()) { +@@ -436,7 +446,7 @@ public final class ProtobufUtil { + if (proto.hasStartCode()) { + startCode = proto.getStartCode(); + } +- return ServerName.valueOf(hostName, port, startCode); ++ return ServerName.valueOf(hostName, port, startCode, externalHostName, externalPort); + } + + /** +@@ -3145,7 +3155,8 @@ public final class ProtobufUtil { + ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen); + org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName sn = + rss.getMaster(); +- return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode()); ++ return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode(), ++ sn.getExternalHostName(), sn.getExternalPort()); + } catch (/* InvalidProtocolBufferException */IOException e) { + // A failed parse of the znode is pretty catastrophic. Rather than loop + // retrying hoping the bad bytes will changes, and rather than change +diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java +index 5223bac3e5..932865ca69 100644 +--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java ++++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java +@@ -85,6 +85,8 @@ public class ServerName implements Comparable, Serializable { + private final String serverName; + private final long startCode; + private transient Address address; ++ private String externalHostname; ++ private Integer externalPort; + + /** + * Cached versioned bytes of this ServerName instance. +@@ -103,11 +105,21 @@ public class ServerName implements Comparable, Serializable { + this(Address.fromParts(hostname, port), startCode); + } + +- private ServerName(final Address address, final long startCode) { ++ protected ServerName(final String hostname, final int port, final long startCode, String externalHostname, Integer externalPort) { ++ this(Address.fromParts(hostname, port), startCode, externalHostname, externalPort); ++ } ++ ++ private ServerName(final Address address, final long startCode, String externalHostname, Integer externalPort) { + // Use HostAndPort to host port and hostname. Does validation and can do ipv6 + this.address = address; + this.startCode = startCode; + this.serverName = getServerName(this.address.getHostname(), this.address.getPort(), startCode); ++ this.externalHostname = externalHostname; ++ this.externalPort = externalPort; ++ } ++ ++ private ServerName(final Address address, final long startCode) { ++ this(address, startCode, null, null); + } + + private ServerName(final String hostAndPort, final long startCode) { +@@ -177,6 +189,11 @@ public class ServerName implements Comparable, Serializable { + return INTERN_POOL.intern(new ServerName(hostname, port, startCode)); + } + ++ public static ServerName valueOf(final String hostname, final int port, final long startCode, ++ String externalHostname, Integer externalPort) { ++ return new ServerName(hostname, port, startCode, externalHostname, externalPort); ++ } ++ + /** + * Retrieve an instance of ServerName. Callers should use the equals method to compare returned + * instances, though we may return a shared immutable object as an internal optimization. +@@ -253,6 +270,22 @@ public class ServerName implements Comparable, Serializable { + return this.address.getPort(); + } + ++ public String getExternalHostname() { ++ return this.externalHostname; ++ } ++ ++ public Integer getExternalPort() { ++ return this.externalPort; ++ } ++ ++ public void setAddress(Address address) { ++ this.address = address; ++ } ++ ++ public void setExternalPort(Integer externalPort) { ++ this.externalPort = externalPort; ++ } ++ + /** + * Return the start code. + * @deprecated Since 2.5.0, will be removed in 4.0.0. Use {@link #getStartCode()} instead. +diff --git a/hbase-protocol-shaded/src/main/protobuf/HBase.proto b/hbase-protocol-shaded/src/main/protobuf/HBase.proto +index e858d7ec33..2da62e0e0a 100644 +--- a/hbase-protocol-shaded/src/main/protobuf/HBase.proto ++++ b/hbase-protocol-shaded/src/main/protobuf/HBase.proto +@@ -147,6 +147,8 @@ message ServerName { + required string host_name = 1; + optional uint32 port = 2; + optional uint64 start_code = 3; ++ optional string external_host_name = 100; ++ optional uint32 external_port = 101; + } + + // Comment data structures +diff --git a/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto b/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto +index 53751082f9..ecb3cf6221 100644 +--- a/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto ++++ b/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto +@@ -42,6 +42,9 @@ message RegionServerStartupRequest { + + /** hostname for region server, optional */ + optional string use_this_hostname_instead = 4; ++ ++ optional string external_host_name = 100; ++ optional uint32 external_port = 101; + } + + message RegionServerStartupResponse { +diff --git a/hbase-protocol/src/main/protobuf/HBase.proto b/hbase-protocol/src/main/protobuf/HBase.proto +index ecfdc8c2c7..833cee7bee 100644 +--- a/hbase-protocol/src/main/protobuf/HBase.proto ++++ b/hbase-protocol/src/main/protobuf/HBase.proto +@@ -135,6 +135,8 @@ message ServerName { + required string host_name = 1; + optional uint32 port = 2; + optional uint64 start_code = 3; ++ optional string external_host_name = 100; ++ optional uint32 external_port = 101; + } + + // Comment data structures +diff --git a/hbase-protocol/src/main/protobuf/ZooKeeper.proto b/hbase-protocol/src/main/protobuf/ZooKeeper.proto +index c0f40e970e..bddadf4d30 100644 +--- a/hbase-protocol/src/main/protobuf/ZooKeeper.proto ++++ b/hbase-protocol/src/main/protobuf/ZooKeeper.proto +@@ -56,6 +56,8 @@ message Master { + // Major RPC version so that clients can know what version the master can accept. + optional uint32 rpc_version = 2; + optional uint32 info_port = 3; ++ optional string external_host = 4; ++ optional uint32 external_port = 5; + } + + /** +diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon +index 4c9140470b..604ecd7b2a 100644 +--- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon ++++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon +@@ -500,7 +500,7 @@ if (totalCompactingCells > 0) { + + <%java> + int infoPort = master.getRegionServerInfoPort(serverName); +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; + + + <%if infoPort > 0%> +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 3fe5abac27..652c709ab5 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -3128,6 +3128,13 @@ public class HMaster extends HRegionServer implements MasterServices { + + public int getRegionServerInfoPort(final ServerName sn) { + int port = this.serverManager.getInfoPort(sn); ++ if (port == 0) { ++ if (sn.getExternalPort() != null) { ++ port = sn.getExternalPort(); ++ } else { ++ port = sn.getAddress().getPort(); ++ } ++ } + return port == 0 + ? conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) + : port; +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +index f7115a5cef..e5f6062793 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +@@ -45,6 +45,7 @@ import org.apache.hadoop.hbase.ServerName; + import org.apache.hadoop.hbase.YouAreDeadException; + import org.apache.hadoop.hbase.client.ClusterConnection; + import org.apache.hadoop.hbase.client.RegionInfo; ++import org.apache.hadoop.hbase.client.RetriesExhaustedException; + import org.apache.hadoop.hbase.conf.ConfigurationObserver; + import org.apache.hadoop.hbase.ipc.DecommissionedHostRejectedException; + import org.apache.hadoop.hbase.ipc.HBaseRpcController; +@@ -230,7 +231,8 @@ public class ServerManager implements ConfigurationObserver { + String isaHostName = useIp ? ia.getHostAddress() : ia.getHostName(); + final String hostname = + request.hasUseThisHostnameInstead() ? request.getUseThisHostnameInstead() : isaHostName; +- ServerName sn = ServerName.valueOf(hostname, request.getPort(), request.getServerStartCode()); ++ ServerName sn = ServerName.valueOf(hostname, request.getPort(), request.getServerStartCode(), ++ request.getExternalHostName(), request.getExternalPort()); + + // Check if the host should be rejected based on it's decommissioned status + checkRejectableDecommissionedStatus(sn); +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 27bcef2f06..8438378059 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -678,7 +678,18 @@ public class HRegionServer extends Thread + useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); + String hostName = + StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; +- serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode); ++ ++ String externalHostname; ++ Integer externalPort; ++ if (this instanceof HMaster) { ++ externalHostname = conf.get("hbase.listener.master.hostname", ""); ++ externalPort = conf.getInt("hbase.listener.master.port", -1); ++ } else { ++ externalHostname = conf.get("hbase.listener.regionserver.hostname", ""); ++ externalPort = conf.getInt("hbase.listener.regionserver.port", -1); ++ } ++ ++ serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode, externalHostname, externalPort); + + rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); + rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, +@@ -3081,6 +3092,9 @@ public class HRegionServer extends Thread + request.setPort(port); + request.setServerStartCode(this.startcode); + request.setServerCurrentTime(now); ++ request.setExternalHostName(serverName.getExternalHostname()); ++ request.setExternalPort(serverName.getExternalPort()); ++ + result = rss.regionServerStartup(null, request.build()); + } catch (ServiceException se) { + IOException ioe = ProtobufUtil.getRemoteException(se); +diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp +index 38e16ca8e2..3bd14bf524 100644 +--- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp ++++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp +@@ -366,7 +366,7 @@ private static String formatServerName(HMaster master, + if (serverManager.isServerOnline(serverName)) { + int infoPort = master.getRegionServerInfoPort(serverName); + if (infoPort > 0) { +- return "" + sn + ""; + } else { + return "" + sn + ""; +diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp +index 6ba6f78a27..5dad8e07a2 100644 +--- a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp ++++ b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp +@@ -171,7 +171,7 @@ + } + long startcode = serverName.getStartcode(); + int infoPort = master.getRegionServerInfoPort(serverName); +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";%> ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status";%> + + <%= serverName.getServerName() %> + <%= new Date(startcode) %> +@@ -226,7 +226,7 @@ + .stream().mapToDouble(rm -> rm.getMemStoreSize().get(Size.Unit.MEGABYTE)) + .sum(); + int infoPort = master.getRegionServerInfoPort(serverName); +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; + + if (memStoreSizeMB > 0) { + memStoreSizeMBStr = TraditionalBinaryPrefix.long2String( +@@ -277,7 +277,7 @@ + readRequestCount += rm.getReadRequestCount(); + writeRequestCount += rm.getWriteRequestCount(); + } +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; + %> + + <%= serverName.getServerName() %> +@@ -331,7 +331,7 @@ + totalStaticBloomSizeKB += rm.getBloomFilterSize().get(Size.Unit.KILOBYTE); + } + int infoPort = master.getRegionServerInfoPort(serverName); +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; + if (storeUncompressedSizeMB > 0) { + storeUncompressedSizeMBStr = TraditionalBinaryPrefix.long2String( + (long) storeUncompressedSizeMB * TraditionalBinaryPrefix.MEGA.value, "B", 1); +@@ -397,7 +397,7 @@ + ((float) currentCompactedCells / totalCompactingCells)) + "%"; + } + int infoPort = master.getRegionServerInfoPort(serverName); +- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; ++ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; + %> + + <%= serverName.getServerName() %> +diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +index 56a0c8096d..2da74e9709 100644 +--- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp ++++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +@@ -102,7 +102,7 @@ + return serverName.getServerName(); + } + +- final String socketAddress = serverName.getHostname() + ":" + rsInfoPort; ++ final String socketAddress = serverName.getExternalHostname() + ":" + serverName.getExternalPort(); + final String URI = "//" + socketAddress + "/region.jsp" + + "?name=" + regionInfo.getEncodedName(); + return "" + serverName.getServerName() + ""; +@@ -299,7 +299,7 @@ + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); + // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. +- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { +@@ -374,7 +374,7 @@ + float localityForSsd = 0.0f; + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); +- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { +@@ -426,7 +426,7 @@ + String compactionProgress = ""; + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); +- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { +@@ -951,7 +951,7 @@ + ServerMetrics sl = master.getServerManager().getLoad(addr); + // This port might be wrong if RS actually ended up using something else. + urlRegionServer = +- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; + if(sl != null) { + Integer i = regDistribution.get(addr); + if (null == i) i = Integer.valueOf(0); +@@ -972,7 +972,7 @@ + if (urlRegionServer != null) { + %> + +- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> + + <% + } else { +@@ -1037,7 +1037,7 @@ + if (addr != null) { + // This port might be wrong if RS actually ended up using something else. + urlRegionServer = +- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; + } + if (numRegionsRendered < numRegionsToRender) { + numRegionsRendered++; +@@ -1098,7 +1098,7 @@ + if (addr != null) { + // This port might be wrong if RS actually ended up using something else. + urlRegionServer = +- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; + } + if (numRegionsRendered < numRegionsToRender) { + numRegionsRendered++; +@@ -1109,7 +1109,7 @@ + if (urlRegionServer != null) { + %> + +- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> + + <% + } else { +@@ -1153,10 +1153,10 @@ + <% + for (Map.Entry rdEntry : regDistribution.entrySet()) { + ServerName addr = rdEntry.getKey(); +- String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ String url = "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; + %> + +- <%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> + <%= rdEntry.getValue()%> + <% + if (withReplica) { +diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java +index 840ee2d215..b0f9da3e00 100644 +--- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java ++++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java +@@ -281,6 +281,9 @@ public class MasterAddressTracker extends ZKNodeTracker { + snbuilder.setHostName(sn.getHostname()); + snbuilder.setPort(sn.getPort()); + snbuilder.setStartCode(sn.getStartcode()); ++ snbuilder.setExternalHostName(sn.getExternalHostname()); ++ snbuilder.setExternalPort(sn.getExternalPort()); ++ + mbuilder.setMaster(snbuilder.build()); + mbuilder.setRpcVersion(HConstants.RPC_CURRENT_VERSION); + mbuilder.setInfoPort(infoPort); diff --git a/hbase/stackable/patches/2.6.1/0005-log-statement.patch b/hbase/stackable/patches/2.6.1/0005-log-statement.patch deleted file mode 100644 index 15c724ed5..000000000 --- a/hbase/stackable/patches/2.6.1/0005-log-statement.patch +++ /dev/null @@ -1,21 +0,0 @@ -From e863257c8f75ef7be7052b380d88feff3b488409 Mon Sep 17 00:00:00 2001 -From: Andrew Kenworthy -Date: Thu, 10 Apr 2025 16:46:51 +0200 -Subject: log statement - ---- - .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..68e9f8cd06 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -769,6 +769,7 @@ public class HRegionServer extends Thread - + UNSAFE_RS_HOSTNAME_KEY + " is used"; - throw new IOException(msg); - } else { -+ LOG.info("Hostname: {}", rpcServices.isa.getHostName()); - return rpcServices.isa.getHostName(); - } - } else { diff --git a/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch b/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch deleted file mode 100644 index 1f03450a0..000000000 --- a/hbase/stackable/patches/2.6.1/0006-another-log-statement.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 36f9523968315fa359f86ced664bd6bae9613e26 Mon Sep 17 00:00:00 2001 -From: Andrew Kenworthy -Date: Thu, 10 Apr 2025 16:53:18 +0200 -Subject: another log statement - ---- - .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 68e9f8cd06..b632b93820 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -1691,6 +1691,7 @@ public class HRegionServer extends Thread - this.serverName = ServerName.valueOf(hostnameFromMasterPOV, - rpcServices.getSocketAddress().getPort(), this.startcode); - String expectedHostName = rpcServices.getSocketAddress().getHostName(); -+ LOG.info("Expected hostname: {}", expectedHostName); - // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it - // is set to disable. so we will use the ip of the RegionServer to compare with the - // hostname passed by the Master, see HBASE-27304 for details. From 8dc1c99b02a83211b6963083b96a1e1de0126e37 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 23 Apr 2025 15:41:35 +0200 Subject: [PATCH 04/20] changed rendering --- ...rvername-with-external-host-and-port.patch | 101 +++++++++++++----- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch index 91eab41ca..763a7c5ac 100644 --- a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch +++ b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch @@ -1,4 +1,4 @@ -From 69c540f561f740596340b73ed1a77d5b115e1bee Mon Sep 17 00:00:00 2001 +From 6f9e3cae1bd74e7feeca428d34f078c5542dfc2c Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 16 Apr 2025 16:43:33 +0200 Subject: extend servername with external host and port @@ -14,11 +14,11 @@ Subject: extend servername with external host and port .../apache/hadoop/hbase/master/HMaster.java | 7 ++++ .../hadoop/hbase/master/ServerManager.java | 4 ++- .../hbase/regionserver/HRegionServer.java | 16 ++++++++- - .../resources/hbase-webapps/master/hbck.jsp | 2 +- - .../hbase-webapps/master/rsgroup.jsp | 10 +++--- - .../resources/hbase-webapps/master/table.jsp | 22 ++++++------ + .../resources/hbase-webapps/master/hbck.jsp | 4 +-- + .../hbase-webapps/master/rsgroup.jsp | 15 +++----- + .../resources/hbase-webapps/master/table.jsp | 30 ++++++++-------- .../hbase/zookeeper/MasterAddressTracker.java | 3 ++ - 14 files changed, 102 insertions(+), 23 deletions(-) + 14 files changed, 107 insertions(+), 33 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java index 0fe181b503..be121ea641 100644 @@ -279,12 +279,15 @@ index 27bcef2f06..8438378059 100644 } catch (ServiceException se) { IOException ioe = ProtobufUtil.getRemoteException(se); diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -index 38e16ca8e2..3bd14bf524 100644 +index 38e16ca8e2..c30fd7753e 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -@@ -366,7 +366,7 @@ private static String formatServerName(HMaster master, +@@ -364,9 +364,9 @@ private static String formatServerName(HMaster master, + } + String sn = serverName.toString(); if (serverManager.isServerOnline(serverName)) { - int infoPort = master.getRegionServerInfoPort(serverName); +- int infoPort = master.getRegionServerInfoPort(serverName); ++ int infoPort = serverName.getExternalPort(); if (infoPort > 0) { - return "" + sn + ""; diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -index 6ba6f78a27..5dad8e07a2 100644 +index 6ba6f78a27..f3275b9165 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -@@ -171,7 +171,7 @@ +@@ -170,8 +170,7 @@ + lastContact = (System.currentTimeMillis() - sl.getReportTimestamp())/1000; } long startcode = serverName.getStartcode(); - int infoPort = master.getRegionServerInfoPort(serverName); +- int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";%> + String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status";%> <%= serverName.getServerName() %> <%= new Date(startcode) %> -@@ -226,7 +226,7 @@ +@@ -225,8 +224,7 @@ + double memStoreSizeMB = sl.getRegionMetrics().values() .stream().mapToDouble(rm -> rm.getMemStoreSize().get(Size.Unit.MEGABYTE)) .sum(); - int infoPort = master.getRegionServerInfoPort(serverName); +- int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; + String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; if (memStoreSizeMB > 0) { memStoreSizeMBStr = TraditionalBinaryPrefix.long2String( -@@ -277,7 +277,7 @@ +@@ -270,14 +268,13 @@ + ServerName serverName = serverMaping.get(server); + ServerMetrics sl = onlineServers.get(server); + if (sl != null && serverName != null) { +- int infoPort = master.getRegionServerInfoPort(serverName); + long readRequestCount = 0; + long writeRequestCount = 0; + for (RegionMetrics rm : sl.getRegionMetrics().values()) { readRequestCount += rm.getReadRequestCount(); writeRequestCount += rm.getWriteRequestCount(); } @@ -322,28 +334,41 @@ index 6ba6f78a27..5dad8e07a2 100644 %> <%= serverName.getServerName() %> -@@ -331,7 +331,7 @@ +@@ -330,8 +327,7 @@ + totalStaticIndexSizeKB += rm.getStoreFileUncompressedDataIndexSize().get(Size.Unit.KILOBYTE); totalStaticBloomSizeKB += rm.getBloomFilterSize().get(Size.Unit.KILOBYTE); } - int infoPort = master.getRegionServerInfoPort(serverName); +- int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; + String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; if (storeUncompressedSizeMB > 0) { storeUncompressedSizeMBStr = TraditionalBinaryPrefix.long2String( (long) storeUncompressedSizeMB * TraditionalBinaryPrefix.MEGA.value, "B", 1); -@@ -397,7 +397,7 @@ +@@ -396,8 +392,7 @@ + percentDone = String.format("%.2f", 100 * ((float) currentCompactedCells / totalCompactingCells)) + "%"; } - int infoPort = master.getRegionServerInfoPort(serverName); +- int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; + String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; %> <%= serverName.getServerName() %> diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp -index 56a0c8096d..2da74e9709 100644 +index 56a0c8096d..49c8a69c60 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +@@ -93,8 +93,8 @@ + * its region server. + * @return an anchor tag if one can be built, {@code null} otherwise. + */ +- private static String buildRegionServerLink(final ServerName serverName, final int rsInfoPort, +- final RegionInfo regionInfo, final RegionState.State regionState) { ++ private static String buildRegionServerLink(final ServerName serverName, ++ final RegionInfo regionInfo, final RegionState.State regionState) { + if (serverName == null || regionInfo == null) { return null; } + + if (regionState != RegionState.State.OPEN) { @@ -102,7 +102,7 @@ return serverName.getServerName(); } @@ -358,7 +383,7 @@ index 56a0c8096d..2da74e9709 100644 ServerMetrics sl = master.getServerManager().getLoad(metaLocation); // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { @@ -367,7 +392,7 @@ index 56a0c8096d..2da74e9709 100644 if (metaLocation != null) { ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { @@ -376,16 +401,25 @@ index 56a0c8096d..2da74e9709 100644 if (metaLocation != null) { ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); ++ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { +@@ -548,7 +548,7 @@ + <%= endKeyDisplay %> + <%= replicaIdDisplay %> + <%= regionStateDisplay %> +- "><%= serverName != null ? buildRegionServerLink(serverName, master.getRegionServerInfoPort(serverName), regionInfo, regionState) : "" %> ++ "><%= serverName != null ? buildRegionServerLink(serverName, regionInfo, regionState) : "" %> + <%= seqNum %> + <%= targetServerName %> + <%= mergeRegionNames %> @@ -951,7 +951,7 @@ ServerMetrics sl = master.getServerManager().getLoad(addr); // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; if(sl != null) { Integer i = regDistribution.get(addr); if (null == i) i = Integer.valueOf(0); @@ -394,7 +428,7 @@ index 56a0c8096d..2da74e9709 100644 %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> <% } else { @@ -403,16 +437,25 @@ index 56a0c8096d..2da74e9709 100644 // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; } if (numRegionsRendered < numRegionsToRender) { numRegionsRendered++; +@@ -1048,7 +1048,7 @@ + if (urlRegionServer != null) { + %> + +- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> + + <% + } else { @@ -1098,7 +1098,7 @@ if (addr != null) { // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; } if (numRegionsRendered < numRegionsToRender) { numRegionsRendered++; @@ -421,7 +464,7 @@ index 56a0c8096d..2da74e9709 100644 %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> <% } else { @@ -430,11 +473,11 @@ index 56a0c8096d..2da74e9709 100644 for (Map.Entry rdEntry : regDistribution.entrySet()) { ServerName addr = rdEntry.getKey(); - String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ String url = "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; ++ String url = "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; %> - <%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> ++ <%= StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> <%= rdEntry.getValue()%> <% if (withReplica) { From bd17a9ed4a4c0efb7f47c96f074f97bc0ee9ab9a Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 15 May 2025 14:55:44 +0200 Subject: [PATCH 05/20] rework patch for UI --- ...rvername-with-external-host-and-port.patch | 100 +++++++++++------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch index 763a7c5ac..b8c2e09b9 100644 --- a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch +++ b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch @@ -1,24 +1,25 @@ -From 6f9e3cae1bd74e7feeca428d34f078c5542dfc2c Mon Sep 17 00:00:00 2001 +From 958fd8f17dd203329b1da058e4714762412b4c57 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 16 Apr 2025 16:43:33 +0200 Subject: extend servername with external host and port --- - .../hbase/shaded/protobuf/ProtobufUtil.java | 15 ++++++-- - .../org/apache/hadoop/hbase/ServerName.java | 35 ++++++++++++++++++- - .../src/main/protobuf/HBase.proto | 2 ++ + .../hbase/shaded/protobuf/ProtobufUtil.java | 15 ++++++- + .../org/apache/hadoop/hbase/ServerName.java | 43 ++++++++++++++++++- + .../src/main/protobuf/HBase.proto | 2 + .../main/protobuf/RegionServerStatus.proto | 3 ++ - hbase-protocol/src/main/protobuf/HBase.proto | 2 ++ - .../src/main/protobuf/ZooKeeper.proto | 2 ++ + hbase-protocol/src/main/protobuf/HBase.proto | 2 + + .../src/main/protobuf/ZooKeeper.proto | 2 + .../tmpl/master/RegionServerListTmpl.jamon | 2 +- - .../apache/hadoop/hbase/master/HMaster.java | 7 ++++ - .../hadoop/hbase/master/ServerManager.java | 4 ++- - .../hbase/regionserver/HRegionServer.java | 16 ++++++++- - .../resources/hbase-webapps/master/hbck.jsp | 4 +-- - .../hbase-webapps/master/rsgroup.jsp | 15 +++----- - .../resources/hbase-webapps/master/table.jsp | 30 ++++++++-------- + .../tmpl/regionserver/RSStatusTmpl.jamon | 2 +- + .../apache/hadoop/hbase/master/HMaster.java | 7 +++ + .../hadoop/hbase/master/ServerManager.java | 4 +- + .../hbase/regionserver/HRegionServer.java | 16 ++++++- + .../resources/hbase-webapps/master/hbck.jsp | 4 +- + .../hbase-webapps/master/rsgroup.jsp | 15 +++---- + .../resources/hbase-webapps/master/table.jsp | 30 ++++++------- .../hbase/zookeeper/MasterAddressTracker.java | 3 ++ - 14 files changed, 107 insertions(+), 33 deletions(-) + 15 files changed, 116 insertions(+), 34 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java index 0fe181b503..be121ea641 100644 @@ -68,7 +69,7 @@ index 0fe181b503..be121ea641 100644 // A failed parse of the znode is pretty catastrophic. Rather than loop // retrying hoping the bad bytes will changes, and rather than change diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java -index 5223bac3e5..932865ca69 100644 +index 5223bac3e5..979eb4c6ae 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java @@ -85,6 +85,8 @@ public class ServerName implements Comparable, Serializable { @@ -115,7 +116,7 @@ index 5223bac3e5..932865ca69 100644 /** * Retrieve an instance of ServerName. Callers should use the equals method to compare returned * instances, though we may return a shared immutable object as an internal optimization. -@@ -253,6 +270,22 @@ public class ServerName implements Comparable, Serializable { +@@ -253,6 +270,30 @@ public class ServerName implements Comparable, Serializable { return this.address.getPort(); } @@ -127,6 +128,14 @@ index 5223bac3e5..932865ca69 100644 + return this.externalPort; + } + ++ public String getDisplayHostname() { ++ return this.externalHostname != null && !this.externalHostname.isEmpty() ? this.externalHostname: this.getHostname(); ++ } ++ ++ public Integer getDisplayPort() { ++ return this.externalPort != null && this.externalPort > 0 ? this.externalPort: this.getPort(); ++ } ++ + public void setAddress(Address address) { + this.address = address; + } @@ -192,7 +201,7 @@ index c0f40e970e..bddadf4d30 100644 /** diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon -index 4c9140470b..604ecd7b2a 100644 +index 4c9140470b..641f558d87 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon @@ -500,7 +500,7 @@ if (totalCompactingCells > 0) { @@ -200,10 +209,23 @@ index 4c9140470b..604ecd7b2a 100644 <%java> int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; <%if infoPort > 0%> +diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon +index 23330096cf..3abe5d617d 100644 +--- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon ++++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon +@@ -245,7 +245,7 @@ org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; + No master found + <%else> + <%java> +- String host = masterServerName.getHostname() + ":" + infoPort; ++ String host = masterServerName.getDisplayHostname() + ":" + masterServerName.getDisplayPort(); + String url = "//" + host + "/master-status"; + + <% host %> diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 3fe5abac27..652c709ab5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -279,7 +301,7 @@ index 27bcef2f06..8438378059 100644 } catch (ServiceException se) { IOException ioe = ProtobufUtil.getRemoteException(se); diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -index 38e16ca8e2..c30fd7753e 100644 +index 38e16ca8e2..61e4cf2b17 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp @@ -364,9 +364,9 @@ private static String formatServerName(HMaster master, @@ -287,15 +309,15 @@ index 38e16ca8e2..c30fd7753e 100644 String sn = serverName.toString(); if (serverManager.isServerOnline(serverName)) { - int infoPort = master.getRegionServerInfoPort(serverName); -+ int infoPort = serverName.getExternalPort(); ++ int infoPort = serverName.getDisplayPort(); if (infoPort > 0) { - return "" + sn + ""; } else { return "" + sn + ""; diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -index 6ba6f78a27..f3275b9165 100644 +index 6ba6f78a27..d05e1bc8f0 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp @@ -170,8 +170,7 @@ @@ -304,7 +326,7 @@ index 6ba6f78a27..f3275b9165 100644 long startcode = serverName.getStartcode(); - int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";%> -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status";%> ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status";%> <%= serverName.getServerName() %> <%= new Date(startcode) %> @@ -314,7 +336,7 @@ index 6ba6f78a27..f3275b9165 100644 .sum(); - int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; if (memStoreSizeMB > 0) { memStoreSizeMBStr = TraditionalBinaryPrefix.long2String( @@ -330,7 +352,7 @@ index 6ba6f78a27..f3275b9165 100644 writeRequestCount += rm.getWriteRequestCount(); } - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; %> <%= serverName.getServerName() %> @@ -340,7 +362,7 @@ index 6ba6f78a27..f3275b9165 100644 } - int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; if (storeUncompressedSizeMB > 0) { storeUncompressedSizeMBStr = TraditionalBinaryPrefix.long2String( (long) storeUncompressedSizeMB * TraditionalBinaryPrefix.MEGA.value, "B", 1); @@ -350,12 +372,12 @@ index 6ba6f78a27..f3275b9165 100644 } - int infoPort = master.getRegionServerInfoPort(serverName); - String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getExternalHostname() + ":" + serverName.getExternalPort() + "/rs-status"; ++ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; %> <%= serverName.getServerName() %> diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp -index 56a0c8096d..49c8a69c60 100644 +index 56a0c8096d..01fbde1b18 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp @@ -93,8 +93,8 @@ @@ -374,7 +396,7 @@ index 56a0c8096d..49c8a69c60 100644 } - final String socketAddress = serverName.getHostname() + ":" + rsInfoPort; -+ final String socketAddress = serverName.getExternalHostname() + ":" + serverName.getExternalPort(); ++ final String socketAddress = serverName.getDisplayHostname() + ":" + serverName.getDisplayPort(); final String URI = "//" + socketAddress + "/region.jsp" + "?name=" + regionInfo.getEncodedName(); return "" + serverName.getServerName() + ""; @@ -383,7 +405,7 @@ index 56a0c8096d..49c8a69c60 100644 ServerMetrics sl = master.getServerManager().getLoad(metaLocation); // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); ++ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { @@ -392,7 +414,7 @@ index 56a0c8096d..49c8a69c60 100644 if (metaLocation != null) { ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); ++ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { @@ -401,7 +423,7 @@ index 56a0c8096d..49c8a69c60 100644 if (metaLocation != null) { ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getExternalHostname()) + ":" + metaLocation.getExternalPort().toString(); ++ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); if (sl != null) { Map map = sl.getRegionMetrics(); if (map.containsKey(meta.getRegionName())) { @@ -419,7 +441,7 @@ index 56a0c8096d..49c8a69c60 100644 // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; if(sl != null) { Integer i = regDistribution.get(addr); if (null == i) i = Integer.valueOf(0); @@ -428,7 +450,7 @@ index 56a0c8096d..49c8a69c60 100644 %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> <% } else { @@ -437,7 +459,7 @@ index 56a0c8096d..49c8a69c60 100644 // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; } if (numRegionsRendered < numRegionsToRender) { numRegionsRendered++; @@ -446,7 +468,7 @@ index 56a0c8096d..49c8a69c60 100644 %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> <% } else { @@ -455,7 +477,7 @@ index 56a0c8096d..49c8a69c60 100644 // This port might be wrong if RS actually ended up using something else. urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; ++ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; } if (numRegionsRendered < numRegionsToRender) { numRegionsRendered++; @@ -464,7 +486,7 @@ index 56a0c8096d..49c8a69c60 100644 %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> ++ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> <% } else { @@ -473,11 +495,11 @@ index 56a0c8096d..49c8a69c60 100644 for (Map.Entry rdEntry : regDistribution.entrySet()) { ServerName addr = rdEntry.getKey(); - String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ String url = "//" + URLEncoder.encode(addr.getExternalHostname()) + ":" + addr.getExternalPort().toString() + "/rs-status"; ++ String url = "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; %> - <%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= StringEscapeUtils.escapeHtml4(addr.getExternalHostname().toString()) + ":" + addr.getExternalPort().toString() %> ++ <%= StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> <%= rdEntry.getValue()%> <% if (withReplica) { From 2a2a5ace8a895b5d64dc39e545ecfa4d59dd610b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Sat, 31 May 2025 16:31:02 +0200 Subject: [PATCH 06/20] Consistently override the advertised ports --- hbase/stackable/bin/hbase-entrypoint.sh | 4 + ...28242-Updates-async-profiler-support.patch | 25 +- .../0005-Allow-overriding-ipc-bind-port.patch | 30 + ...rvername-with-external-host-and-port.patch | 519 ------------------ .../2.6.1/0006-Use-this-port-instead.patch | 141 +++++ 5 files changed, 187 insertions(+), 532 deletions(-) create mode 100644 hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch delete mode 100644 hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch create mode 100644 hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh index 14d96bb61..6db795c62 100755 --- a/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -78,6 +78,10 @@ fi # Service endpoints HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) HBASE_SERVICE_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_PORT_NAME}") +HBASE_INFO_PORT=$(cat /stackable/listener/default-address/ports/ui-http) +export HBASE_SERVICE_HOST +export HBASE_SERVICE_PORT +export HBASE_INFO_PORT sed -i -e s/\$\{HBASE_SERVICE_HOST\}/"${HBASE_SERVICE_HOST}"/g /stackable/conf/hbase-site.xml sed -i -e s/\$\{HBASE_SERVICE_PORT\}/"${HBASE_SERVICE_PORT}"/g /stackable/conf/hbase-site.xml diff --git a/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch b/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch index bf9d654ad..2901aaf99 100644 --- a/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch +++ b/hbase/stackable/patches/2.6.1/0001-HBASE-28242-Updates-async-profiler-support.patch @@ -4,8 +4,8 @@ Date: Tue, 6 Feb 2024 16:10:54 +0100 Subject: HBASE-28242: Updates async-profiler support --- - .../hadoop/hbase/http/ProfileServlet.java | 207 +++++++++++------- - 1 file changed, 122 insertions(+), 85 deletions(-) + .../hadoop/hbase/http/ProfileServlet.java | 205 +++++++++++------- + 1 file changed, 121 insertions(+), 84 deletions(-) diff --git a/hbase-http/src/main/java/org/apache/hadoop/hbase/http/ProfileServlet.java b/hbase-http/src/main/java/org/apache/hadoop/hbase/http/ProfileServlet.java index 83087dbed3..6139114717 100644 @@ -106,22 +106,21 @@ index 83087dbed3..6139114717 100644 ALLOC("alloc"), LOCK("lock"), - PAGE_FAULTS("page-faults"), -- CONTEXT_SWITCHES("context-switches"), -- CYCLES("cycles"), -- INSTRUCTIONS("instructions"), -- CACHE_REFERENCES("cache-references"), -- CACHE_MISSES("cache-misses"), -- BRANCHES("branches"), + ITIMER("itimer"), + BRANCH_INSTRUCTIONS("branch-instructions"), - BRANCH_MISSES("branch-misses"), - BUS_CYCLES("bus-cycles"), ++ BRANCH_MISSES("branch-misses"), ++ BUS_CYCLES("bus-cycles"), + CACHE_MISSES("cache-misses"), + CACHE_REFERENCES("cache-references"), -+ CONTEXT_SWITCHES("context-switches"), -+ CYCLES("cycles"), + CONTEXT_SWITCHES("context-switches"), + CYCLES("cycles"), + DTLB_LOAD_MISSES("dTLB-load-misses"), -+ INSTRUCTIONS("instructions"), + INSTRUCTIONS("instructions"), +- CACHE_REFERENCES("cache-references"), +- CACHE_MISSES("cache-misses"), +- BRANCHES("branches"), +- BRANCH_MISSES("branch-misses"), +- BUS_CYCLES("bus-cycles"), L1_DCACHE_LOAD_MISSES("L1-dcache-load-misses"), LLC_LOAD_MISSES("LLC-load-misses"), - DTLB_LOAD_MISSES("dTLB-load-misses"), diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch new file mode 100644 index 000000000..8f0812882 --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch @@ -0,0 +1,30 @@ +From 93620b3eecc29ca0a973891902a3a66944aa2305 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= +Date: Fri, 30 May 2025 14:26:26 +0200 +Subject: Allow overriding ipc bind port + +--- + .../org/apache/hadoop/hbase/regionserver/RSRpcServices.java | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +index b77fcf338a..1f5c9dd21f 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin + int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); +- bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); ++ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); + } else { + String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); + int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); + bindAddress = +- new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); ++ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); + } + if (initialIsa.getAddress() == null) { + throw new IllegalArgumentException("Failed resolve of " + initialIsa); diff --git a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch b/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch deleted file mode 100644 index b8c2e09b9..000000000 --- a/hbase/stackable/patches/2.6.1/0005-extend-servername-with-external-host-and-port.patch +++ /dev/null @@ -1,519 +0,0 @@ -From 958fd8f17dd203329b1da058e4714762412b4c57 Mon Sep 17 00:00:00 2001 -From: Andrew Kenworthy -Date: Wed, 16 Apr 2025 16:43:33 +0200 -Subject: extend servername with external host and port - ---- - .../hbase/shaded/protobuf/ProtobufUtil.java | 15 ++++++- - .../org/apache/hadoop/hbase/ServerName.java | 43 ++++++++++++++++++- - .../src/main/protobuf/HBase.proto | 2 + - .../main/protobuf/RegionServerStatus.proto | 3 ++ - hbase-protocol/src/main/protobuf/HBase.proto | 2 + - .../src/main/protobuf/ZooKeeper.proto | 2 + - .../tmpl/master/RegionServerListTmpl.jamon | 2 +- - .../tmpl/regionserver/RSStatusTmpl.jamon | 2 +- - .../apache/hadoop/hbase/master/HMaster.java | 7 +++ - .../hadoop/hbase/master/ServerManager.java | 4 +- - .../hbase/regionserver/HRegionServer.java | 16 ++++++- - .../resources/hbase-webapps/master/hbck.jsp | 4 +- - .../hbase-webapps/master/rsgroup.jsp | 15 +++---- - .../resources/hbase-webapps/master/table.jsp | 30 ++++++------- - .../hbase/zookeeper/MasterAddressTracker.java | 3 ++ - 15 files changed, 116 insertions(+), 34 deletions(-) - -diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java -index 0fe181b503..be121ea641 100644 ---- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java -+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java -@@ -417,6 +417,13 @@ public final class ProtobufUtil { - if (serverName.getStartcode() >= 0) { - builder.setStartCode(serverName.getStartcode()); - } -+ -+ if (serverName.getExternalHostname() != null) { -+ builder.setExternalHostName(serverName.getExternalHostname()); -+ } -+ if (serverName.getExternalPort() != null) { -+ builder.setExternalPort(serverName.getExternalPort()); -+ } - return builder.build(); - } - -@@ -428,6 +435,9 @@ public final class ProtobufUtil { - public static ServerName toServerName(final HBaseProtos.ServerName proto) { - if (proto == null) return null; - String hostName = proto.getHostName(); -+ String externalHostName = proto.getExternalHostName(); -+ Integer externalPort = proto.getExternalPort(); -+ - long startCode = -1; - int port = -1; - if (proto.hasPort()) { -@@ -436,7 +446,7 @@ public final class ProtobufUtil { - if (proto.hasStartCode()) { - startCode = proto.getStartCode(); - } -- return ServerName.valueOf(hostName, port, startCode); -+ return ServerName.valueOf(hostName, port, startCode, externalHostName, externalPort); - } - - /** -@@ -3145,7 +3155,8 @@ public final class ProtobufUtil { - ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen); - org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName sn = - rss.getMaster(); -- return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode()); -+ return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode(), -+ sn.getExternalHostName(), sn.getExternalPort()); - } catch (/* InvalidProtocolBufferException */IOException e) { - // A failed parse of the znode is pretty catastrophic. Rather than loop - // retrying hoping the bad bytes will changes, and rather than change -diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java -index 5223bac3e5..979eb4c6ae 100644 ---- a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java -+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java -@@ -85,6 +85,8 @@ public class ServerName implements Comparable, Serializable { - private final String serverName; - private final long startCode; - private transient Address address; -+ private String externalHostname; -+ private Integer externalPort; - - /** - * Cached versioned bytes of this ServerName instance. -@@ -103,11 +105,21 @@ public class ServerName implements Comparable, Serializable { - this(Address.fromParts(hostname, port), startCode); - } - -- private ServerName(final Address address, final long startCode) { -+ protected ServerName(final String hostname, final int port, final long startCode, String externalHostname, Integer externalPort) { -+ this(Address.fromParts(hostname, port), startCode, externalHostname, externalPort); -+ } -+ -+ private ServerName(final Address address, final long startCode, String externalHostname, Integer externalPort) { - // Use HostAndPort to host port and hostname. Does validation and can do ipv6 - this.address = address; - this.startCode = startCode; - this.serverName = getServerName(this.address.getHostname(), this.address.getPort(), startCode); -+ this.externalHostname = externalHostname; -+ this.externalPort = externalPort; -+ } -+ -+ private ServerName(final Address address, final long startCode) { -+ this(address, startCode, null, null); - } - - private ServerName(final String hostAndPort, final long startCode) { -@@ -177,6 +189,11 @@ public class ServerName implements Comparable, Serializable { - return INTERN_POOL.intern(new ServerName(hostname, port, startCode)); - } - -+ public static ServerName valueOf(final String hostname, final int port, final long startCode, -+ String externalHostname, Integer externalPort) { -+ return new ServerName(hostname, port, startCode, externalHostname, externalPort); -+ } -+ - /** - * Retrieve an instance of ServerName. Callers should use the equals method to compare returned - * instances, though we may return a shared immutable object as an internal optimization. -@@ -253,6 +270,30 @@ public class ServerName implements Comparable, Serializable { - return this.address.getPort(); - } - -+ public String getExternalHostname() { -+ return this.externalHostname; -+ } -+ -+ public Integer getExternalPort() { -+ return this.externalPort; -+ } -+ -+ public String getDisplayHostname() { -+ return this.externalHostname != null && !this.externalHostname.isEmpty() ? this.externalHostname: this.getHostname(); -+ } -+ -+ public Integer getDisplayPort() { -+ return this.externalPort != null && this.externalPort > 0 ? this.externalPort: this.getPort(); -+ } -+ -+ public void setAddress(Address address) { -+ this.address = address; -+ } -+ -+ public void setExternalPort(Integer externalPort) { -+ this.externalPort = externalPort; -+ } -+ - /** - * Return the start code. - * @deprecated Since 2.5.0, will be removed in 4.0.0. Use {@link #getStartCode()} instead. -diff --git a/hbase-protocol-shaded/src/main/protobuf/HBase.proto b/hbase-protocol-shaded/src/main/protobuf/HBase.proto -index e858d7ec33..2da62e0e0a 100644 ---- a/hbase-protocol-shaded/src/main/protobuf/HBase.proto -+++ b/hbase-protocol-shaded/src/main/protobuf/HBase.proto -@@ -147,6 +147,8 @@ message ServerName { - required string host_name = 1; - optional uint32 port = 2; - optional uint64 start_code = 3; -+ optional string external_host_name = 100; -+ optional uint32 external_port = 101; - } - - // Comment data structures -diff --git a/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto b/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto -index 53751082f9..ecb3cf6221 100644 ---- a/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto -+++ b/hbase-protocol-shaded/src/main/protobuf/RegionServerStatus.proto -@@ -42,6 +42,9 @@ message RegionServerStartupRequest { - - /** hostname for region server, optional */ - optional string use_this_hostname_instead = 4; -+ -+ optional string external_host_name = 100; -+ optional uint32 external_port = 101; - } - - message RegionServerStartupResponse { -diff --git a/hbase-protocol/src/main/protobuf/HBase.proto b/hbase-protocol/src/main/protobuf/HBase.proto -index ecfdc8c2c7..833cee7bee 100644 ---- a/hbase-protocol/src/main/protobuf/HBase.proto -+++ b/hbase-protocol/src/main/protobuf/HBase.proto -@@ -135,6 +135,8 @@ message ServerName { - required string host_name = 1; - optional uint32 port = 2; - optional uint64 start_code = 3; -+ optional string external_host_name = 100; -+ optional uint32 external_port = 101; - } - - // Comment data structures -diff --git a/hbase-protocol/src/main/protobuf/ZooKeeper.proto b/hbase-protocol/src/main/protobuf/ZooKeeper.proto -index c0f40e970e..bddadf4d30 100644 ---- a/hbase-protocol/src/main/protobuf/ZooKeeper.proto -+++ b/hbase-protocol/src/main/protobuf/ZooKeeper.proto -@@ -56,6 +56,8 @@ message Master { - // Major RPC version so that clients can know what version the master can accept. - optional uint32 rpc_version = 2; - optional uint32 info_port = 3; -+ optional string external_host = 4; -+ optional uint32 external_port = 5; - } - - /** -diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon -index 4c9140470b..641f558d87 100644 ---- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon -+++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmpl.jamon -@@ -500,7 +500,7 @@ if (totalCompactingCells > 0) { - - <%java> - int infoPort = master.getRegionServerInfoPort(serverName); -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; - - - <%if infoPort > 0%> -diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon -index 23330096cf..3abe5d617d 100644 ---- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon -+++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon -@@ -245,7 +245,7 @@ org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; - No master found - <%else> - <%java> -- String host = masterServerName.getHostname() + ":" + infoPort; -+ String host = masterServerName.getDisplayHostname() + ":" + masterServerName.getDisplayPort(); - String url = "//" + host + "/master-status"; - - <% host %> -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 3fe5abac27..652c709ab5 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -@@ -3128,6 +3128,13 @@ public class HMaster extends HRegionServer implements MasterServices { - - public int getRegionServerInfoPort(final ServerName sn) { - int port = this.serverManager.getInfoPort(sn); -+ if (port == 0) { -+ if (sn.getExternalPort() != null) { -+ port = sn.getExternalPort(); -+ } else { -+ port = sn.getAddress().getPort(); -+ } -+ } - return port == 0 - ? conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) - : port; -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java -index f7115a5cef..e5f6062793 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java -@@ -45,6 +45,7 @@ import org.apache.hadoop.hbase.ServerName; - import org.apache.hadoop.hbase.YouAreDeadException; - import org.apache.hadoop.hbase.client.ClusterConnection; - import org.apache.hadoop.hbase.client.RegionInfo; -+import org.apache.hadoop.hbase.client.RetriesExhaustedException; - import org.apache.hadoop.hbase.conf.ConfigurationObserver; - import org.apache.hadoop.hbase.ipc.DecommissionedHostRejectedException; - import org.apache.hadoop.hbase.ipc.HBaseRpcController; -@@ -230,7 +231,8 @@ public class ServerManager implements ConfigurationObserver { - String isaHostName = useIp ? ia.getHostAddress() : ia.getHostName(); - final String hostname = - request.hasUseThisHostnameInstead() ? request.getUseThisHostnameInstead() : isaHostName; -- ServerName sn = ServerName.valueOf(hostname, request.getPort(), request.getServerStartCode()); -+ ServerName sn = ServerName.valueOf(hostname, request.getPort(), request.getServerStartCode(), -+ request.getExternalHostName(), request.getExternalPort()); - - // Check if the host should be rejected based on it's decommissioned status - checkRejectableDecommissionedStatus(sn); -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..8438378059 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -678,7 +678,18 @@ public class HRegionServer extends Thread - useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); - String hostName = - StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; -- serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode); -+ -+ String externalHostname; -+ Integer externalPort; -+ if (this instanceof HMaster) { -+ externalHostname = conf.get("hbase.listener.master.hostname", ""); -+ externalPort = conf.getInt("hbase.listener.master.port", -1); -+ } else { -+ externalHostname = conf.get("hbase.listener.regionserver.hostname", ""); -+ externalPort = conf.getInt("hbase.listener.regionserver.port", -1); -+ } -+ -+ serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode, externalHostname, externalPort); - - rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); - rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, -@@ -3081,6 +3092,9 @@ public class HRegionServer extends Thread - request.setPort(port); - request.setServerStartCode(this.startcode); - request.setServerCurrentTime(now); -+ request.setExternalHostName(serverName.getExternalHostname()); -+ request.setExternalPort(serverName.getExternalPort()); -+ - result = rss.regionServerStartup(null, request.build()); - } catch (ServiceException se) { - IOException ioe = ProtobufUtil.getRemoteException(se); -diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -index 38e16ca8e2..61e4cf2b17 100644 ---- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -+++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp -@@ -364,9 +364,9 @@ private static String formatServerName(HMaster master, - } - String sn = serverName.toString(); - if (serverManager.isServerOnline(serverName)) { -- int infoPort = master.getRegionServerInfoPort(serverName); -+ int infoPort = serverName.getDisplayPort(); - if (infoPort > 0) { -- return "" + sn + ""; - } else { - return "" + sn + ""; -diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -index 6ba6f78a27..d05e1bc8f0 100644 ---- a/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -+++ b/hbase-server/src/main/resources/hbase-webapps/master/rsgroup.jsp -@@ -170,8 +170,7 @@ - lastContact = (System.currentTimeMillis() - sl.getReportTimestamp())/1000; - } - long startcode = serverName.getStartcode(); -- int infoPort = master.getRegionServerInfoPort(serverName); -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";%> -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status";%> - - <%= serverName.getServerName() %> - <%= new Date(startcode) %> -@@ -225,8 +224,7 @@ - double memStoreSizeMB = sl.getRegionMetrics().values() - .stream().mapToDouble(rm -> rm.getMemStoreSize().get(Size.Unit.MEGABYTE)) - .sum(); -- int infoPort = master.getRegionServerInfoPort(serverName); -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; - - if (memStoreSizeMB > 0) { - memStoreSizeMBStr = TraditionalBinaryPrefix.long2String( -@@ -270,14 +268,13 @@ - ServerName serverName = serverMaping.get(server); - ServerMetrics sl = onlineServers.get(server); - if (sl != null && serverName != null) { -- int infoPort = master.getRegionServerInfoPort(serverName); - long readRequestCount = 0; - long writeRequestCount = 0; - for (RegionMetrics rm : sl.getRegionMetrics().values()) { - readRequestCount += rm.getReadRequestCount(); - writeRequestCount += rm.getWriteRequestCount(); - } -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; - %> - - <%= serverName.getServerName() %> -@@ -330,8 +327,7 @@ - totalStaticIndexSizeKB += rm.getStoreFileUncompressedDataIndexSize().get(Size.Unit.KILOBYTE); - totalStaticBloomSizeKB += rm.getBloomFilterSize().get(Size.Unit.KILOBYTE); - } -- int infoPort = master.getRegionServerInfoPort(serverName); -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; - if (storeUncompressedSizeMB > 0) { - storeUncompressedSizeMBStr = TraditionalBinaryPrefix.long2String( - (long) storeUncompressedSizeMB * TraditionalBinaryPrefix.MEGA.value, "B", 1); -@@ -396,8 +392,7 @@ - percentDone = String.format("%.2f", 100 * - ((float) currentCompactedCells / totalCompactingCells)) + "%"; - } -- int infoPort = master.getRegionServerInfoPort(serverName); -- String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status"; -+ String url = "//" + serverName.getDisplayHostname() + ":" + serverName.getDisplayPort() + "/rs-status"; - %> - - <%= serverName.getServerName() %> -diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp -index 56a0c8096d..01fbde1b18 100644 ---- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp -+++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp -@@ -93,8 +93,8 @@ - * its region server. - * @return an anchor tag if one can be built, {@code null} otherwise. - */ -- private static String buildRegionServerLink(final ServerName serverName, final int rsInfoPort, -- final RegionInfo regionInfo, final RegionState.State regionState) { -+ private static String buildRegionServerLink(final ServerName serverName, -+ final RegionInfo regionInfo, final RegionState.State regionState) { - if (serverName == null || regionInfo == null) { return null; } - - if (regionState != RegionState.State.OPEN) { -@@ -102,7 +102,7 @@ - return serverName.getServerName(); - } - -- final String socketAddress = serverName.getHostname() + ":" + rsInfoPort; -+ final String socketAddress = serverName.getDisplayHostname() + ":" + serverName.getDisplayPort(); - final String URI = "//" + socketAddress + "/region.jsp" - + "?name=" + regionInfo.getEncodedName(); - return "" + serverName.getServerName() + ""; -@@ -299,7 +299,7 @@ - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. -- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { -@@ -374,7 +374,7 @@ - float localityForSsd = 0.0f; - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); -- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { -@@ -426,7 +426,7 @@ - String compactionProgress = ""; - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); -- hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); -+ hostAndPort = URLEncoder.encode(metaLocation.getDisplayHostname()) + ":" + metaLocation.getDisplayPort().toString(); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { -@@ -548,7 +548,7 @@ - <%= endKeyDisplay %> - <%= replicaIdDisplay %> - <%= regionStateDisplay %> -- "><%= serverName != null ? buildRegionServerLink(serverName, master.getRegionServerInfoPort(serverName), regionInfo, regionState) : "" %> -+ "><%= serverName != null ? buildRegionServerLink(serverName, regionInfo, regionState) : "" %> - <%= seqNum %> - <%= targetServerName %> - <%= mergeRegionNames %> -@@ -951,7 +951,7 @@ - ServerMetrics sl = master.getServerManager().getLoad(addr); - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = -- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; - if(sl != null) { - Integer i = regDistribution.get(addr); - if (null == i) i = Integer.valueOf(0); -@@ -972,7 +972,7 @@ - if (urlRegionServer != null) { - %> - -- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> - - <% - } else { -@@ -1037,7 +1037,7 @@ - if (addr != null) { - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = -- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; - } - if (numRegionsRendered < numRegionsToRender) { - numRegionsRendered++; -@@ -1048,7 +1048,7 @@ - if (urlRegionServer != null) { - %> - -- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> - - <% - } else { -@@ -1098,7 +1098,7 @@ - if (addr != null) { - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = -- "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; - } - if (numRegionsRendered < numRegionsToRender) { - numRegionsRendered++; -@@ -1109,7 +1109,7 @@ - if (urlRegionServer != null) { - %> - -- <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> - - <% - } else { -@@ -1153,10 +1153,10 @@ - <% - for (Map.Entry rdEntry : regDistribution.entrySet()) { - ServerName addr = rdEntry.getKey(); -- String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; -+ String url = "//" + URLEncoder.encode(addr.getDisplayHostname()) + ":" + addr.getDisplayPort().toString() + "/rs-status"; - %> - -- <%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> -+ <%= StringEscapeUtils.escapeHtml4(addr.getDisplayHostname().toString()) + ":" + addr.getDisplayPort().toString() %> - <%= rdEntry.getValue()%> - <% - if (withReplica) { -diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java -index 840ee2d215..b0f9da3e00 100644 ---- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java -+++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java -@@ -281,6 +281,9 @@ public class MasterAddressTracker extends ZKNodeTracker { - snbuilder.setHostName(sn.getHostname()); - snbuilder.setPort(sn.getPort()); - snbuilder.setStartCode(sn.getStartcode()); -+ snbuilder.setExternalHostName(sn.getExternalHostname()); -+ snbuilder.setExternalPort(sn.getExternalPort()); -+ - mbuilder.setMaster(snbuilder.build()); - mbuilder.setRpcVersion(HConstants.RPC_CURRENT_VERSION); - mbuilder.setInfoPort(infoPort); diff --git a/hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch b/hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch new file mode 100644 index 000000000..77581444a --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch @@ -0,0 +1,141 @@ +From c17e6c5bc3a942600eb901798654d767448c1e16 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= +Date: Fri, 30 May 2025 15:36:36 +0200 +Subject: Use this port instead + +--- + .../hadoop/hbase/ipc/RpcClientFactory.java | 1 + + .../apache/hadoop/hbase/master/HMaster.java | 4 ++-- + .../hbase/regionserver/HRegionServer.java | 22 +++++++++++++------ + 3 files changed, 18 insertions(+), 9 deletions(-) + +diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java +index fa65739c16..501b6b7637 100644 +--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java ++++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java +@@ -99,6 +99,7 @@ public final class RpcClientFactory { + */ + public static RpcClient createClient(Configuration conf, String clusterId, + SocketAddress localAddr, MetricsConnection metrics, Map connectionAttributes) { ++ new Exception("BATMAN creating client localAddr="+localAddr).printStackTrace(); + String rpcClientClass = getRpcClientClass(conf); + return ReflectionUtils.instantiateWithCustomCtor( + rpcClientClass, new Class[] { Configuration.class, String.class, SocketAddress.class, +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 3fe5abac27..5719f276bf 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -587,7 +587,7 @@ public class HMaster extends HRegionServer implements MasterServices { + Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { + try { + int infoPort = putUpJettyServer(); +- startActiveMasterManager(infoPort); ++ startActiveMasterManager(useThisInfoPortInstead); + } catch (Throwable t) { + // Make sure we log the exception. + String error = "Failed to become Active Master"; +@@ -2991,7 +2991,7 @@ public class HMaster extends HRegionServer implements MasterServices { + } + case MASTER_INFO_PORT: { + if (infoServer != null) { +- builder.setMasterInfoPort(infoServer.getPort()); ++ builder.setMasterInfoPort(useThisInfoPortInstead); + } + break; + } +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 27bcef2f06..d18ad91c3a 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -505,6 +505,10 @@ public class HRegionServer extends Thread + */ + protected String useThisHostnameInstead; + ++ protected int useThisPortInstead; ++ ++ protected int useThisInfoPortInstead; ++ + /** + * @deprecated since 2.4.0 and will be removed in 4.0.0. Use + * {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead. +@@ -669,6 +673,8 @@ public class HRegionServer extends Thread + this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); + rpcServices = createRpcServices(); + useThisHostnameInstead = getUseThisHostnameInstead(conf); ++ useThisPortInstead = Integer.parseInt(System.getenv("HBASE_SERVICE_PORT")); ++ useThisInfoPortInstead = Integer.parseInt(System.getenv("HBASE_INFO_PORT")); + + // if use-ip is enabled, we will use ip to expose Master/RS service for client, + // see HBASE-27304 for details. +@@ -678,7 +684,7 @@ public class HRegionServer extends Thread + useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); + String hostName = + StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; +- serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode); ++ serverName = ServerName.valueOf(hostName, useThisPortInstead, this.startcode); + + rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); + rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, +@@ -715,7 +721,7 @@ public class HRegionServer extends Thread + + // Some unit tests don't need a cluster, so no zookeeper at all + // Open connection to zookeeper and set primary watcher +- zooKeeper = new ZKWatcher(conf, getProcessName() + ":" + rpcServices.isa.getPort(), this, ++ zooKeeper = new ZKWatcher(conf, getProcessName() + ":" + useThisPortInstead, this, + canCreateBaseZNode()); + // If no master in cluster, skip trying to track one or look for a cluster status. + if (!this.masterless) { +@@ -958,7 +964,7 @@ public class HRegionServer extends Thread + } + // Setup RPC client for master communication + this.rpcClient = RpcClientFactory.createClient(conf, clusterId, +- new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), ++ new InetSocketAddress(/*this.rpcServices.isa.getAddress(), */0), + clusterConnection.getConnectionMetrics(), Collections.emptyMap()); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { +@@ -1533,6 +1539,8 @@ public class HRegionServer extends Thread + } else { + serverLoad.setInfoServerPort(-1); + } ++ // serverLoad.setInfoServerPort(Integer.parseInt(System.getenv("HBASE_INFO_PORT"))); ++ serverLoad.setInfoServerPort(useThisInfoPortInstead); + MetricsUserAggregateSource userSource = + metricsRegionServer.getMetricsUserAggregate().getSource(); + if (userSource != null) { +@@ -1688,7 +1696,7 @@ public class HRegionServer extends Thread + if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) { + String hostnameFromMasterPOV = e.getValue(); + this.serverName = ServerName.valueOf(hostnameFromMasterPOV, +- rpcServices.getSocketAddress().getPort(), this.startcode); ++ useThisPortInstead, this.startcode); + String expectedHostName = rpcServices.getSocketAddress().getHostName(); + // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it + // is set to disable. so we will use the ip of the RegionServer to compare with the +@@ -1814,7 +1822,7 @@ public class HRegionServer extends Thread + + private void createMyEphemeralNode() throws KeeperException { + RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder(); +- rsInfo.setInfoPort(infoServer != null ? infoServer.getPort() : -1); ++ rsInfo.setInfoPort(infoServer != null ? useThisInfoPortInstead : -1); + rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo()); + byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray()); + ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data); +@@ -2479,7 +2487,7 @@ public class HRegionServer extends Thread + LOG.info("Retry starting http info server with port: " + port); + } + } +- port = this.infoServer.getPort(); ++ port = useThisInfoPortInstead; + conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); + int masterInfoPort = + conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); +@@ -3078,7 +3086,7 @@ public class HRegionServer extends Thread + if (!StringUtils.isBlank(useThisHostnameInstead)) { + request.setUseThisHostnameInstead(useThisHostnameInstead); + } +- request.setPort(port); ++ request.setPort(useThisPortInstead); + request.setServerStartCode(this.startcode); + request.setServerCurrentTime(now); + result = rss.regionServerStartup(null, request.build()); From 9ef046c8308e797a4fe406df92016fcd3c829ab9 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Tue, 10 Jun 2025 18:11:35 +0200 Subject: [PATCH 07/20] add listener endpoint and info port to hbase-site.xml --- hbase/stackable/bin/hbase-entrypoint.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh index 6db795c62..2781539f6 100755 --- a/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -79,11 +79,14 @@ fi HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) HBASE_SERVICE_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_PORT_NAME}") HBASE_INFO_PORT=$(cat /stackable/listener/default-address/ports/ui-http) +HBASE_LISTENER_ENDPOINT="$HBASE_SERVICE_HOST:$HBASE_INFO_PORT" export HBASE_SERVICE_HOST export HBASE_SERVICE_PORT export HBASE_INFO_PORT sed -i -e s/\$\{HBASE_SERVICE_HOST\}/"${HBASE_SERVICE_HOST}"/g /stackable/conf/hbase-site.xml sed -i -e s/\$\{HBASE_SERVICE_PORT\}/"${HBASE_SERVICE_PORT}"/g /stackable/conf/hbase-site.xml +sed -i -e s/\$\{HBASE_LISTENER_ENDPOINT\}/"${HBASE_LISTENER_ENDPOINT}"/g /stackable/conf/hbase-site.xml +sed -i -e s/\$\{HBASE_INFO_PORT\}/"${HBASE_INFO_PORT}"/g /stackable/conf/hbase-site.xml rm -f "${STACKABLE_LOG_DIR}/_vector/shutdown" prepare_signal_handlers From 99fd166692e9f6e9115150857c98904e05781410 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Fri, 13 Jun 2025 17:38:34 +0200 Subject: [PATCH 08/20] patch and entrypoint refactoring --- hbase/stackable/bin/hbase-entrypoint.sh | 10 +- .../patches/2.6.1/0007-Refactoring.patch | 98 +++++++++++++++++++ 2 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 hbase/stackable/patches/2.6.1/0007-Refactoring.patch diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh index 2781539f6..1cee142ef 100755 --- a/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -16,8 +16,10 @@ HBASE_ROLE_NAME="$1" HBASE_ROLE_SERVICE_NAME="$2" # 16010 for master, 16020 for regionservers etc. HBASE_ROLE_SERVICE_PORT="$3" -# ui-http or ui-https +# master, regionserver, rest_http, rest_https HBASE_PORT_NAME="$4" +# ui-http or ui-https +HBASE_UI_PORT_NAME="$5" HBASE_ROLE_SERVICE_HOST="${HOSTNAME}.${HBASE_ROLE_SERVICE_NAME}" @@ -78,11 +80,9 @@ fi # Service endpoints HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) HBASE_SERVICE_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_PORT_NAME}") -HBASE_INFO_PORT=$(cat /stackable/listener/default-address/ports/ui-http) +HBASE_INFO_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_UI_PORT_NAME}") HBASE_LISTENER_ENDPOINT="$HBASE_SERVICE_HOST:$HBASE_INFO_PORT" -export HBASE_SERVICE_HOST -export HBASE_SERVICE_PORT -export HBASE_INFO_PORT + sed -i -e s/\$\{HBASE_SERVICE_HOST\}/"${HBASE_SERVICE_HOST}"/g /stackable/conf/hbase-site.xml sed -i -e s/\$\{HBASE_SERVICE_PORT\}/"${HBASE_SERVICE_PORT}"/g /stackable/conf/hbase-site.xml sed -i -e s/\$\{HBASE_LISTENER_ENDPOINT\}/"${HBASE_LISTENER_ENDPOINT}"/g /stackable/conf/hbase-site.xml diff --git a/hbase/stackable/patches/2.6.1/0007-Refactoring.patch b/hbase/stackable/patches/2.6.1/0007-Refactoring.patch new file mode 100644 index 000000000..89c60b2fb --- /dev/null +++ b/hbase/stackable/patches/2.6.1/0007-Refactoring.patch @@ -0,0 +1,98 @@ +From ebf82fed4b32988eaf3d6b27438f63dec8afc00a Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Thu, 12 Jun 2025 15:30:15 +0200 +Subject: Refactoring + +--- + .../apache/hadoop/hbase/ipc/RpcClientFactory.java | 1 - + .../java/org/apache/hadoop/hbase/master/HMaster.java | 6 ++++++ + .../hadoop/hbase/regionserver/HRegionServer.java | 12 ++++++++---- + 3 files changed, 14 insertions(+), 5 deletions(-) + +diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java +index 501b6b7637..fa65739c16 100644 +--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java ++++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java +@@ -99,7 +99,6 @@ public final class RpcClientFactory { + */ + public static RpcClient createClient(Configuration conf, String clusterId, + SocketAddress localAddr, MetricsConnection metrics, Map connectionAttributes) { +- new Exception("BATMAN creating client localAddr="+localAddr).printStackTrace(); + String rpcClientClass = getRpcClientClass(conf); + return ReflectionUtils.instantiateWithCustomCtor( + rpcClientClass, new Class[] { Configuration.class, String.class, SocketAddress.class, +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 5719f276bf..be0136193b 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master; + import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; ++import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; + import static org.apache.hadoop.hbase.master.cleaner.HFileCleaner.CUSTOM_POOL_SIZE; + import static org.apache.hadoop.hbase.util.DNS.MASTER_HOSTNAME_KEY; + +@@ -559,6 +560,11 @@ public class HMaster extends HRegionServer implements MasterServices { + return conf.get(MASTER_HOSTNAME_KEY); + } + ++ @Override ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); ++ } ++ + private void registerConfigurationObservers() { + configurationManager.registerObserver(this.rpcServices); + configurationManager.registerObserver(this); +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index d18ad91c3a..80949070fd 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL + import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; + import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; +@@ -673,8 +674,8 @@ public class HRegionServer extends Thread + this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); + rpcServices = createRpcServices(); + useThisHostnameInstead = getUseThisHostnameInstead(conf); +- useThisPortInstead = Integer.parseInt(System.getenv("HBASE_SERVICE_PORT")); +- useThisInfoPortInstead = Integer.parseInt(System.getenv("HBASE_INFO_PORT")); ++ useThisPortInstead = getUseThisPortInstead(conf); ++ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); + + // if use-ip is enabled, we will use ip to expose Master/RS service for client, + // see HBASE-27304 for details. +@@ -782,6 +783,10 @@ public class HRegionServer extends Thread + } + } + ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); ++ } ++ + private void setupSignalHandlers() { + if (!SystemUtils.IS_OS_WINDOWS) { + HBasePlatformDependent.handle("HUP", (number, name) -> { +@@ -964,7 +969,7 @@ public class HRegionServer extends Thread + } + // Setup RPC client for master communication + this.rpcClient = RpcClientFactory.createClient(conf, clusterId, +- new InetSocketAddress(/*this.rpcServices.isa.getAddress(), */0), ++ new InetSocketAddress(0), + clusterConnection.getConnectionMetrics(), Collections.emptyMap()); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { +@@ -3081,7 +3086,6 @@ public class HRegionServer extends Thread + LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa + + ", startcode=" + this.startcode); + long now = EnvironmentEdgeManager.currentTime(); +- int port = rpcServices.isa.getPort(); + RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder(); + if (!StringUtils.isBlank(useThisHostnameInstead)) { + request.setUseThisHostnameInstead(useThisHostnameInstead); From 99530427c6458d2faea9c05cb4ef0c49c15c35d6 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Mon, 16 Jun 2025 12:35:31 +0200 Subject: [PATCH 09/20] hbase: use listener service for region mover --- hbase/stackable/bin/hbase-entrypoint.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh index 1cee142ef..04a9cc16f 100755 --- a/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -11,19 +11,17 @@ set -euo pipefail # master, regionserver, rest HBASE_ROLE_NAME="$1" -# k8s service name for this role+group combo -# ..svc.cluster.local -HBASE_ROLE_SERVICE_NAME="$2" # 16010 for master, 16020 for regionservers etc. -HBASE_ROLE_SERVICE_PORT="$3" +HBASE_ROLE_SERVICE_PORT="$2" # master, regionserver, rest_http, rest_https -HBASE_PORT_NAME="$4" +HBASE_PORT_NAME="$3" # ui-http or ui-https -HBASE_UI_PORT_NAME="$5" +HBASE_UI_PORT_NAME="$4" -HBASE_ROLE_SERVICE_HOST="${HOSTNAME}.${HBASE_ROLE_SERVICE_NAME}" +# Needed for regionmover service and for hbase-site.xml (see below) +HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) -REGION_MOVER_OPTS="--regionserverhost ${HBASE_ROLE_SERVICE_HOST}:${HBASE_ROLE_SERVICE_PORT} --operation unload ${REGION_MOVER_OPTS}" +REGION_MOVER_OPTS="--regionserverhost ${HBASE_SERVICE_HOST}:${HBASE_ROLE_SERVICE_PORT} --operation unload ${REGION_MOVER_OPTS}" prepare_signal_handlers() { unset term_child_pid @@ -78,7 +76,6 @@ if [ -f /stackable/kerberos/krb5.conf ]; then fi # Service endpoints -HBASE_SERVICE_HOST=$(cat /stackable/listener/default-address/address) HBASE_SERVICE_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_PORT_NAME}") HBASE_INFO_PORT=$(cat /stackable/listener/default-address/ports/"${HBASE_UI_PORT_NAME}") HBASE_LISTENER_ENDPOINT="$HBASE_SERVICE_HOST:$HBASE_INFO_PORT" From 4b6b849b345e053760b996e658860a8180566d14 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Mon, 16 Jun 2025 16:02:28 +0200 Subject: [PATCH 10/20] hbase: patch for 2.6.2 endpoints --- ...ipc-bind-port-and-use-alternative-p.patch} | 125 +++++++---- .../0005-Allow-overriding-ipc-bind-port.patch | 30 --- .../patches/2.6.1/0007-Refactoring.patch | 98 --------- ...-ipc-bind-port-and-use-alternative-p.patch | 199 ++++++++++++++++++ 4 files changed, 288 insertions(+), 164 deletions(-) rename hbase/stackable/patches/2.6.1/{0006-Use-this-port-instead.patch => 0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch} (50%) delete mode 100644 hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch delete mode 100644 hbase/stackable/patches/2.6.1/0007-Refactoring.patch create mode 100644 hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch diff --git a/hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch similarity index 50% rename from hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch rename to hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 77581444a..6b233f916 100644 --- a/hbase/stackable/patches/2.6.1/0006-Use-this-port-instead.patch +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,31 +1,39 @@ -From c17e6c5bc3a942600eb901798654d767448c1e16 Mon Sep 17 00:00:00 2001 +From 00ec82be6136e55d4d901e28791bc3ce36d726c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= -Date: Fri, 30 May 2025 15:36:36 +0200 -Subject: Use this port instead +Date: Fri, 30 May 2025 14:26:26 +0200 +Subject: Allow overriding ipc bind port and use alternative port from listener --- - .../hadoop/hbase/ipc/RpcClientFactory.java | 1 + - .../apache/hadoop/hbase/master/HMaster.java | 4 ++-- - .../hbase/regionserver/HRegionServer.java | 22 +++++++++++++------ - 3 files changed, 18 insertions(+), 9 deletions(-) + .../apache/hadoop/hbase/master/HMaster.java | 10 +++++-- + .../hbase/regionserver/HRegionServer.java | 28 +++++++++++++------ + .../hbase/regionserver/RSRpcServices.java | 4 +-- + 3 files changed, 30 insertions(+), 12 deletions(-) -diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -index fa65739c16..501b6b7637 100644 ---- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -@@ -99,6 +99,7 @@ public final class RpcClientFactory { - */ - public static RpcClient createClient(Configuration conf, String clusterId, - SocketAddress localAddr, MetricsConnection metrics, Map connectionAttributes) { -+ new Exception("BATMAN creating client localAddr="+localAddr).printStackTrace(); - String rpcClientClass = getRpcClientClass(conf); - return ReflectionUtils.instantiateWithCustomCtor( - rpcClientClass, new Class[] { Configuration.class, String.class, SocketAddress.class, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 3fe5abac27..5719f276bf 100644 +index 3fe5abac27..be0136193b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -@@ -587,7 +587,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master; + import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; ++import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; + import static org.apache.hadoop.hbase.master.cleaner.HFileCleaner.CUSTOM_POOL_SIZE; + import static org.apache.hadoop.hbase.util.DNS.MASTER_HOSTNAME_KEY; + +@@ -559,6 +560,11 @@ public class HMaster extends HRegionServer implements MasterServices { + return conf.get(MASTER_HOSTNAME_KEY); + } + ++ @Override ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); ++ } ++ + private void registerConfigurationObservers() { + configurationManager.registerObserver(this.rpcServices); + configurationManager.registerObserver(this); +@@ -587,7 +593,7 @@ public class HMaster extends HRegionServer implements MasterServices { Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { try { int infoPort = putUpJettyServer(); @@ -34,7 +42,7 @@ index 3fe5abac27..5719f276bf 100644 } catch (Throwable t) { // Make sure we log the exception. String error = "Failed to become Active Master"; -@@ -2991,7 +2991,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -2991,7 +2997,7 @@ public class HMaster extends HRegionServer implements MasterServices { } case MASTER_INFO_PORT: { if (infoServer != null) { @@ -44,10 +52,18 @@ index 3fe5abac27..5719f276bf 100644 break; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..d18ad91c3a 100644 +index 27bcef2f06..80949070fd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -505,6 +505,10 @@ public class HRegionServer extends Thread +@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL + import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; + import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; +@@ -505,6 +506,10 @@ public class HRegionServer extends Thread */ protected String useThisHostnameInstead; @@ -58,16 +74,16 @@ index 27bcef2f06..d18ad91c3a 100644 /** * @deprecated since 2.4.0 and will be removed in 4.0.0. Use * {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead. -@@ -669,6 +673,8 @@ public class HRegionServer extends Thread +@@ -669,6 +674,8 @@ public class HRegionServer extends Thread this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); rpcServices = createRpcServices(); useThisHostnameInstead = getUseThisHostnameInstead(conf); -+ useThisPortInstead = Integer.parseInt(System.getenv("HBASE_SERVICE_PORT")); -+ useThisInfoPortInstead = Integer.parseInt(System.getenv("HBASE_INFO_PORT")); ++ useThisPortInstead = getUseThisPortInstead(conf); ++ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); // if use-ip is enabled, we will use ip to expose Master/RS service for client, // see HBASE-27304 for details. -@@ -678,7 +684,7 @@ public class HRegionServer extends Thread +@@ -678,7 +685,7 @@ public class HRegionServer extends Thread useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); String hostName = StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; @@ -76,7 +92,7 @@ index 27bcef2f06..d18ad91c3a 100644 rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, -@@ -715,7 +721,7 @@ public class HRegionServer extends Thread +@@ -715,7 +722,7 @@ public class HRegionServer extends Thread // Some unit tests don't need a cluster, so no zookeeper at all // Open connection to zookeeper and set primary watcher @@ -85,16 +101,27 @@ index 27bcef2f06..d18ad91c3a 100644 canCreateBaseZNode()); // If no master in cluster, skip trying to track one or look for a cluster status. if (!this.masterless) { -@@ -958,7 +964,7 @@ public class HRegionServer extends Thread +@@ -776,6 +783,10 @@ public class HRegionServer extends Thread + } + } + ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); ++ } ++ + private void setupSignalHandlers() { + if (!SystemUtils.IS_OS_WINDOWS) { + HBasePlatformDependent.handle("HUP", (number, name) -> { +@@ -958,7 +969,7 @@ public class HRegionServer extends Thread } // Setup RPC client for master communication this.rpcClient = RpcClientFactory.createClient(conf, clusterId, - new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), -+ new InetSocketAddress(/*this.rpcServices.isa.getAddress(), */0), ++ new InetSocketAddress(0), clusterConnection.getConnectionMetrics(), Collections.emptyMap()); span.setStatus(StatusCode.OK); } catch (Throwable t) { -@@ -1533,6 +1539,8 @@ public class HRegionServer extends Thread +@@ -1533,6 +1544,8 @@ public class HRegionServer extends Thread } else { serverLoad.setInfoServerPort(-1); } @@ -103,7 +130,7 @@ index 27bcef2f06..d18ad91c3a 100644 MetricsUserAggregateSource userSource = metricsRegionServer.getMetricsUserAggregate().getSource(); if (userSource != null) { -@@ -1688,7 +1696,7 @@ public class HRegionServer extends Thread +@@ -1688,7 +1701,7 @@ public class HRegionServer extends Thread if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) { String hostnameFromMasterPOV = e.getValue(); this.serverName = ServerName.valueOf(hostnameFromMasterPOV, @@ -112,7 +139,7 @@ index 27bcef2f06..d18ad91c3a 100644 String expectedHostName = rpcServices.getSocketAddress().getHostName(); // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it // is set to disable. so we will use the ip of the RegionServer to compare with the -@@ -1814,7 +1822,7 @@ public class HRegionServer extends Thread +@@ -1814,7 +1827,7 @@ public class HRegionServer extends Thread private void createMyEphemeralNode() throws KeeperException { RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder(); @@ -121,7 +148,7 @@ index 27bcef2f06..d18ad91c3a 100644 rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo()); byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray()); ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data); -@@ -2479,7 +2487,7 @@ public class HRegionServer extends Thread +@@ -2479,7 +2492,7 @@ public class HRegionServer extends Thread LOG.info("Retry starting http info server with port: " + port); } } @@ -130,7 +157,12 @@ index 27bcef2f06..d18ad91c3a 100644 conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); int masterInfoPort = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); -@@ -3078,7 +3086,7 @@ public class HRegionServer extends Thread +@@ -3073,12 +3086,11 @@ public class HRegionServer extends Thread + LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa + + ", startcode=" + this.startcode); + long now = EnvironmentEdgeManager.currentTime(); +- int port = rpcServices.isa.getPort(); + RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder(); if (!StringUtils.isBlank(useThisHostnameInstead)) { request.setUseThisHostnameInstead(useThisHostnameInstead); } @@ -139,3 +171,24 @@ index 27bcef2f06..d18ad91c3a 100644 request.setServerStartCode(this.startcode); request.setServerCurrentTime(now); result = rss.regionServerStartup(null, request.build()); +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +index b77fcf338a..1f5c9dd21f 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin + int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); +- bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); ++ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); + } else { + String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); + int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); + bindAddress = +- new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); ++ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); + } + if (initialIsa.getAddress() == null) { + throw new IllegalArgumentException("Failed resolve of " + initialIsa); diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch deleted file mode 100644 index 8f0812882..000000000 --- a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 93620b3eecc29ca0a973891902a3a66944aa2305 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= -Date: Fri, 30 May 2025 14:26:26 +0200 -Subject: Allow overriding ipc bind port - ---- - .../org/apache/hadoop/hbase/regionserver/RSRpcServices.java | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -index b77fcf338a..1f5c9dd21f 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin - int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); - // Creation of a HSA will force a resolve. - initialIsa = new InetSocketAddress(hostname, port); -- bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); -+ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); - } else { - String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); - int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); - // Creation of a HSA will force a resolve. - initialIsa = new InetSocketAddress(hostname, port); - bindAddress = -- new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); -+ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); - } - if (initialIsa.getAddress() == null) { - throw new IllegalArgumentException("Failed resolve of " + initialIsa); diff --git a/hbase/stackable/patches/2.6.1/0007-Refactoring.patch b/hbase/stackable/patches/2.6.1/0007-Refactoring.patch deleted file mode 100644 index 89c60b2fb..000000000 --- a/hbase/stackable/patches/2.6.1/0007-Refactoring.patch +++ /dev/null @@ -1,98 +0,0 @@ -From ebf82fed4b32988eaf3d6b27438f63dec8afc00a Mon Sep 17 00:00:00 2001 -From: Andrew Kenworthy -Date: Thu, 12 Jun 2025 15:30:15 +0200 -Subject: Refactoring - ---- - .../apache/hadoop/hbase/ipc/RpcClientFactory.java | 1 - - .../java/org/apache/hadoop/hbase/master/HMaster.java | 6 ++++++ - .../hadoop/hbase/regionserver/HRegionServer.java | 12 ++++++++---- - 3 files changed, 14 insertions(+), 5 deletions(-) - -diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -index 501b6b7637..fa65739c16 100644 ---- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientFactory.java -@@ -99,7 +99,6 @@ public final class RpcClientFactory { - */ - public static RpcClient createClient(Configuration conf, String clusterId, - SocketAddress localAddr, MetricsConnection metrics, Map connectionAttributes) { -- new Exception("BATMAN creating client localAddr="+localAddr).printStackTrace(); - String rpcClientClass = getRpcClientClass(conf); - return ReflectionUtils.instantiateWithCustomCtor( - rpcClientClass, new Class[] { Configuration.class, String.class, SocketAddress.class, -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 5719f276bf..be0136193b 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master; - import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; - import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; - import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; -+import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; - import static org.apache.hadoop.hbase.master.cleaner.HFileCleaner.CUSTOM_POOL_SIZE; - import static org.apache.hadoop.hbase.util.DNS.MASTER_HOSTNAME_KEY; - -@@ -559,6 +560,11 @@ public class HMaster extends HRegionServer implements MasterServices { - return conf.get(MASTER_HOSTNAME_KEY); - } - -+ @Override -+ protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); -+ } -+ - private void registerConfigurationObservers() { - configurationManager.registerObserver(this.rpcServices); - configurationManager.registerObserver(this); -diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index d18ad91c3a..80949070fd 100644 ---- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL - import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; - import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; - import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; -+import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; - import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; - import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; - import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; -@@ -673,8 +674,8 @@ public class HRegionServer extends Thread - this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); - rpcServices = createRpcServices(); - useThisHostnameInstead = getUseThisHostnameInstead(conf); -- useThisPortInstead = Integer.parseInt(System.getenv("HBASE_SERVICE_PORT")); -- useThisInfoPortInstead = Integer.parseInt(System.getenv("HBASE_INFO_PORT")); -+ useThisPortInstead = getUseThisPortInstead(conf); -+ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); - - // if use-ip is enabled, we will use ip to expose Master/RS service for client, - // see HBASE-27304 for details. -@@ -782,6 +783,10 @@ public class HRegionServer extends Thread - } - } - -+ protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); -+ } -+ - private void setupSignalHandlers() { - if (!SystemUtils.IS_OS_WINDOWS) { - HBasePlatformDependent.handle("HUP", (number, name) -> { -@@ -964,7 +969,7 @@ public class HRegionServer extends Thread - } - // Setup RPC client for master communication - this.rpcClient = RpcClientFactory.createClient(conf, clusterId, -- new InetSocketAddress(/*this.rpcServices.isa.getAddress(), */0), -+ new InetSocketAddress(0), - clusterConnection.getConnectionMetrics(), Collections.emptyMap()); - span.setStatus(StatusCode.OK); - } catch (Throwable t) { -@@ -3081,7 +3086,6 @@ public class HRegionServer extends Thread - LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa - + ", startcode=" + this.startcode); - long now = EnvironmentEdgeManager.currentTime(); -- int port = rpcServices.isa.getPort(); - RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder(); - if (!StringUtils.isBlank(useThisHostnameInstead)) { - request.setUseThisHostnameInstead(useThisHostnameInstead); diff --git a/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch new file mode 100644 index 000000000..5c05a682e --- /dev/null +++ b/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -0,0 +1,199 @@ +From 13bfb4c7799553ecd33f42d9f1da7338c64fa911 Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Mon, 16 Jun 2025 14:44:32 +0200 +Subject: Allow overriding ipc bind port and use alternative port from listener + +--- + .../apache/hadoop/hbase/master/HMaster.java | 11 +++++-- + .../hbase/regionserver/HRegionServer.java | 32 +++++++++++-------- + .../hbase/regionserver/RSRpcServices.java | 4 +-- + 3 files changed, 29 insertions(+), 18 deletions(-) + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 9cafbb7cbf..8847ddaba0 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -17,6 +17,7 @@ + */ + package org.apache.hadoop.hbase.master; + ++import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; + import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; +@@ -570,6 +571,11 @@ public class HMaster extends HRegionServer implements MasterServices { + return conf.get(MASTER_HOSTNAME_KEY); + } + ++ @Override ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); ++ } ++ + private void registerConfigurationObservers() { + configurationManager.registerObserver(this.rpcServices); + configurationManager.registerObserver(this); +@@ -597,8 +603,7 @@ public class HMaster extends HRegionServer implements MasterServices { + registerConfigurationObservers(); + Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { + try { +- int infoPort = putUpJettyServer(); +- startActiveMasterManager(infoPort); ++ startActiveMasterManager(useThisInfoPortInstead); + } catch (Throwable t) { + // Make sure we log the exception. + String error = "Failed to become Active Master"; +@@ -3006,7 +3011,7 @@ public class HMaster extends HRegionServer implements MasterServices { + } + case MASTER_INFO_PORT: { + if (infoServer != null) { +- builder.setMasterInfoPort(infoServer.getPort()); ++ builder.setMasterInfoPort(useThisInfoPortInstead); + } + break; + } +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 351b4fef19..5237f47fd4 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL + import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; + import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; +@@ -505,6 +506,10 @@ public class HRegionServer extends Thread + */ + protected String useThisHostnameInstead; + ++ protected int useThisPortInstead; ++ ++ protected int useThisInfoPortInstead; ++ + /** + * @deprecated since 2.4.0 and will be removed in 4.0.0. Use + * {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead. +@@ -669,6 +674,8 @@ public class HRegionServer extends Thread + this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); + rpcServices = createRpcServices(); + useThisHostnameInstead = getUseThisHostnameInstead(conf); ++ useThisPortInstead = getUseThisPortInstead(conf); ++ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); + + // if use-ip is enabled, we will use ip to expose Master/RS service for client, + // see HBASE-27304 for details. +@@ -678,7 +685,7 @@ public class HRegionServer extends Thread + useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); + String hostName = + StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; +- serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode); ++ serverName = ServerName.valueOf(hostName, useThisPortInstead, this.startcode); + + rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); + rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, +@@ -715,7 +722,7 @@ public class HRegionServer extends Thread + + // Some unit tests don't need a cluster, so no zookeeper at all + // Open connection to zookeeper and set primary watcher +- zooKeeper = new ZKWatcher(conf, getProcessName() + ":" + rpcServices.isa.getPort(), this, ++ zooKeeper = new ZKWatcher(conf, getProcessName() + ":" + useThisPortInstead, this, + canCreateBaseZNode()); + // If no master in cluster, skip trying to track one or look for a cluster status. + if (!this.masterless) { +@@ -776,6 +783,10 @@ public class HRegionServer extends Thread + } + } + ++ protected int getUseThisPortInstead(Configuration conf) { ++ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); ++ } ++ + private void setupSignalHandlers() { + if (!SystemUtils.IS_OS_WINDOWS) { + HBasePlatformDependent.handle("HUP", (number, name) -> { +@@ -958,7 +969,7 @@ public class HRegionServer extends Thread + } + // Setup RPC client for master communication + this.rpcClient = RpcClientFactory.createClient(conf, clusterId, +- new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), ++ new InetSocketAddress(0), + clusterConnection.getConnectionMetrics(), Collections.emptyMap()); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { +@@ -1528,11 +1539,7 @@ public class HRegionServer extends Thread + + serverLoad.setReportStartTime(reportStartTime); + serverLoad.setReportEndTime(reportEndTime); +- if (this.infoServer != null) { +- serverLoad.setInfoServerPort(this.infoServer.getPort()); +- } else { +- serverLoad.setInfoServerPort(-1); +- } ++ serverLoad.setInfoServerPort(useThisInfoPortInstead); + MetricsUserAggregateSource userSource = + metricsRegionServer.getMetricsUserAggregate().getSource(); + if (userSource != null) { +@@ -1688,7 +1695,7 @@ public class HRegionServer extends Thread + if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) { + String hostnameFromMasterPOV = e.getValue(); + this.serverName = ServerName.valueOf(hostnameFromMasterPOV, +- rpcServices.getSocketAddress().getPort(), this.startcode); ++ useThisPortInstead, this.startcode); + String expectedHostName = rpcServices.getSocketAddress().getHostName(); + // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it + // is set to disable. so we will use the ip of the RegionServer to compare with the +@@ -1814,7 +1821,7 @@ public class HRegionServer extends Thread + + private void createMyEphemeralNode() throws KeeperException { + RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder(); +- rsInfo.setInfoPort(infoServer != null ? infoServer.getPort() : -1); ++ rsInfo.setInfoPort(infoServer != null ? useThisInfoPortInstead : -1); + rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo()); + byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray()); + ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data); +@@ -2481,7 +2488,7 @@ public class HRegionServer extends Thread + LOG.info("Retry starting http info server with port: " + port); + } + } +- port = this.infoServer.getPort(); ++ port = useThisInfoPortInstead; + conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); + int masterInfoPort = + conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); +@@ -3075,12 +3082,11 @@ public class HRegionServer extends Thread + LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa + + ", startcode=" + this.startcode); + long now = EnvironmentEdgeManager.currentTime(); +- int port = rpcServices.isa.getPort(); + RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder(); + if (!StringUtils.isBlank(useThisHostnameInstead)) { + request.setUseThisHostnameInstead(useThisHostnameInstead); + } +- request.setPort(port); ++ request.setPort(useThisPortInstead); + request.setServerStartCode(this.startcode); + request.setServerCurrentTime(now); + result = rss.regionServerStartup(null, request.build()); +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +index b77fcf338a..1f5c9dd21f 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin + int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); +- bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); ++ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); + } else { + String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); + int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); + // Creation of a HSA will force a resolve. + initialIsa = new InetSocketAddress(hostname, port); + bindAddress = +- new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); ++ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); + } + if (initialIsa.getAddress() == null) { + throw new IllegalArgumentException("Failed resolve of " + initialIsa); From ceba85b5433eed409e61bca4666b73ae512723a2 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Mon, 16 Jun 2025 18:13:31 +0200 Subject: [PATCH 11/20] removed dead variable --- ...ding-ipc-bind-port-and-use-alternative-p.patch | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 6b233f916..ffb223ea4 100644 --- a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,16 +1,16 @@ -From 00ec82be6136e55d4d901e28791bc3ce36d726c7 Mon Sep 17 00:00:00 2001 +From f2360ad266a17eb342eb826ae9dad08d3293b580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Fri, 30 May 2025 14:26:26 +0200 Subject: Allow overriding ipc bind port and use alternative port from listener --- - .../apache/hadoop/hbase/master/HMaster.java | 10 +++++-- + .../apache/hadoop/hbase/master/HMaster.java | 11 ++++++-- .../hbase/regionserver/HRegionServer.java | 28 +++++++++++++------ .../hbase/regionserver/RSRpcServices.java | 4 +-- - 3 files changed, 30 insertions(+), 12 deletions(-) + 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 3fe5abac27..be0136193b 100644 +index 3fe5abac27..6d40db77ae 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master; @@ -33,16 +33,17 @@ index 3fe5abac27..be0136193b 100644 private void registerConfigurationObservers() { configurationManager.registerObserver(this.rpcServices); configurationManager.registerObserver(this); -@@ -587,7 +593,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -586,8 +592,7 @@ public class HMaster extends HRegionServer implements MasterServices { + registerConfigurationObservers(); Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { try { - int infoPort = putUpJettyServer(); +- int infoPort = putUpJettyServer(); - startActiveMasterManager(infoPort); + startActiveMasterManager(useThisInfoPortInstead); } catch (Throwable t) { // Make sure we log the exception. String error = "Failed to become Active Master"; -@@ -2991,7 +2997,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -2991,7 +2996,7 @@ public class HMaster extends HRegionServer implements MasterServices { } case MASTER_INFO_PORT: { if (infoServer != null) { From f08e1c56d5ae466a471bef343f988c357a71a220 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:44:46 +0200 Subject: [PATCH 12/20] Update hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Natalie Klestrup Röijezon --- ...-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index ffb223ea4..7115fa90b 100644 --- a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -27,7 +27,8 @@ index 3fe5abac27..6d40db77ae 100644 + @Override + protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); ++ int port = conf.getInt(MASTER_PORT, 0); ++ return port != 0 ? port : this.rpcServices.getSocketAddress().getPort(); + } + private void registerConfigurationObservers() { From d98ac324600309bb5ee7ad6f5f4dbad488add8dc Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:45:00 +0200 Subject: [PATCH 13/20] Update hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Natalie Klestrup Röijezon --- ...5-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 7115fa90b..212a6fc92 100644 --- a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -38,7 +38,7 @@ index 3fe5abac27..6d40db77ae 100644 registerConfigurationObservers(); Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { try { -- int infoPort = putUpJettyServer(); +- putUpJettyServer(); - startActiveMasterManager(infoPort); + startActiveMasterManager(useThisInfoPortInstead); } catch (Throwable t) { From bd0b75e0d7197f723f46aee693396d6bf6affcda Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 25 Jun 2025 11:49:30 +0200 Subject: [PATCH 14/20] review comments: added constants etc. --- CHANGELOG.md | 2 + ...-ipc-bind-port-and-use-alternative-p.patch | 166 ++++++++++++++---- 2 files changed, 135 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2940f6928..c142792b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. `check-permissions-ownership.sh` provided in stackable-base image ([#1029]). - hbase: check for correct permissions and ownerships in /stackable folder via `check-permissions-ownership.sh` provided in stackable-base image ([#1028]). +- hbase: provide patches to implement listener endpoints ([#1159]). - hive: check for correct permissions and ownerships in /stackable folder via `check-permissions-ownership.sh` provided in stackable-base image ([#1040]). - spark-connect-client: A new image for Spark connect tests and demos ([#1034]) @@ -184,6 +185,7 @@ All notable changes to this project will be documented in this file. [#1151]: https://github.com/stackabletech/docker-images/pull/1151 [#1152]: https://github.com/stackabletech/docker-images/pull/1152 [#1156]: https://github.com/stackabletech/docker-images/pull/1156 +[#1159]: https://github.com/stackabletech/docker-images/pull/1159 [#1163]: https://github.com/stackabletech/docker-images/pull/1163 [#1165]: https://github.com/stackabletech/docker-images/pull/1165 diff --git a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 212a6fc92..79a2d3920 100644 --- a/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,27 +1,89 @@ -From f2360ad266a17eb342eb826ae9dad08d3293b580 Mon Sep 17 00:00:00 2001 +From 7014c24f4441278dd366c888fc0c05ce53fe9c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Fri, 30 May 2025 14:26:26 +0200 Subject: Allow overriding ipc bind port and use alternative port from listener --- - .../apache/hadoop/hbase/master/HMaster.java | 11 ++++++-- - .../hbase/regionserver/HRegionServer.java | 28 +++++++++++++------ - .../hbase/regionserver/RSRpcServices.java | 4 +-- - 3 files changed, 30 insertions(+), 13 deletions(-) + .../org/apache/hadoop/hbase/HConstants.java | 21 ++++++++++ + .../apache/hadoop/hbase/master/HMaster.java | 20 +++++++-- + .../hbase/regionserver/HRegionServer.java | 41 +++++++++++++++---- + .../hbase/regionserver/RSRpcServices.java | 8 +++- + 4 files changed, 76 insertions(+), 14 deletions(-) +diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +index 3b2a58827f..1ba1feefcb 100644 +--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java ++++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +@@ -197,6 +197,12 @@ public final class HConstants { + /** Parameter name for port master listens on. */ + public static final String MASTER_PORT = "hbase.master.port"; + ++ /** Parameter name for master IPC address */ ++ public static final String MASTER_IPC_ADDRESS = "hbase.master.ipc.address"; ++ ++ /** Parameter name for master IPC port */ ++ public static final String MASTER_IPC_PORT = "hbase.master.ipc.port"; ++ + /** default port that the master listens on */ + public static final int DEFAULT_MASTER_PORT = 16000; + +@@ -206,6 +212,9 @@ public final class HConstants { + /** Configuration key for master web API port */ + public static final String MASTER_INFO_PORT = "hbase.master.info.port"; + ++ /** Configuration key for bound master web API port */ ++ public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port"; ++ + /** Configuration key for the list of master host:ports **/ + public static final String MASTER_ADDRS_KEY = "hbase.masters"; + +@@ -316,6 +325,12 @@ public final class HConstants { + /** Parameter name for port region server listens on. */ + public static final String REGIONSERVER_PORT = "hbase.regionserver.port"; + ++ /** Parameter name for master IPC address */ ++ public static final String REGIONSERVER_IPC_ADDRESS = "hbase.regionserver.ipc.address"; ++ ++ /** Parameter name for master IPC port */ ++ public static final String REGIONSERVER_IPC_PORT = "hbase.regionserver.ipc.port"; ++ + /** Default port region server listens on. */ + public static final int DEFAULT_REGIONSERVER_PORT = 16020; + +@@ -325,6 +340,9 @@ public final class HConstants { + /** A configuration key for regionserver info port */ + public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port"; + ++ /** A configuration key for bound regionserver hbase info port */ ++ public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port"; ++ + /** A flag that enables automatic selection of regionserver info port */ + public static final String REGIONSERVER_INFO_PORT_AUTO = REGIONSERVER_INFO_PORT + ".auto"; + +@@ -1392,6 +1410,9 @@ public final class HConstants { + /** Configuration key for setting RPC codec class name */ + public static final String RPC_CODEC_CONF_KEY = "hbase.client.rpc.codec"; + ++ /** Configuration key for setting that the RPC client should specify the host */ ++ public static final String RPC_CLIENT_SPECIFY_HOST = "hbase.rpc.client.specify.host"; ++ + /** Configuration key for setting replication codec class name */ + public static final String REPLICATION_CODEC_CONF_KEY = "hbase.replication.rpc.codec"; + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 3fe5abac27..6d40db77ae 100644 +index 3fe5abac27..2f323518da 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master; +@@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.master; import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; ++import static org.apache.hadoop.hbase.HConstants.MASTER_BOUND_INFO_PORT; +import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; import static org.apache.hadoop.hbase.master.cleaner.HFileCleaner.CUSTOM_POOL_SIZE; import static org.apache.hadoop.hbase.util.DNS.MASTER_HOSTNAME_KEY; -@@ -559,6 +560,11 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -559,6 +561,18 @@ public class HMaster extends HRegionServer implements MasterServices { return conf.get(MASTER_HOSTNAME_KEY); } @@ -30,21 +92,28 @@ index 3fe5abac27..6d40db77ae 100644 + int port = conf.getInt(MASTER_PORT, 0); + return port != 0 ? port : this.rpcServices.getSocketAddress().getPort(); + } ++ ++ @Override ++ protected int getUseThisInfoPortInstead(Configuration conf) { ++ int port = conf.getInt(MASTER_BOUND_INFO_PORT, 0); ++ return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; ++ } + private void registerConfigurationObservers() { configurationManager.registerObserver(this.rpcServices); configurationManager.registerObserver(this); -@@ -586,8 +592,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -586,8 +600,8 @@ public class HMaster extends HRegionServer implements MasterServices { registerConfigurationObservers(); Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { try { -- putUpJettyServer(); +- int infoPort = putUpJettyServer(); - startActiveMasterManager(infoPort); ++ putUpJettyServer(); + startActiveMasterManager(useThisInfoPortInstead); } catch (Throwable t) { // Make sure we log the exception. String error = "Failed to become Active Master"; -@@ -2991,7 +2996,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -2991,7 +3005,7 @@ public class HMaster extends HRegionServer implements MasterServices { } case MASTER_INFO_PORT: { if (infoServer != null) { @@ -54,18 +123,20 @@ index 3fe5abac27..6d40db77ae 100644 break; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..80949070fd 100644 +index 27bcef2f06..ff8b3b05f6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL +@@ -24,6 +24,9 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT; +import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; ++import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_SPECIFY_HOST; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; -@@ -505,6 +506,10 @@ public class HRegionServer extends Thread +@@ -505,6 +508,10 @@ public class HRegionServer extends Thread */ protected String useThisHostnameInstead; @@ -76,16 +147,16 @@ index 27bcef2f06..80949070fd 100644 /** * @deprecated since 2.4.0 and will be removed in 4.0.0. Use * {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead. -@@ -669,6 +674,8 @@ public class HRegionServer extends Thread +@@ -669,6 +676,8 @@ public class HRegionServer extends Thread this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); rpcServices = createRpcServices(); useThisHostnameInstead = getUseThisHostnameInstead(conf); + useThisPortInstead = getUseThisPortInstead(conf); -+ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); ++ useThisInfoPortInstead = getUseThisInfoPortInstead(conf); //conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); // if use-ip is enabled, we will use ip to expose Master/RS service for client, // see HBASE-27304 for details. -@@ -678,7 +685,7 @@ public class HRegionServer extends Thread +@@ -678,7 +687,7 @@ public class HRegionServer extends Thread useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); String hostName = StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; @@ -94,7 +165,7 @@ index 27bcef2f06..80949070fd 100644 rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, -@@ -715,7 +722,7 @@ public class HRegionServer extends Thread +@@ -715,7 +724,7 @@ public class HRegionServer extends Thread // Some unit tests don't need a cluster, so no zookeeper at all // Open connection to zookeeper and set primary watcher @@ -103,36 +174,54 @@ index 27bcef2f06..80949070fd 100644 canCreateBaseZNode()); // If no master in cluster, skip trying to track one or look for a cluster status. if (!this.masterless) { -@@ -776,6 +783,10 @@ public class HRegionServer extends Thread +@@ -776,6 +785,16 @@ public class HRegionServer extends Thread } } + protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); ++ int port = conf.getInt(REGIONSERVER_PORT, 0); ++ return port != 0 ? port : this.rpcServices.isa.getPort(); ++ } ++ ++ protected int getUseThisInfoPortInstead(Configuration conf) { ++ int port = conf.getInt(REGIONSERVER_BOUND_INFO_PORT, 0); ++ return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + private void setupSignalHandlers() { if (!SystemUtils.IS_OS_WINDOWS) { HBasePlatformDependent.handle("HUP", (number, name) -> { -@@ -958,7 +969,7 @@ public class HRegionServer extends Thread +@@ -957,8 +976,7 @@ public class HRegionServer extends Thread + bootstrapNodeManager = new BootstrapNodeManager(clusterConnection, masterAddressTracker); } // Setup RPC client for master communication - this.rpcClient = RpcClientFactory.createClient(conf, clusterId, +- this.rpcClient = RpcClientFactory.createClient(conf, clusterId, - new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), -+ new InetSocketAddress(0), ++ this.rpcClient = RpcClientFactory.createClient(conf, clusterId, getInetSocketAddress(this.conf), clusterConnection.getConnectionMetrics(), Collections.emptyMap()); span.setStatus(StatusCode.OK); } catch (Throwable t) { -@@ -1533,6 +1544,8 @@ public class HRegionServer extends Thread +@@ -972,6 +990,11 @@ public class HRegionServer extends Thread + } + } + ++ private InetSocketAddress getInetSocketAddress(Configuration conf) { ++ return conf.getBoolean(RPC_CLIENT_SPECIFY_HOST, false) ? ++ new InetSocketAddress(this.rpcServices.isa.getAddress(), 0) : new InetSocketAddress(0); ++ } ++ + /** + * Bring up connection to zk ensemble and then wait until a master for this cluster and then after + * that, wait until cluster 'up' flag has been set. This is the order in which master does things. +@@ -1533,6 +1556,7 @@ public class HRegionServer extends Thread } else { serverLoad.setInfoServerPort(-1); } -+ // serverLoad.setInfoServerPort(Integer.parseInt(System.getenv("HBASE_INFO_PORT"))); + serverLoad.setInfoServerPort(useThisInfoPortInstead); MetricsUserAggregateSource userSource = metricsRegionServer.getMetricsUserAggregate().getSource(); if (userSource != null) { -@@ -1688,7 +1701,7 @@ public class HRegionServer extends Thread +@@ -1688,7 +1712,7 @@ public class HRegionServer extends Thread if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) { String hostnameFromMasterPOV = e.getValue(); this.serverName = ServerName.valueOf(hostnameFromMasterPOV, @@ -141,7 +230,7 @@ index 27bcef2f06..80949070fd 100644 String expectedHostName = rpcServices.getSocketAddress().getHostName(); // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it // is set to disable. so we will use the ip of the RegionServer to compare with the -@@ -1814,7 +1827,7 @@ public class HRegionServer extends Thread +@@ -1814,7 +1838,7 @@ public class HRegionServer extends Thread private void createMyEphemeralNode() throws KeeperException { RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder(); @@ -150,7 +239,7 @@ index 27bcef2f06..80949070fd 100644 rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo()); byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray()); ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data); -@@ -2479,7 +2492,7 @@ public class HRegionServer extends Thread +@@ -2479,7 +2503,7 @@ public class HRegionServer extends Thread LOG.info("Retry starting http info server with port: " + port); } } @@ -159,7 +248,7 @@ index 27bcef2f06..80949070fd 100644 conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); int masterInfoPort = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); -@@ -3073,12 +3086,11 @@ public class HRegionServer extends Thread +@@ -3073,12 +3097,11 @@ public class HRegionServer extends Thread LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa + ", startcode=" + this.startcode); long now = EnvironmentEdgeManager.currentTime(); @@ -174,15 +263,26 @@ index 27bcef2f06..80949070fd 100644 request.setServerCurrentTime(now); result = rss.regionServerStartup(null, request.build()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -index b77fcf338a..1f5c9dd21f 100644 +index b77fcf338a..a86cd273ff 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin +@@ -280,6 +280,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescr + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor; + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor; + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor; ++import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_ADDRESS; ++import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_PORT; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_ADDRESS; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_PORT; + + /** + * Implements the regionserver RPC services. +@@ -1270,14 +1274,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); // Creation of a HSA will force a resolve. initialIsa = new InetSocketAddress(hostname, port); - bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); -+ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); ++ bindAddress = new InetSocketAddress(conf.get(MASTER_IPC_ADDRESS, hostname), conf.getInt(MASTER_IPC_PORT, port)); } else { String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); @@ -190,7 +290,7 @@ index b77fcf338a..1f5c9dd21f 100644 initialIsa = new InetSocketAddress(hostname, port); bindAddress = - new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); -+ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); ++ new InetSocketAddress(conf.get(REGIONSERVER_IPC_ADDRESS, hostname), conf.getInt(REGIONSERVER_IPC_PORT, port)); } if (initialIsa.getAddress() == null) { throw new IllegalArgumentException("Failed resolve of " + initialIsa); From de0c6c7caafff09b6573621645e5e15db84bb0b4 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 25 Jun 2025 13:15:11 +0200 Subject: [PATCH 15/20] set RPC_CLIENT_SPECIFY_HOST to true by default --- ...low-overriding-ipc-bind-port-and-use-alternative-p.patch | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 79a2d3920..0495a5584 100644 --- a/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,4 +1,4 @@ -From 7014c24f4441278dd366c888fc0c05ce53fe9c06 Mon Sep 17 00:00:00 2001 +From af804478fc88fdd354611ef2e0374c83874fa685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Fri, 30 May 2025 14:26:26 +0200 Subject: Allow overriding ipc bind port and use alternative port from listener @@ -123,7 +123,7 @@ index 3fe5abac27..2f323518da 100644 break; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..ff8b3b05f6 100644 +index 27bcef2f06..3c180f6cd6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -24,6 +24,9 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL @@ -206,7 +206,7 @@ index 27bcef2f06..ff8b3b05f6 100644 } + private InetSocketAddress getInetSocketAddress(Configuration conf) { -+ return conf.getBoolean(RPC_CLIENT_SPECIFY_HOST, false) ? ++ return conf.getBoolean(RPC_CLIENT_SPECIFY_HOST, true) ? + new InetSocketAddress(this.rpcServices.isa.getAddress(), 0) : new InetSocketAddress(0); + } + From 496444d2e95ad5c484d8cfb533491015367b9cf1 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 25 Jun 2025 13:38:29 +0200 Subject: [PATCH 16/20] corrected constant descriptions --- ...-ipc-bind-port-and-use-alternative-p.patch | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 0495a5584..76ef0961b 100644 --- a/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,60 +1,74 @@ -From af804478fc88fdd354611ef2e0374c83874fa685 Mon Sep 17 00:00:00 2001 +From e84ed39191101b7dac7a6970afafc00dcec0f135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Fri, 30 May 2025 14:26:26 +0200 Subject: Allow overriding ipc bind port and use alternative port from listener --- - .../org/apache/hadoop/hbase/HConstants.java | 21 ++++++++++ + .../org/apache/hadoop/hbase/HConstants.java | 29 +++++++++++-- .../apache/hadoop/hbase/master/HMaster.java | 20 +++++++-- .../hbase/regionserver/HRegionServer.java | 41 +++++++++++++++---- .../hbase/regionserver/RSRpcServices.java | 8 +++- - 4 files changed, 76 insertions(+), 14 deletions(-) + 4 files changed, 80 insertions(+), 18 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java -index 3b2a58827f..1ba1feefcb 100644 +index 3b2a58827f..ea96ff8fce 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java -@@ -197,6 +197,12 @@ public final class HConstants { - /** Parameter name for port master listens on. */ +@@ -194,18 +194,27 @@ public final class HConstants { + /** default host address */ + public static final String DEFAULT_HOST = "0.0.0.0"; + +- /** Parameter name for port master listens on. */ ++ /** Parameter name for port master advertises as listening on. */ public static final String MASTER_PORT = "hbase.master.port"; -+ /** Parameter name for master IPC address */ ++ /** Parameter name for IPC address that master listens on. (Defaults to hostname.) */ + public static final String MASTER_IPC_ADDRESS = "hbase.master.ipc.address"; + -+ /** Parameter name for master IPC port */ ++ /** Parameter name for IPC port that master listens on. (Defaults to MASTER_PORT.) */ + public static final String MASTER_IPC_PORT = "hbase.master.ipc.port"; + /** default port that the master listens on */ public static final int DEFAULT_MASTER_PORT = 16000; -@@ -206,6 +212,9 @@ public final class HConstants { - /** Configuration key for master web API port */ + /** default port for master web api */ + public static final int DEFAULT_MASTER_INFOPORT = 16010; + +- /** Configuration key for master web API port */ ++ /** Configuration key for advertised master web API port */ public static final String MASTER_INFO_PORT = "hbase.master.info.port"; -+ /** Configuration key for bound master web API port */ ++ /** Configuration key for bound master web API port. (Defaults to MASTER_INFO_PORT.) */ + public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port"; + /** Configuration key for the list of master host:ports **/ public static final String MASTER_ADDRS_KEY = "hbase.masters"; -@@ -316,6 +325,12 @@ public final class HConstants { - /** Parameter name for port region server listens on. */ +@@ -313,18 +322,27 @@ public final class HConstants { + /** Default value for ZooKeeper session timeout */ + public static final int DEFAULT_ZK_SESSION_TIMEOUT = 90 * 1000; + +- /** Parameter name for port region server listens on. */ ++ /** Parameter name for port region server advertises as listening on. */ public static final String REGIONSERVER_PORT = "hbase.regionserver.port"; -+ /** Parameter name for master IPC address */ ++ /** Parameter name for IPC address that region server listens on. (Defaults to hostname.) */ + public static final String REGIONSERVER_IPC_ADDRESS = "hbase.regionserver.ipc.address"; + -+ /** Parameter name for master IPC port */ ++ /** Parameter name for IPC port that region server listens on. (Defaults to REGIONSERVER_PORT.) */ + public static final String REGIONSERVER_IPC_PORT = "hbase.regionserver.ipc.port"; + /** Default port region server listens on. */ public static final int DEFAULT_REGIONSERVER_PORT = 16020; -@@ -325,6 +340,9 @@ public final class HConstants { - /** A configuration key for regionserver info port */ + /** default port for region server web api */ + public static final int DEFAULT_REGIONSERVER_INFOPORT = 16030; + +- /** A configuration key for regionserver info port */ ++ /** Configuration key for advertised region server web API port */ public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port"; -+ /** A configuration key for bound regionserver hbase info port */ ++ /** Configuration key for bound region server web API port. (Defaults to REGIONSERVER_INFO_PORT.) */ + public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port"; + /** A flag that enables automatic selection of regionserver info port */ @@ -64,8 +78,8 @@ index 3b2a58827f..1ba1feefcb 100644 /** Configuration key for setting RPC codec class name */ public static final String RPC_CODEC_CONF_KEY = "hbase.client.rpc.codec"; -+ /** Configuration key for setting that the RPC client should specify the host */ -+ public static final String RPC_CLIENT_SPECIFY_HOST = "hbase.rpc.client.specify.host"; ++ /** Configuration key for setting that the RPC client should bind the client address. This forces outgoing RPC traffic to happen from the same network interface that the RPC server is bound on. */ ++ public static final String RPC_CLIENT_BIND_ADDRESS = "hbase.client.rpc.bind.address"; + /** Configuration key for setting replication codec class name */ public static final String REPLICATION_CODEC_CONF_KEY = "hbase.replication.rpc.codec"; @@ -123,7 +137,7 @@ index 3fe5abac27..2f323518da 100644 break; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 27bcef2f06..3c180f6cd6 100644 +index 27bcef2f06..11bd1e58b5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -24,6 +24,9 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL @@ -132,7 +146,7 @@ index 27bcef2f06..3c180f6cd6 100644 import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; +import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT; +import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; -+import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_SPECIFY_HOST; ++import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_BIND_ADDRESS; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; @@ -152,7 +166,7 @@ index 27bcef2f06..3c180f6cd6 100644 rpcServices = createRpcServices(); useThisHostnameInstead = getUseThisHostnameInstead(conf); + useThisPortInstead = getUseThisPortInstead(conf); -+ useThisInfoPortInstead = getUseThisInfoPortInstead(conf); //conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); ++ useThisInfoPortInstead = getUseThisInfoPortInstead(conf); // if use-ip is enabled, we will use ip to expose Master/RS service for client, // see HBASE-27304 for details. @@ -206,7 +220,7 @@ index 27bcef2f06..3c180f6cd6 100644 } + private InetSocketAddress getInetSocketAddress(Configuration conf) { -+ return conf.getBoolean(RPC_CLIENT_SPECIFY_HOST, true) ? ++ return conf.getBoolean(RPC_CLIENT_BIND_ADDRESS, true) ? + new InetSocketAddress(this.rpcServices.isa.getAddress(), 0) : new InetSocketAddress(0); + } + From 3fa6301f52c3d2d76e4da13a3948704d20bce752 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Wed, 25 Jun 2025 15:41:41 +0200 Subject: [PATCH 17/20] updated 2.6.2 patch --- ...-ipc-bind-port-and-use-alternative-p.patch | 177 +++++++++++++++--- 1 file changed, 146 insertions(+), 31 deletions(-) diff --git a/hbase/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch b/hbase/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch index 5c05a682e..7f9dc023e 100644 --- a/hbase/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch +++ b/hbase/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -1,49 +1,133 @@ -From 13bfb4c7799553ecd33f42d9f1da7338c64fa911 Mon Sep 17 00:00:00 2001 +From d8b2c245ad1ee6f79060875cc76049e97f7b459b Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Mon, 16 Jun 2025 14:44:32 +0200 Subject: Allow overriding ipc bind port and use alternative port from listener --- - .../apache/hadoop/hbase/master/HMaster.java | 11 +++++-- - .../hbase/regionserver/HRegionServer.java | 32 +++++++++++-------- - .../hbase/regionserver/RSRpcServices.java | 4 +-- - 3 files changed, 29 insertions(+), 18 deletions(-) + .../org/apache/hadoop/hbase/HConstants.java | 29 ++++++++++-- + .../apache/hadoop/hbase/master/HMaster.java | 20 +++++++-- + .../hbase/regionserver/HRegionServer.java | 45 +++++++++++++------ + .../hbase/regionserver/RSRpcServices.java | 8 +++- + 4 files changed, 80 insertions(+), 22 deletions(-) +diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +index 12f8bc6df0..4d892755d2 100644 +--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java ++++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +@@ -194,18 +194,27 @@ public final class HConstants { + /** default host address */ + public static final String DEFAULT_HOST = "0.0.0.0"; + +- /** Parameter name for port master listens on. */ ++ /** Parameter name for port master advertises as listening on. */ + public static final String MASTER_PORT = "hbase.master.port"; + ++ /** Parameter name for IPC address that master listens on. (Defaults to hostname.) */ ++ public static final String MASTER_IPC_ADDRESS = "hbase.master.ipc.address"; ++ ++ /** Parameter name for IPC port that master listens on. (Defaults to MASTER_PORT.) */ ++ public static final String MASTER_IPC_PORT = "hbase.master.ipc.port"; ++ + /** default port that the master listens on */ + public static final int DEFAULT_MASTER_PORT = 16000; + + /** default port for master web api */ + public static final int DEFAULT_MASTER_INFOPORT = 16010; + +- /** Configuration key for master web API port */ ++ /** Configuration key for advertised master web API port */ + public static final String MASTER_INFO_PORT = "hbase.master.info.port"; + ++ /** Configuration key for bound master web API port. (Defaults to MASTER_INFO_PORT.) */ ++ public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port"; ++ + /** Configuration key for the list of master host:ports **/ + public static final String MASTER_ADDRS_KEY = "hbase.masters"; + +@@ -313,18 +322,27 @@ public final class HConstants { + /** Default value for ZooKeeper session timeout */ + public static final int DEFAULT_ZK_SESSION_TIMEOUT = 90 * 1000; + +- /** Parameter name for port region server listens on. */ ++ /** Parameter name for port region server advertises as listening on. */ + public static final String REGIONSERVER_PORT = "hbase.regionserver.port"; + ++ /** Parameter name for IPC address that region server listens on. (Defaults to hostname.) */ ++ public static final String REGIONSERVER_IPC_ADDRESS = "hbase.regionserver.ipc.address"; ++ ++ /** Parameter name for IPC port that region server listens on. (Defaults to REGIONSERVER_PORT.) */ ++ public static final String REGIONSERVER_IPC_PORT = "hbase.regionserver.ipc.port"; ++ + /** Default port region server listens on. */ + public static final int DEFAULT_REGIONSERVER_PORT = 16020; + + /** default port for region server web api */ + public static final int DEFAULT_REGIONSERVER_INFOPORT = 16030; + +- /** A configuration key for regionserver info port */ ++ /** Configuration key for advertised region server web API port */ + public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port"; + ++ /** Configuration key for bound region server web API port. (Defaults to REGIONSERVER_INFO_PORT.) */ ++ public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port"; ++ + /** A flag that enables automatic selection of regionserver info port */ + public static final String REGIONSERVER_INFO_PORT_AUTO = REGIONSERVER_INFO_PORT + ".auto"; + +@@ -1397,6 +1415,9 @@ public final class HConstants { + /** Configuration key for setting RPC codec class name */ + public static final String RPC_CODEC_CONF_KEY = "hbase.client.rpc.codec"; + ++ /** Configuration key for setting that the RPC client should bind the client address. This forces outgoing RPC traffic to happen from the same network interface that the RPC server is bound on. */ ++ public static final String RPC_CLIENT_BIND_ADDRESS = "hbase.client.rpc.bind.address"; ++ + /** Configuration key for setting replication codec class name */ + public static final String REPLICATION_CODEC_CONF_KEY = "hbase.replication.rpc.codec"; + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -index 9cafbb7cbf..8847ddaba0 100644 +index 9cafbb7cbf..313124d1d0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java -@@ -17,6 +17,7 @@ +@@ -17,6 +17,8 @@ */ package org.apache.hadoop.hbase.master; ++import static org.apache.hadoop.hbase.HConstants.MASTER_BOUND_INFO_PORT; +import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; -@@ -570,6 +571,11 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -570,6 +572,18 @@ public class HMaster extends HRegionServer implements MasterServices { return conf.get(MASTER_HOSTNAME_KEY); } + @Override + protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort()); ++ int port = conf.getInt(MASTER_PORT, 0); ++ return port != 0 ? port : this.rpcServices.getSocketAddress().getPort(); ++ } ++ ++ @Override ++ protected int getUseThisInfoPortInstead(Configuration conf) { ++ int port = conf.getInt(MASTER_BOUND_INFO_PORT, 0); ++ return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + private void registerConfigurationObservers() { configurationManager.registerObserver(this.rpcServices); configurationManager.registerObserver(this); -@@ -597,8 +603,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -597,8 +611,8 @@ public class HMaster extends HRegionServer implements MasterServices { registerConfigurationObservers(); Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> { try { - int infoPort = putUpJettyServer(); - startActiveMasterManager(infoPort); ++ putUpJettyServer(); + startActiveMasterManager(useThisInfoPortInstead); } catch (Throwable t) { // Make sure we log the exception. String error = "Failed to become Active Master"; -@@ -3006,7 +3011,7 @@ public class HMaster extends HRegionServer implements MasterServices { +@@ -3006,7 +3020,7 @@ public class HMaster extends HRegionServer implements MasterServices { } case MASTER_INFO_PORT: { if (infoServer != null) { @@ -53,18 +137,20 @@ index 9cafbb7cbf..8847ddaba0 100644 break; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 351b4fef19..5237f47fd4 100644 +index 351b4fef19..68f56ab796 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -@@ -24,6 +24,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL +@@ -24,6 +24,9 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT; +import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; ++import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_BIND_ADDRESS; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY; import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT; -@@ -505,6 +506,10 @@ public class HRegionServer extends Thread +@@ -505,6 +508,10 @@ public class HRegionServer extends Thread */ protected String useThisHostnameInstead; @@ -75,16 +161,16 @@ index 351b4fef19..5237f47fd4 100644 /** * @deprecated since 2.4.0 and will be removed in 4.0.0. Use * {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead. -@@ -669,6 +674,8 @@ public class HRegionServer extends Thread +@@ -669,6 +676,8 @@ public class HRegionServer extends Thread this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); rpcServices = createRpcServices(); useThisHostnameInstead = getUseThisHostnameInstead(conf); + useThisPortInstead = getUseThisPortInstead(conf); -+ useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1); ++ useThisInfoPortInstead = getUseThisInfoPortInstead(conf); // if use-ip is enabled, we will use ip to expose Master/RS service for client, // see HBASE-27304 for details. -@@ -678,7 +685,7 @@ public class HRegionServer extends Thread +@@ -678,7 +687,7 @@ public class HRegionServer extends Thread useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName(); String hostName = StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead; @@ -93,7 +179,7 @@ index 351b4fef19..5237f47fd4 100644 rpcControllerFactory = RpcControllerFactory.instantiate(this.conf); rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf, -@@ -715,7 +722,7 @@ public class HRegionServer extends Thread +@@ -715,7 +724,7 @@ public class HRegionServer extends Thread // Some unit tests don't need a cluster, so no zookeeper at all // Open connection to zookeeper and set primary watcher @@ -102,27 +188,45 @@ index 351b4fef19..5237f47fd4 100644 canCreateBaseZNode()); // If no master in cluster, skip trying to track one or look for a cluster status. if (!this.masterless) { -@@ -776,6 +783,10 @@ public class HRegionServer extends Thread +@@ -776,6 +785,16 @@ public class HRegionServer extends Thread } } + protected int getUseThisPortInstead(Configuration conf) { -+ return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort()); ++ int port = conf.getInt(REGIONSERVER_PORT, 0); ++ return port != 0 ? port : this.rpcServices.isa.getPort(); ++ } ++ ++ protected int getUseThisInfoPortInstead(Configuration conf) { ++ int port = conf.getInt(REGIONSERVER_BOUND_INFO_PORT, 0); ++ return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + private void setupSignalHandlers() { if (!SystemUtils.IS_OS_WINDOWS) { HBasePlatformDependent.handle("HUP", (number, name) -> { -@@ -958,7 +969,7 @@ public class HRegionServer extends Thread +@@ -958,7 +977,7 @@ public class HRegionServer extends Thread } // Setup RPC client for master communication this.rpcClient = RpcClientFactory.createClient(conf, clusterId, - new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), -+ new InetSocketAddress(0), ++ getInetSocketAddress(this.conf), clusterConnection.getConnectionMetrics(), Collections.emptyMap()); span.setStatus(StatusCode.OK); } catch (Throwable t) { -@@ -1528,11 +1539,7 @@ public class HRegionServer extends Thread +@@ -972,6 +991,11 @@ public class HRegionServer extends Thread + } + } + ++ private InetSocketAddress getInetSocketAddress(Configuration conf) { ++ return conf.getBoolean(RPC_CLIENT_BIND_ADDRESS, true) ? ++ new InetSocketAddress(this.rpcServices.isa.getAddress(), 0) : new InetSocketAddress(0); ++ } ++ + /** + * Bring up connection to zk ensemble and then wait until a master for this cluster and then after + * that, wait until cluster 'up' flag has been set. This is the order in which master does things. +@@ -1528,11 +1552,7 @@ public class HRegionServer extends Thread serverLoad.setReportStartTime(reportStartTime); serverLoad.setReportEndTime(reportEndTime); @@ -135,7 +239,7 @@ index 351b4fef19..5237f47fd4 100644 MetricsUserAggregateSource userSource = metricsRegionServer.getMetricsUserAggregate().getSource(); if (userSource != null) { -@@ -1688,7 +1695,7 @@ public class HRegionServer extends Thread +@@ -1688,7 +1708,7 @@ public class HRegionServer extends Thread if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) { String hostnameFromMasterPOV = e.getValue(); this.serverName = ServerName.valueOf(hostnameFromMasterPOV, @@ -144,7 +248,7 @@ index 351b4fef19..5237f47fd4 100644 String expectedHostName = rpcServices.getSocketAddress().getHostName(); // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it // is set to disable. so we will use the ip of the RegionServer to compare with the -@@ -1814,7 +1821,7 @@ public class HRegionServer extends Thread +@@ -1814,7 +1834,7 @@ public class HRegionServer extends Thread private void createMyEphemeralNode() throws KeeperException { RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder(); @@ -153,7 +257,7 @@ index 351b4fef19..5237f47fd4 100644 rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo()); byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray()); ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data); -@@ -2481,7 +2488,7 @@ public class HRegionServer extends Thread +@@ -2481,7 +2501,7 @@ public class HRegionServer extends Thread LOG.info("Retry starting http info server with port: " + port); } } @@ -162,7 +266,7 @@ index 351b4fef19..5237f47fd4 100644 conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); int masterInfoPort = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); -@@ -3075,12 +3082,11 @@ public class HRegionServer extends Thread +@@ -3075,12 +3095,11 @@ public class HRegionServer extends Thread LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa + ", startcode=" + this.startcode); long now = EnvironmentEdgeManager.currentTime(); @@ -177,15 +281,26 @@ index 351b4fef19..5237f47fd4 100644 request.setServerCurrentTime(now); result = rss.regionServerStartup(null, request.build()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -index b77fcf338a..1f5c9dd21f 100644 +index b77fcf338a..a86cd273ff 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java -@@ -1270,14 +1270,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin +@@ -280,6 +280,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescr + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor; + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor; + import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor; ++import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_ADDRESS; ++import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_PORT; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_ADDRESS; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_PORT; + + /** + * Implements the regionserver RPC services. +@@ -1270,14 +1274,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT); // Creation of a HSA will force a resolve. initialIsa = new InetSocketAddress(hostname, port); - bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port); -+ bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), conf.getInt("hbase.master.ipc.port", port)); ++ bindAddress = new InetSocketAddress(conf.get(MASTER_IPC_ADDRESS, hostname), conf.getInt(MASTER_IPC_PORT, port)); } else { String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER); int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); @@ -193,7 +308,7 @@ index b77fcf338a..1f5c9dd21f 100644 initialIsa = new InetSocketAddress(hostname, port); bindAddress = - new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port); -+ new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), conf.getInt("hbase.regionserver.ipc.port", port)); ++ new InetSocketAddress(conf.get(REGIONSERVER_IPC_ADDRESS, hostname), conf.getInt(REGIONSERVER_IPC_PORT, port)); } if (initialIsa.getAddress() == null) { throw new IllegalArgumentException("Failed resolve of " + initialIsa); From ee7ea2e053ef239e0f228b7c52184426a8d31a3b Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 26 Jun 2025 16:15:37 +0200 Subject: [PATCH 18/20] patch 2.6.1 to reverse bound/advertised properties --- ...pdate-property-usage-for-bound-ports.patch | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch diff --git a/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch b/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch new file mode 100644 index 000000000..c52eb2cea --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch @@ -0,0 +1,174 @@ +From 635aa32bc6fefaefb90d754dcc4ccd67e4cdfa24 Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Thu, 26 Jun 2025 14:59:01 +0200 +Subject: Update property usage for bound ports + +--- + .../org/apache/hadoop/hbase/HConstants.java | 4 ++-- + .../hadoop/hbase/LocalHBaseCluster.java | 12 ++++++------ + .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- + .../hbase/regionserver/HRegionServer.java | 19 +++++++++++++------ + .../util/ProcessBasedLocalHBaseCluster.java | 4 ++-- + 5 files changed, 26 insertions(+), 19 deletions(-) + +diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +index ea96ff8fce..054beb10d3 100644 +--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java ++++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +@@ -212,7 +212,7 @@ public final class HConstants { + /** Configuration key for advertised master web API port */ + public static final String MASTER_INFO_PORT = "hbase.master.info.port"; + +- /** Configuration key for bound master web API port. (Defaults to MASTER_INFO_PORT.) */ ++ /** Configuration key for bound master web API port */ + public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port"; + + /** Configuration key for the list of master host:ports **/ +@@ -340,7 +340,7 @@ public final class HConstants { + /** Configuration key for advertised region server web API port */ + public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port"; + +- /** Configuration key for bound region server web API port. (Defaults to REGIONSERVER_INFO_PORT.) */ ++ /** Configuration key for bound region server web API port */ + public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port"; + + /** A flag that enables automatic selection of regionserver info port */ +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java +index 816ef997cb..2114725986 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java +@@ -144,20 +144,20 @@ public class LocalHBaseCluster { + // treat info ports special; expressly don't change '-1' (keep off) + // in case we make that the default behavior. + if ( +- conf.getInt(HConstants.REGIONSERVER_INFO_PORT, 0) != -1 +- && conf.getInt(HConstants.REGIONSERVER_INFO_PORT, ++ conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, 0) != -1 ++ && conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, + HConstants.DEFAULT_REGIONSERVER_INFOPORT) == HConstants.DEFAULT_REGIONSERVER_INFOPORT + ) { + LOG.debug("Setting RS InfoServer Port to random."); +- conf.set(HConstants.REGIONSERVER_INFO_PORT, "0"); ++ conf.set(HConstants.REGIONSERVER_BOUND_INFO_PORT, "0"); + } + if ( +- conf.getInt(HConstants.MASTER_INFO_PORT, 0) != -1 +- && conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT) ++ conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, 0) != -1 ++ && conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT) + == HConstants.DEFAULT_MASTER_INFOPORT + ) { + LOG.debug("Setting Master InfoServer Port to random."); +- conf.set(HConstants.MASTER_INFO_PORT, "0"); ++ conf.set(HConstants.MASTER_BOUND_INFO_PORT, "0"); + } + } + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 2f323518da..37cd7b3afd 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -20,7 +20,7 @@ package org.apache.hadoop.hbase.master; + import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; +-import static org.apache.hadoop.hbase.HConstants.MASTER_BOUND_INFO_PORT; ++import static org.apache.hadoop.hbase.HConstants.MASTER_INFO_PORT; + import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; + import static org.apache.hadoop.hbase.master.cleaner.HFileCleaner.CUSTOM_POOL_SIZE; + import static org.apache.hadoop.hbase.util.DNS.MASTER_HOSTNAME_KEY; +@@ -569,7 +569,7 @@ public class HMaster extends HRegionServer implements MasterServices { + + @Override + protected int getUseThisInfoPortInstead(Configuration conf) { +- int port = conf.getInt(MASTER_BOUND_INFO_PORT, 0); ++ int port = conf.getInt(MASTER_INFO_PORT, 0); + return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + +@@ -3143,7 +3143,7 @@ public class HMaster extends HRegionServer implements MasterServices { + public int getRegionServerInfoPort(final ServerName sn) { + int port = this.serverManager.getInfoPort(sn); + return port == 0 +- ? conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) ++ ? conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) + : port; + } + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 11bd1e58b5..abeeab3552 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -25,6 +25,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHOR + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_INFO_PORT; + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; + import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_BIND_ADDRESS; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; +@@ -791,7 +792,7 @@ public class HRegionServer extends Thread + } + + protected int getUseThisInfoPortInstead(Configuration conf) { +- int port = conf.getInt(REGIONSERVER_BOUND_INFO_PORT, 0); ++ int port = conf.getInt(REGIONSERVER_INFO_PORT, 0); + return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + +@@ -2463,11 +2464,11 @@ public class HRegionServer extends Thread + */ + private void putUpWebUI() throws IOException { + int port = +- this.conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); ++ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); + String addr = this.conf.get("hbase.regionserver.info.bindAddress", "0.0.0.0"); + + if (this instanceof HMaster) { +- port = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); ++ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); + addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0"); + } + // -1 is for disabling info server +@@ -2503,12 +2504,18 @@ public class HRegionServer extends Thread + LOG.info("Retry starting http info server with port: " + port); + } + } +- port = useThisInfoPortInstead; +- conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); ++ ++ // update bound ports ++ port = this.infoServer.getPort(); ++ conf.setInt(REGIONSERVER_BOUND_INFO_PORT, port); ++ conf.setInt(HConstants.MASTER_BOUND_INFO_PORT, port); ++ ++ // set advertised ports ++ conf.setInt(REGIONSERVER_INFO_PORT, useThisInfoPortInstead); + int masterInfoPort = + conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); + conf.setInt("hbase.master.info.port.orig", masterInfoPort); +- conf.setInt(HConstants.MASTER_INFO_PORT, port); ++ conf.setInt(HConstants.MASTER_INFO_PORT, useThisInfoPortInstead); + } + + /* +diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java +index 21c49e61ba..2dd85ab764 100644 +--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java ++++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java +@@ -370,13 +370,13 @@ public class ProcessBasedLocalHBaseCluster { + + int masterInfoPort = HBaseTestingUtility.randomFreePort(); + reportWebUIPort("master", masterInfoPort); +- confMap.put(HConstants.MASTER_INFO_PORT, masterInfoPort); ++ confMap.put(HConstants.MASTER_BOUND_INFO_PORT, masterInfoPort); + } else if (serverType == ServerType.RS) { + confMap.put(HConstants.REGIONSERVER_PORT, rpcPort); + + int rsInfoPort = HBaseTestingUtility.randomFreePort(); + reportWebUIPort("region server", rsInfoPort); +- confMap.put(HConstants.REGIONSERVER_INFO_PORT, rsInfoPort); ++ confMap.put(HConstants.REGIONSERVER_BOUND_INFO_PORT, rsInfoPort); + } else { + confMap.put(HConstants.ZOOKEEPER_DATA_DIR, daemonDir); + } From 7a4340e4379091ac600b23c1eda5634e6204fa78 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Fri, 27 Jun 2025 08:43:22 +0200 Subject: [PATCH 19/20] property re-working for 2.6.2 --- ...pdate-property-usage-for-bound-ports.patch | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch diff --git a/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch b/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch new file mode 100644 index 000000000..2a4679426 --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch @@ -0,0 +1,175 @@ +From af07f7d502fcd6a5566b7cb327dd7a154054a9fc Mon Sep 17 00:00:00 2001 +From: Andrew Kenworthy +Date: Thu, 26 Jun 2025 16:58:47 +0200 +Subject: Update property usage for bound ports + +--- + .../org/apache/hadoop/hbase/HConstants.java | 4 ++-- + .../hadoop/hbase/LocalHBaseCluster.java | 12 ++++++------ + .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- + .../hbase/regionserver/HRegionServer.java | 19 +++++++++++++------ + .../util/ProcessBasedLocalHBaseCluster.java | 4 ++-- + 5 files changed, 26 insertions(+), 19 deletions(-) + +diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +index 4d892755d2..3f852e7acc 100644 +--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java ++++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +@@ -212,7 +212,7 @@ public final class HConstants { + /** Configuration key for advertised master web API port */ + public static final String MASTER_INFO_PORT = "hbase.master.info.port"; + +- /** Configuration key for bound master web API port. (Defaults to MASTER_INFO_PORT.) */ ++ /** Configuration key for bound master web API port */ + public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port"; + + /** Configuration key for the list of master host:ports **/ +@@ -340,7 +340,7 @@ public final class HConstants { + /** Configuration key for advertised region server web API port */ + public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port"; + +- /** Configuration key for bound region server web API port. (Defaults to REGIONSERVER_INFO_PORT.) */ ++ /** Configuration key for bound region server web API port */ + public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port"; + + /** A flag that enables automatic selection of regionserver info port */ +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java +index 816ef997cb..2114725986 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/LocalHBaseCluster.java +@@ -144,20 +144,20 @@ public class LocalHBaseCluster { + // treat info ports special; expressly don't change '-1' (keep off) + // in case we make that the default behavior. + if ( +- conf.getInt(HConstants.REGIONSERVER_INFO_PORT, 0) != -1 +- && conf.getInt(HConstants.REGIONSERVER_INFO_PORT, ++ conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, 0) != -1 ++ && conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, + HConstants.DEFAULT_REGIONSERVER_INFOPORT) == HConstants.DEFAULT_REGIONSERVER_INFOPORT + ) { + LOG.debug("Setting RS InfoServer Port to random."); +- conf.set(HConstants.REGIONSERVER_INFO_PORT, "0"); ++ conf.set(HConstants.REGIONSERVER_BOUND_INFO_PORT, "0"); + } + if ( +- conf.getInt(HConstants.MASTER_INFO_PORT, 0) != -1 +- && conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT) ++ conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, 0) != -1 ++ && conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT) + == HConstants.DEFAULT_MASTER_INFOPORT + ) { + LOG.debug("Setting Master InfoServer Port to random."); +- conf.set(HConstants.MASTER_INFO_PORT, "0"); ++ conf.set(HConstants.MASTER_BOUND_INFO_PORT, "0"); + } + } + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +index 313124d1d0..00e01c116e 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +@@ -17,7 +17,7 @@ + */ + package org.apache.hadoop.hbase.master; + +-import static org.apache.hadoop.hbase.HConstants.MASTER_BOUND_INFO_PORT; ++import static org.apache.hadoop.hbase.HConstants.MASTER_INFO_PORT; + import static org.apache.hadoop.hbase.HConstants.MASTER_PORT; + import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; +@@ -580,7 +580,7 @@ public class HMaster extends HRegionServer implements MasterServices { + + @Override + protected int getUseThisInfoPortInstead(Configuration conf) { +- int port = conf.getInt(MASTER_BOUND_INFO_PORT, 0); ++ int port = conf.getInt(MASTER_INFO_PORT, 0); + return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + +@@ -3158,7 +3158,7 @@ public class HMaster extends HRegionServer implements MasterServices { + public int getRegionServerInfoPort(final ServerName sn) { + int port = this.serverManager.getInfoPort(sn); + return port == 0 +- ? conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) ++ ? conf.getInt(HConstants.REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT) + : port; + } + +diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +index 68f56ab796..3d1d2d3a5c 100644 +--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ++++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +@@ -25,6 +25,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHOR + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK; + import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER; + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT; ++import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_INFO_PORT; + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT; + import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_BIND_ADDRESS; + import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT; +@@ -791,7 +792,7 @@ public class HRegionServer extends Thread + } + + protected int getUseThisInfoPortInstead(Configuration conf) { +- int port = conf.getInt(REGIONSERVER_BOUND_INFO_PORT, 0); ++ int port = conf.getInt(REGIONSERVER_INFO_PORT, 0); + return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; + } + +@@ -2459,12 +2460,12 @@ public class HRegionServer extends Thread + */ + private void putUpWebUI() throws IOException { + int port = +- this.conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); ++ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); + String addr = this.conf.get("hbase.regionserver.info.bindAddress", "0.0.0.0"); + + boolean isMaster = false; + if (this instanceof HMaster) { +- port = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); ++ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); + addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0"); + isMaster = true; + } +@@ -2501,12 +2502,18 @@ public class HRegionServer extends Thread + LOG.info("Retry starting http info server with port: " + port); + } + } +- port = useThisInfoPortInstead; +- conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port); ++ ++ // update bound ports ++ port = this.infoServer.getPort(); ++ conf.setInt(REGIONSERVER_BOUND_INFO_PORT, port); ++ conf.setInt(HConstants.MASTER_BOUND_INFO_PORT, port); ++ ++ // set advertised ports ++ conf.setInt(REGIONSERVER_INFO_PORT, useThisInfoPortInstead); + int masterInfoPort = + conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); + conf.setInt("hbase.master.info.port.orig", masterInfoPort); +- conf.setInt(HConstants.MASTER_INFO_PORT, port); ++ conf.setInt(HConstants.MASTER_INFO_PORT, useThisInfoPortInstead); + } + + /* +diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java +index 21c49e61ba..2dd85ab764 100644 +--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java ++++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java +@@ -370,13 +370,13 @@ public class ProcessBasedLocalHBaseCluster { + + int masterInfoPort = HBaseTestingUtility.randomFreePort(); + reportWebUIPort("master", masterInfoPort); +- confMap.put(HConstants.MASTER_INFO_PORT, masterInfoPort); ++ confMap.put(HConstants.MASTER_BOUND_INFO_PORT, masterInfoPort); + } else if (serverType == ServerType.RS) { + confMap.put(HConstants.REGIONSERVER_PORT, rpcPort); + + int rsInfoPort = HBaseTestingUtility.randomFreePort(); + reportWebUIPort("region server", rsInfoPort); +- confMap.put(HConstants.REGIONSERVER_INFO_PORT, rsInfoPort); ++ confMap.put(HConstants.REGIONSERVER_BOUND_INFO_PORT, rsInfoPort); + } else { + confMap.put(HConstants.ZOOKEEPER_DATA_DIR, daemonDir); + } From 65aaae27820f8838651e5234b6b14cbcda149484 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Fri, 27 Jun 2025 15:32:48 +0200 Subject: [PATCH 20/20] provide advertised port as a fallback, removed changes to test class --- ...pdate-property-usage-for-bound-ports.patch | 41 +++++-------------- ...pdate-property-usage-for-bound-ports.patch | 41 +++++-------------- 2 files changed, 22 insertions(+), 60 deletions(-) diff --git a/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch b/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch index c52eb2cea..2b6c3d582 100644 --- a/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch +++ b/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch @@ -1,15 +1,14 @@ -From 635aa32bc6fefaefb90d754dcc4ccd67e4cdfa24 Mon Sep 17 00:00:00 2001 +From 5cc38b12c2bfc5fa3850e13e3eb87086d5f1737a Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 26 Jun 2025 14:59:01 +0200 Subject: Update property usage for bound ports --- .../org/apache/hadoop/hbase/HConstants.java | 4 ++-- - .../hadoop/hbase/LocalHBaseCluster.java | 12 ++++++------ + .../hadoop/hbase/LocalHBaseCluster.java | 12 +++++------ .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- - .../hbase/regionserver/HRegionServer.java | 19 +++++++++++++------ - .../util/ProcessBasedLocalHBaseCluster.java | 4 ++-- - 5 files changed, 26 insertions(+), 19 deletions(-) + .../hbase/regionserver/HRegionServer.java | 21 +++++++++++++------ + 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java index ea96ff8fce..054beb10d3 100644 @@ -96,7 +95,7 @@ index 2f323518da..37cd7b3afd 100644 } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 11bd1e58b5..abeeab3552 100644 +index 11bd1e58b5..358ce486f1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -25,6 +25,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHOR @@ -116,21 +115,23 @@ index 11bd1e58b5..abeeab3552 100644 return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; } -@@ -2463,11 +2464,11 @@ public class HRegionServer extends Thread +@@ -2463,11 +2464,13 @@ public class HRegionServer extends Thread */ private void putUpWebUI() throws IOException { int port = - this.conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); -+ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); ++ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, ++ this.conf.getInt(REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT)); String addr = this.conf.get("hbase.regionserver.info.bindAddress", "0.0.0.0"); if (this instanceof HMaster) { - port = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); -+ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); ++ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, ++ this.conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT)); addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0"); } // -1 is for disabling info server -@@ -2503,12 +2504,18 @@ public class HRegionServer extends Thread +@@ -2503,12 +2506,18 @@ public class HRegionServer extends Thread LOG.info("Retry starting http info server with port: " + port); } } @@ -152,23 +153,3 @@ index 11bd1e58b5..abeeab3552 100644 } /* -diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -index 21c49e61ba..2dd85ab764 100644 ---- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -@@ -370,13 +370,13 @@ public class ProcessBasedLocalHBaseCluster { - - int masterInfoPort = HBaseTestingUtility.randomFreePort(); - reportWebUIPort("master", masterInfoPort); -- confMap.put(HConstants.MASTER_INFO_PORT, masterInfoPort); -+ confMap.put(HConstants.MASTER_BOUND_INFO_PORT, masterInfoPort); - } else if (serverType == ServerType.RS) { - confMap.put(HConstants.REGIONSERVER_PORT, rpcPort); - - int rsInfoPort = HBaseTestingUtility.randomFreePort(); - reportWebUIPort("region server", rsInfoPort); -- confMap.put(HConstants.REGIONSERVER_INFO_PORT, rsInfoPort); -+ confMap.put(HConstants.REGIONSERVER_BOUND_INFO_PORT, rsInfoPort); - } else { - confMap.put(HConstants.ZOOKEEPER_DATA_DIR, daemonDir); - } diff --git a/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch b/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch index 2a4679426..9a5cfae42 100644 --- a/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch +++ b/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch @@ -1,15 +1,14 @@ -From af07f7d502fcd6a5566b7cb327dd7a154054a9fc Mon Sep 17 00:00:00 2001 +From a36c936d8132bad255bb2be40e4b1dde2a44f478 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Thu, 26 Jun 2025 16:58:47 +0200 Subject: Update property usage for bound ports --- .../org/apache/hadoop/hbase/HConstants.java | 4 ++-- - .../hadoop/hbase/LocalHBaseCluster.java | 12 ++++++------ + .../hadoop/hbase/LocalHBaseCluster.java | 12 +++++------ .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- - .../hbase/regionserver/HRegionServer.java | 19 +++++++++++++------ - .../util/ProcessBasedLocalHBaseCluster.java | 4 ++-- - 5 files changed, 26 insertions(+), 19 deletions(-) + .../hbase/regionserver/HRegionServer.java | 21 +++++++++++++------ + 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java index 4d892755d2..3f852e7acc 100644 @@ -96,7 +95,7 @@ index 313124d1d0..00e01c116e 100644 } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java -index 68f56ab796..3d1d2d3a5c 100644 +index 68f56ab796..b610d11651 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -25,6 +25,7 @@ import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHOR @@ -116,22 +115,24 @@ index 68f56ab796..3d1d2d3a5c 100644 return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1; } -@@ -2459,12 +2460,12 @@ public class HRegionServer extends Thread +@@ -2459,12 +2460,14 @@ public class HRegionServer extends Thread */ private void putUpWebUI() throws IOException { int port = - this.conf.getInt(HConstants.REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); -+ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT); ++ this.conf.getInt(REGIONSERVER_BOUND_INFO_PORT, ++ this.conf.getInt(REGIONSERVER_INFO_PORT, HConstants.DEFAULT_REGIONSERVER_INFOPORT)); String addr = this.conf.get("hbase.regionserver.info.bindAddress", "0.0.0.0"); boolean isMaster = false; if (this instanceof HMaster) { - port = conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); -+ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT); ++ port = conf.getInt(HConstants.MASTER_BOUND_INFO_PORT, ++ this.conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT)); addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0"); isMaster = true; } -@@ -2501,12 +2502,18 @@ public class HRegionServer extends Thread +@@ -2501,12 +2504,18 @@ public class HRegionServer extends Thread LOG.info("Retry starting http info server with port: " + port); } } @@ -153,23 +154,3 @@ index 68f56ab796..3d1d2d3a5c 100644 } /* -diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -index 21c49e61ba..2dd85ab764 100644 ---- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java -@@ -370,13 +370,13 @@ public class ProcessBasedLocalHBaseCluster { - - int masterInfoPort = HBaseTestingUtility.randomFreePort(); - reportWebUIPort("master", masterInfoPort); -- confMap.put(HConstants.MASTER_INFO_PORT, masterInfoPort); -+ confMap.put(HConstants.MASTER_BOUND_INFO_PORT, masterInfoPort); - } else if (serverType == ServerType.RS) { - confMap.put(HConstants.REGIONSERVER_PORT, rpcPort); - - int rsInfoPort = HBaseTestingUtility.randomFreePort(); - reportWebUIPort("region server", rsInfoPort); -- confMap.put(HConstants.REGIONSERVER_INFO_PORT, rsInfoPort); -+ confMap.put(HConstants.REGIONSERVER_BOUND_INFO_PORT, rsInfoPort); - } else { - confMap.put(HConstants.ZOOKEEPER_DATA_DIR, daemonDir); - }