diff --git a/CHANGELOG.md b/CHANGELOG.md index b4f3a43be..c2aae7659 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]) @@ -198,6 +199,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 [#1168]: https://github.com/stackabletech/docker-images/pull/1168 diff --git a/hbase/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/hbase/stackable/bin/hbase-entrypoint.sh index 3b5192016..04a9cc16f 100755 --- a/hbase/hbase/stackable/bin/hbase-entrypoint.sh +++ b/hbase/hbase/stackable/bin/hbase-entrypoint.sh @@ -11,15 +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="$3" +# ui-http or ui-https +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 @@ -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,16 @@ 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_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" + +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 /stackable/containerdebug --output="${STACKABLE_LOG_DIR}/containerdebug-state.json" --loop & 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 new file mode 100644 index 000000000..76ef0961b --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.1/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -0,0 +1,310 @@ +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 | 29 +++++++++++-- + .../apache/hadoop/hbase/master/HMaster.java | 20 +++++++-- + .../hbase/regionserver/HRegionServer.java | 41 +++++++++++++++---- + .../hbase/regionserver/RSRpcServices.java | 8 +++- + 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..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 +@@ -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"; + +@@ -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 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 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,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 +561,18 @@ public class HMaster extends HRegionServer implements MasterServices { + return conf.get(MASTER_HOSTNAME_KEY); + } + ++ @Override ++ protected int getUseThisPortInstead(Configuration conf) { ++ 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 +600,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"; +@@ -2991,7 +3005,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..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 + 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 +508,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 +676,8 @@ public class HRegionServer extends Thread + this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); + rpcServices = createRpcServices(); + useThisHostnameInstead = getUseThisHostnameInstead(conf); ++ useThisPortInstead = getUseThisPortInstead(conf); ++ 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 +687,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 +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 +- 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 +785,16 @@ public class HRegionServer extends Thread + } + } + ++ protected int getUseThisPortInstead(Configuration conf) { ++ 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) -> { +@@ -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, +- new InetSocketAddress(this.rpcServices.isa.getAddress(), 0), ++ this.rpcClient = RpcClientFactory.createClient(conf, clusterId, getInetSocketAddress(this.conf), + clusterConnection.getConnectionMetrics(), Collections.emptyMap()); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { +@@ -972,6 +990,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. +@@ -1533,6 +1556,7 @@ public class HRegionServer extends Thread + } else { + serverLoad.setInfoServerPort(-1); + } ++ serverLoad.setInfoServerPort(useThisInfoPortInstead); + MetricsUserAggregateSource userSource = + metricsRegionServer.getMetricsUserAggregate().getSource(); + if (userSource != null) { +@@ -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, +- 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 +1838,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 +2503,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); +@@ -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(); +- 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..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 +@@ -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(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); + // 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(REGIONSERVER_IPC_ADDRESS, hostname), conf.getInt(REGIONSERVER_IPC_PORT, port)); + } + if (initialIsa.getAddress() == null) { + throw new IllegalArgumentException("Failed resolve of " + initialIsa); 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..2b6c3d582 --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.1/0006-Update-property-usage-for-bound-ports.patch @@ -0,0 +1,155 @@ +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 +++++------ + .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- + .../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 +--- 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..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 + 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,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, ++ 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, ++ 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 +2506,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/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 new file mode 100644 index 000000000..7f9dc023e --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.2/0005-Allow-overriding-ipc-bind-port-and-use-alternative-p.patch @@ -0,0 +1,314 @@ +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 + +--- + .../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..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,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 +572,18 @@ public class HMaster extends HRegionServer implements MasterServices { + return conf.get(MASTER_HOSTNAME_KEY); + } + ++ @Override ++ protected int getUseThisPortInstead(Configuration conf) { ++ 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 +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 +3020,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..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,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 +508,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 +676,8 @@ public class HRegionServer extends Thread + this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf); + rpcServices = createRpcServices(); + useThisHostnameInstead = getUseThisHostnameInstead(conf); ++ useThisPortInstead = getUseThisPortInstead(conf); ++ 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 +687,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 +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 +- 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 +785,16 @@ public class HRegionServer extends Thread + } + } + ++ protected int getUseThisPortInstead(Configuration conf) { ++ 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 +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), ++ getInetSocketAddress(this.conf), + clusterConnection.getConnectionMetrics(), Collections.emptyMap()); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { +@@ -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); +- 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 +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, +- 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 +1834,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 +2501,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 +3095,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..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 +@@ -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(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); + // 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(REGIONSERVER_IPC_ADDRESS, hostname), conf.getInt(REGIONSERVER_IPC_PORT, port)); + } + if (initialIsa.getAddress() == null) { + throw new IllegalArgumentException("Failed resolve of " + initialIsa); 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..9a5cfae42 --- /dev/null +++ b/hbase/hbase/stackable/patches/2.6.2/0006-Update-property-usage-for-bound-ports.patch @@ -0,0 +1,156 @@ +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 +++++------ + .../apache/hadoop/hbase/master/HMaster.java | 6 +++--- + .../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 +--- 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..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 + 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,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, ++ 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, ++ 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 +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); + } + + /*