1- From 13bfb4c7799553ecd33f42d9f1da7338c64fa911  Mon Sep 17 00:00:00 2001
1+ From d8b2c245ad1ee6f79060875cc76049e97f7b459b  Mon Sep 17 00:00:00 2001
22From: Andrew Kenworthy <
[email protected] >
33Date: Mon, 16 Jun 2025 14:44:32 +0200
44Subject: Allow overriding ipc bind port and use alternative port from listener
55
66--- 
7-  .../apache/hadoop/hbase/master/HMaster.java   | 11 +++++--
8-  .../hbase/regionserver/HRegionServer.java     | 32 +++++++++++--------
9-  .../hbase/regionserver/RSRpcServices.java     |  4 +--
10-  3 files changed, 29 insertions(+), 18 deletions(-)
7+  .../org/apache/hadoop/hbase/HConstants.java   | 29 ++++++++++--
8+  .../apache/hadoop/hbase/master/HMaster.java   | 20 +++++++--
9+  .../hbase/regionserver/HRegionServer.java     | 45 +++++++++++++------
10+  .../hbase/regionserver/RSRpcServices.java     |  8 +++-
11+  4 files changed, 80 insertions(+), 22 deletions(-)
1112
13+ 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 
14+ index 12f8bc6df0..4d892755d2 100644
15+ --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java 
16+ +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java 
17+ @@ -194,18 +194,27 @@  public final class HConstants {
18+    /** default host address */
19+    public static final String DEFAULT_HOST = "0.0.0.0";
20+  
21+ -   /** Parameter name for port master listens on. */
22+ +   /** Parameter name for port master advertises as listening on. */
23+    public static final String MASTER_PORT = "hbase.master.port";
24+  
25+ +   /** Parameter name for IPC address that master listens on. (Defaults to hostname.) */
26+ +   public static final String MASTER_IPC_ADDRESS = "hbase.master.ipc.address";
27+ + 
28+ +   /** Parameter name for IPC port that master listens on. (Defaults to MASTER_PORT.) */
29+ +   public static final String MASTER_IPC_PORT = "hbase.master.ipc.port";
30+ + 
31+    /** default port that the master listens on */
32+    public static final int DEFAULT_MASTER_PORT = 16000;
33+  
34+    /** default port for master web api */
35+    public static final int DEFAULT_MASTER_INFOPORT = 16010;
36+  
37+ -   /** Configuration key for master web API port */
38+ +   /** Configuration key for advertised master web API port */
39+    public static final String MASTER_INFO_PORT = "hbase.master.info.port";
40+  
41+ +   /** Configuration key for bound master web API port. (Defaults to MASTER_INFO_PORT.) */
42+ +   public static final String MASTER_BOUND_INFO_PORT = "hbase.master.bound.info.port";
43+ + 
44+    /** Configuration key for the list of master host:ports **/
45+    public static final String MASTER_ADDRS_KEY = "hbase.masters";
46+  
47+ @@ -313,18 +322,27 @@  public final class HConstants {
48+    /** Default value for ZooKeeper session timeout */
49+    public static final int DEFAULT_ZK_SESSION_TIMEOUT = 90 * 1000;
50+  
51+ -   /** Parameter name for port region server listens on. */
52+ +   /** Parameter name for port region server advertises as listening on. */
53+    public static final String REGIONSERVER_PORT = "hbase.regionserver.port";
54+  
55+ +   /** Parameter name for IPC address that region server listens on. (Defaults to hostname.) */
56+ +   public static final String REGIONSERVER_IPC_ADDRESS = "hbase.regionserver.ipc.address";
57+ + 
58+ +   /** Parameter name for IPC port that region server listens on. (Defaults to REGIONSERVER_PORT.) */
59+ +   public static final String REGIONSERVER_IPC_PORT = "hbase.regionserver.ipc.port";
60+ + 
61+    /** Default port region server listens on. */
62+    public static final int DEFAULT_REGIONSERVER_PORT = 16020;
63+  
64+    /** default port for region server web api */
65+    public static final int DEFAULT_REGIONSERVER_INFOPORT = 16030;
66+  
67+ -   /** A configuration key for regionserver info port */
68+ +   /** Configuration key for advertised region server web API port */
69+    public static final String REGIONSERVER_INFO_PORT = "hbase.regionserver.info.port";
70+  
71+ +   /** Configuration key for bound region server web API port. (Defaults to REGIONSERVER_INFO_PORT.) */
72+ +   public static final String REGIONSERVER_BOUND_INFO_PORT = "hbase.regionserver.bound.info.port";
73+ + 
74+    /** A flag that enables automatic selection of regionserver info port */
75+    public static final String REGIONSERVER_INFO_PORT_AUTO = REGIONSERVER_INFO_PORT + ".auto";
76+  
77+ @@ -1397,6 +1415,9 @@  public final class HConstants {
78+    /** Configuration key for setting RPC codec class name */
79+    public static final String RPC_CODEC_CONF_KEY = "hbase.client.rpc.codec";
80+  
81+ +   /** 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. */
82+ +   public static final String RPC_CLIENT_BIND_ADDRESS = "hbase.client.rpc.bind.address";
83+ + 
84+    /** Configuration key for setting replication codec class name */
85+    public static final String REPLICATION_CODEC_CONF_KEY = "hbase.replication.rpc.codec";
86+  
1287diff --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 
13- index 9cafbb7cbf..8847ddaba0  100644
88+ index 9cafbb7cbf..313124d1d0  100644
1489--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java 
1590+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java 
16- @@ -17,6 +17,7  @@ 
91+ @@ -17,6 +17,8  @@ 
1792  */
1893 package org.apache.hadoop.hbase.master;
1994
95+ + import static org.apache.hadoop.hbase.HConstants.MASTER_BOUND_INFO_PORT;
2096+ import static org.apache.hadoop.hbase.HConstants.MASTER_PORT;
2197 import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK;
2298 import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS;
2399 import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK;
24- @@ -570,6 +571,11  @@  public class HMaster extends HRegionServer implements MasterServices {
100+ @@ -570,6 +572,18  @@  public class HMaster extends HRegionServer implements MasterServices {
25101     return conf.get(MASTER_HOSTNAME_KEY);
26102   }
27103
28104+   @Override
29105+   protected int getUseThisPortInstead(Configuration conf) {
30- +     return conf.getInt(MASTER_PORT, this.rpcServices.getSocketAddress().getPort());
106+ +     int port = conf.getInt(MASTER_PORT, 0);
107+ +     return port != 0 ? port : this.rpcServices.getSocketAddress().getPort();
108+ +   }
109+ + 
110+ +   @Override
111+ +   protected int getUseThisInfoPortInstead(Configuration conf) {
112+ +         int port = conf.getInt(MASTER_BOUND_INFO_PORT, 0);
113+ +         return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1;
31114+   }
32115+ 
33116   private void registerConfigurationObservers() {
34117     configurationManager.registerObserver(this.rpcServices);
35118     configurationManager.registerObserver(this);
36- @@ -597,8 +603,7  @@  public class HMaster extends HRegionServer implements MasterServices {
119+ @@ -597,8 +611,8  @@  public class HMaster extends HRegionServer implements MasterServices {
37120       registerConfigurationObservers();
38121       Threads.setDaemonThreadRunning(new Thread(() -> TraceUtil.trace(() -> {
39122         try {
40123-           int infoPort = putUpJettyServer();
41124-           startActiveMasterManager(infoPort);
125+ +           putUpJettyServer();
42126+           startActiveMasterManager(useThisInfoPortInstead);
43127         } catch (Throwable t) {
44128           // Make sure we log the exception.
45129           String error = "Failed to become Active Master";
46- @@ -3006,7 +3011 ,7 @@  public class HMaster extends HRegionServer implements MasterServices {
130+ @@ -3006,7 +3020 ,7 @@  public class HMaster extends HRegionServer implements MasterServices {
47131         }
48132         case MASTER_INFO_PORT: {
49133           if (infoServer != null) {
@@ -53,18 +137,20 @@ index 9cafbb7cbf..8847ddaba0 100644
53137           break;
54138         }
55139diff --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 
56- index 351b4fef19..5237f47fd4  100644
140+ index 351b4fef19..68f56ab796  100644
57141--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 
58142+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 
59- @@ -24,6 +24,7  @@  import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL
143+ @@ -24,6 +24,9  @@  import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPL
60144 import static org.apache.hadoop.hbase.HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_CHORE_DURATION;
61145 import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK;
62146 import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER;
147+ + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_BOUND_INFO_PORT;
63148+ import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_PORT;
149+ + import static org.apache.hadoop.hbase.HConstants.RPC_CLIENT_BIND_ADDRESS;
64150 import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_DEFAULT;
65151 import static org.apache.hadoop.hbase.master.waleventtracker.WALEventTrackerTableCreator.WAL_EVENT_TRACKER_ENABLED_KEY;
66152 import static org.apache.hadoop.hbase.namequeues.NamedQueueServiceChore.NAMED_QUEUE_CHORE_DURATION_DEFAULT;
67- @@ -505,6 +506 ,10 @@  public class HRegionServer extends Thread
153+ @@ -505,6 +508 ,10 @@  public class HRegionServer extends Thread
68154    */
69155   protected String useThisHostnameInstead;
70156
@@ -75,16 +161,16 @@ index 351b4fef19..5237f47fd4 100644
75161   /**
76162    * @deprecated since 2.4.0 and will be removed in 4.0.0. Use
77163    *             {@link HRegionServer#UNSAFE_RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY} instead.
78- @@ -669,6 +674 ,8 @@  public class HRegionServer extends Thread
164+ @@ -669,6 +676 ,8 @@  public class HRegionServer extends Thread
79165       this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf);
80166       rpcServices = createRpcServices();
81167       useThisHostnameInstead = getUseThisHostnameInstead(conf);
82168+       useThisPortInstead = getUseThisPortInstead(conf);
83- +       useThisInfoPortInstead = conf.getInt("hbase.info.port" , this.infoServer != null ? this.infoServer.getPort() : -1 );
169+ +       useThisInfoPortInstead = getUseThisInfoPortInstead(conf );
84170
85171       // if use-ip is enabled, we will use ip to expose Master/RS service for client,
86172       // see HBASE-27304 for details.
87- @@ -678,7 +685 ,7 @@  public class HRegionServer extends Thread
173+ @@ -678,7 +687 ,7 @@  public class HRegionServer extends Thread
88174         useIp ? rpcServices.isa.getAddress().getHostAddress() : rpcServices.isa.getHostName();
89175       String hostName =
90176         StringUtils.isBlank(useThisHostnameInstead) ? isaHostName : useThisHostnameInstead;
@@ -93,7 +179,7 @@ index 351b4fef19..5237f47fd4 100644
93179
94180       rpcControllerFactory = RpcControllerFactory.instantiate(this.conf);
95181       rpcRetryingCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf,
96- @@ -715,7 +722 ,7 @@  public class HRegionServer extends Thread
182+ @@ -715,7 +724 ,7 @@  public class HRegionServer extends Thread
97183
98184       // Some unit tests don't need a cluster, so no zookeeper at all
99185       // Open connection to zookeeper and set primary watcher
@@ -102,27 +188,45 @@ index 351b4fef19..5237f47fd4 100644
102188         canCreateBaseZNode());
103189       // If no master in cluster, skip trying to track one or look for a cluster status.
104190       if (!this.masterless) {
105- @@ -776,6 +783,10  @@  public class HRegionServer extends Thread
191+ @@ -776,6 +785,16  @@  public class HRegionServer extends Thread
106192     }
107193   }
108194
109195+   protected int getUseThisPortInstead(Configuration conf) {
110- +     return conf.getInt(REGIONSERVER_PORT, this.rpcServices.isa.getPort());
196+ +     int port = conf.getInt(REGIONSERVER_PORT, 0);
197+ +     return port != 0 ? port : this.rpcServices.isa.getPort();
198+ +   }
199+ + 
200+ +   protected int getUseThisInfoPortInstead(Configuration conf) {
201+ +     int port = conf.getInt(REGIONSERVER_BOUND_INFO_PORT, 0);
202+ +     return port != 0 ? port : this.infoServer != null ? this.infoServer.getPort() : -1;
111203+   }
112204+ 
113205   private void setupSignalHandlers() {
114206     if (!SystemUtils.IS_OS_WINDOWS) {
115207       HBasePlatformDependent.handle("HUP", (number, name) -> {
116- @@ -958,7 +969 ,7 @@  public class HRegionServer extends Thread
208+ @@ -958,7 +977 ,7 @@  public class HRegionServer extends Thread
117209       }
118210       // Setup RPC client for master communication
119211       this.rpcClient = RpcClientFactory.createClient(conf, clusterId,
120212-         new InetSocketAddress(this.rpcServices.isa.getAddress(), 0),
121- +         new InetSocketAddress(0 ),
213+ +         getInetSocketAddress(this.conf ),
122214         clusterConnection.getConnectionMetrics(), Collections.emptyMap());
123215       span.setStatus(StatusCode.OK);
124216     } catch (Throwable t) {
125- @@ -1528,11 +1539,7 @@  public class HRegionServer extends Thread
217+ @@ -972,6 +991,11 @@  public class HRegionServer extends Thread
218+      }
219+    }
220+  
221+ +   private InetSocketAddress getInetSocketAddress(Configuration conf) {
222+ +     return conf.getBoolean(RPC_CLIENT_BIND_ADDRESS, true) ?
223+ +       new InetSocketAddress(this.rpcServices.isa.getAddress(), 0) : new InetSocketAddress(0);
224+ +   }
225+ + 
226+    /**
227+     * Bring up connection to zk ensemble and then wait until a master for this cluster and then after
228+     * that, wait until cluster 'up' flag has been set. This is the order in which master does things.
229+ @@ -1528,11 +1552,7 @@  public class HRegionServer extends Thread
126230
127231     serverLoad.setReportStartTime(reportStartTime);
128232     serverLoad.setReportEndTime(reportEndTime);
@@ -135,7 +239,7 @@ index 351b4fef19..5237f47fd4 100644
135239     MetricsUserAggregateSource userSource =
136240       metricsRegionServer.getMetricsUserAggregate().getSource();
137241     if (userSource != null) {
138- @@ -1688,7 +1695 ,7 @@  public class HRegionServer extends Thread
242+ @@ -1688,7 +1708 ,7 @@  public class HRegionServer extends Thread
139243         if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {
140244           String hostnameFromMasterPOV = e.getValue();
141245           this.serverName = ServerName.valueOf(hostnameFromMasterPOV,
@@ -144,7 +248,7 @@ index 351b4fef19..5237f47fd4 100644
144248           String expectedHostName = rpcServices.getSocketAddress().getHostName();
145249           // if Master use-ip is enabled, RegionServer use-ip will be enabled by default even if it
146250           // is set to disable. so we will use the ip of the RegionServer to compare with the
147- @@ -1814,7 +1821 ,7 @@  public class HRegionServer extends Thread
251+ @@ -1814,7 +1834 ,7 @@  public class HRegionServer extends Thread
148252
149253   private void createMyEphemeralNode() throws KeeperException {
150254     RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder();
@@ -153,7 +257,7 @@ index 351b4fef19..5237f47fd4 100644
153257     rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo());
154258     byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray());
155259     ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data);
156- @@ -2481,7 +2488 ,7 @@  public class HRegionServer extends Thread
260+ @@ -2481,7 +2501 ,7 @@  public class HRegionServer extends Thread
157261         LOG.info("Retry starting http info server with port: " + port);
158262       }
159263     }
@@ -162,7 +266,7 @@ index 351b4fef19..5237f47fd4 100644
162266     conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port);
163267     int masterInfoPort =
164268       conf.getInt(HConstants.MASTER_INFO_PORT, HConstants.DEFAULT_MASTER_INFOPORT);
165- @@ -3075,12 +3082 ,11 @@  public class HRegionServer extends Thread
269+ @@ -3075,12 +3095 ,11 @@  public class HRegionServer extends Thread
166270       LOG.info("reportForDuty to master=" + masterServerName + " with isa=" + rpcServices.isa
167271         + ", startcode=" + this.startcode);
168272       long now = EnvironmentEdgeManager.currentTime();
@@ -177,23 +281,34 @@ index 351b4fef19..5237f47fd4 100644
177281       request.setServerCurrentTime(now);
178282       result = rss.regionServerStartup(null, request.build());
179283diff --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 
180- index b77fcf338a..1f5c9dd21f  100644
284+ index b77fcf338a..a86cd273ff  100644
181285--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java 
182286+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java 
183- @@ -1270,14 +1270,14 @@  public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin
287+ @@ -280,6 +280,10 @@  import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescr
288+  import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor;
289+  import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor;
290+  import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor;
291+ + import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_ADDRESS;
292+ + import static org.apache.hadoop.hbase.HConstants.MASTER_IPC_PORT;
293+ + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_ADDRESS;
294+ + import static org.apache.hadoop.hbase.HConstants.REGIONSERVER_IPC_PORT;
295+  
296+  /**
297+   * Implements the regionserver RPC services.
298+ @@ -1270,14 +1274,14 @@  public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin
184299       int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT);
185300       // Creation of a HSA will force a resolve.
186301       initialIsa = new InetSocketAddress(hostname, port);
187302-       bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address", hostname), port);
188- +       bindAddress = new InetSocketAddress(conf.get("hbase.master.ipc.address" , hostname), conf.getInt("hbase.master.ipc.port" , port));
303+ +       bindAddress = new InetSocketAddress(conf.get(MASTER_IPC_ADDRESS , hostname), conf.getInt(MASTER_IPC_PORT , port));
189304     } else {
190305       String hostname = DNS.getHostname(conf, DNS.ServerType.REGIONSERVER);
191306       int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT);
192307       // Creation of a HSA will force a resolve.
193308       initialIsa = new InetSocketAddress(hostname, port);
194309       bindAddress =
195310-         new InetSocketAddress(conf.get("hbase.regionserver.ipc.address", hostname), port);
196- +         new InetSocketAddress(conf.get("hbase.regionserver.ipc.address" , hostname), conf.getInt("hbase.regionserver.ipc.port" , port));
311+ +         new InetSocketAddress(conf.get(REGIONSERVER_IPC_ADDRESS , hostname), conf.getInt(REGIONSERVER_IPC_PORT , port));
197312     }
198313     if (initialIsa.getAddress() == null) {
199314       throw new IllegalArgumentException("Failed resolve of " + initialIsa);
0 commit comments