Skip to content

Commit d8fb978

Browse files
Apache9Duo Zhang
authored andcommitted
HBASE-26182 Allow disabling refresh of connection registry endpoint (#3605)
Signed-off-by: Bharath Vissapragada <bharathv@apache.org>
1 parent 2728821 commit d8fb978

File tree

3 files changed

+42
-24
lines changed

3 files changed

+42
-24
lines changed

hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractRpcBasedConnectionRegistry.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ protected AbstractRpcBasedConnectionRegistry(Configuration conf,
100100
rpcClient = RpcClientFactory.createClient(conf, null);
101101
rpcControllerFactory = RpcControllerFactory.instantiate(conf);
102102
populateStubs(getBootstrapNodes(conf));
103-
registryEndpointRefresher = new RegistryEndpointsRefresher(conf, refreshIntervalSecsConfigName,
104-
minRefreshIntervalSecsConfigName, this::refreshStubs);
105-
registryEndpointRefresher.start();
103+
// could return null here is refresh interval is less than zero
104+
registryEndpointRefresher = RegistryEndpointsRefresher.create(conf,
105+
refreshIntervalSecsConfigName, minRefreshIntervalSecsConfigName, this::refreshStubs);
106106
}
107107

108108
protected abstract Set<ServerName> getBootstrapNodes(Configuration conf) throws IOException;

hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegistryEndpointsRefresher.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
* {@code minIntervalSecsConfigName} seconds apart.
3636
*/
3737
@InterfaceAudience.Private
38-
class RegistryEndpointsRefresher {
38+
final class RegistryEndpointsRefresher {
3939

4040
private static final Logger LOG = LoggerFactory.getLogger(RegistryEndpointsRefresher.class);
4141

@@ -51,11 +51,7 @@ class RegistryEndpointsRefresher {
5151
private boolean refreshNow = false;
5252
private boolean stopped = false;
5353

54-
public void start() {
55-
thread.start();
56-
}
57-
58-
public synchronized void stop() {
54+
synchronized void stop() {
5955
stopped = true;
6056
notifyAll();
6157
}
@@ -108,18 +104,15 @@ public interface Refresher {
108104
void refresh() throws IOException;
109105
}
110106

111-
RegistryEndpointsRefresher(Configuration conf, String intervalSecsConfigName,
112-
String minIntervalSecsConfigName, Refresher refresher) {
113-
periodicRefreshMs = TimeUnit.SECONDS
114-
.toMillis(conf.getLong(intervalSecsConfigName, PERIODIC_REFRESH_INTERVAL_SECS_DEFAULT));
115-
minTimeBetweenRefreshesMs = TimeUnit.SECONDS
116-
.toMillis(conf.getLong(minIntervalSecsConfigName, MIN_SECS_BETWEEN_REFRESHES_DEFAULT));
117-
Preconditions.checkArgument(periodicRefreshMs > 0);
118-
Preconditions.checkArgument(minTimeBetweenRefreshesMs < periodicRefreshMs);
107+
private RegistryEndpointsRefresher(long periodicRefreshMs, long minTimeBetweenRefreshesMs,
108+
Refresher refresher) {
109+
this.periodicRefreshMs = periodicRefreshMs;
110+
this.minTimeBetweenRefreshesMs = minTimeBetweenRefreshesMs;
111+
this.refresher = refresher;
119112
thread = new Thread(this::mainLoop);
120113
thread.setName("Registry-endpoints-refresh-end-points");
121114
thread.setDaemon(true);
122-
this.refresher = refresher;
115+
thread.start();
123116
}
124117

125118
/**
@@ -130,4 +123,22 @@ synchronized void refreshNow() {
130123
refreshNow = true;
131124
notifyAll();
132125
}
126+
127+
/**
128+
* Create a {@link RegistryEndpointsRefresher}. If the interval secs configured via
129+
* {@code intervalSecsConfigName} is less than zero, will return null here, which means disable
130+
* refreshing of endpoints.
131+
*/
132+
static RegistryEndpointsRefresher create(Configuration conf, String intervalSecsConfigName,
133+
String minIntervalSecsConfigName, Refresher refresher) {
134+
long periodicRefreshMs = TimeUnit.SECONDS
135+
.toMillis(conf.getLong(intervalSecsConfigName, PERIODIC_REFRESH_INTERVAL_SECS_DEFAULT));
136+
if (periodicRefreshMs <= 0) {
137+
return null;
138+
}
139+
long minTimeBetweenRefreshesMs = TimeUnit.SECONDS
140+
.toMillis(conf.getLong(minIntervalSecsConfigName, MIN_SECS_BETWEEN_REFRESHES_DEFAULT));
141+
Preconditions.checkArgument(minTimeBetweenRefreshesMs < periodicRefreshMs);
142+
return new RegistryEndpointsRefresher(periodicRefreshMs, minTimeBetweenRefreshesMs, refresher);
143+
}
133144
}

hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.hadoop.hbase.client;
1919

20+
import static org.junit.Assert.assertNull;
2021
import static org.junit.Assert.assertTrue;
2122

2223
import java.io.IOException;
@@ -74,18 +75,24 @@ private void refresh() {
7475
callTimestamps.add(EnvironmentEdgeManager.currentTime());
7576
}
7677

77-
private void createAndStartRefresher(long intervalSecs, long minIntervalSecs) {
78+
private void createRefresher(long intervalSecs, long minIntervalSecs) {
7879
conf.setLong(INTERVAL_SECS_CONFIG_NAME, intervalSecs);
7980
conf.setLong(MIN_INTERVAL_SECS_CONFIG_NAME, minIntervalSecs);
80-
refresher = new RegistryEndpointsRefresher(conf, INTERVAL_SECS_CONFIG_NAME,
81+
refresher = RegistryEndpointsRefresher.create(conf, INTERVAL_SECS_CONFIG_NAME,
8182
MIN_INTERVAL_SECS_CONFIG_NAME, this::refresh);
82-
refresher.start();
8383
}
8484

8585
@Test
86-
public void testPeriodicMasterEndPointRefresh() throws IOException {
86+
public void testDisableRefresh() {
87+
conf.setLong(INTERVAL_SECS_CONFIG_NAME, -1);
88+
assertNull(RegistryEndpointsRefresher.create(conf, INTERVAL_SECS_CONFIG_NAME,
89+
MIN_INTERVAL_SECS_CONFIG_NAME, this::refresh));
90+
}
91+
92+
@Test
93+
public void testPeriodicEndpointRefresh() throws IOException {
8794
// Refresh every 1 second.
88-
createAndStartRefresher(1, 0);
95+
createRefresher(1, 0);
8996
// Wait for > 3 seconds to see that at least 3 refresh have been made.
9097
Waiter.waitFor(conf, 5000, () -> refreshCallCounter.get() > 3);
9198
}
@@ -94,7 +101,7 @@ public void testPeriodicMasterEndPointRefresh() throws IOException {
94101
public void testDurationBetweenRefreshes() throws IOException {
95102
// Disable periodic refresh
96103
// A minimum duration of 1s between refreshes
97-
createAndStartRefresher(Integer.MAX_VALUE, 1);
104+
createRefresher(Integer.MAX_VALUE, 1);
98105
// Issue a ton of manual refreshes.
99106
for (int i = 0; i < 10000; i++) {
100107
refresher.refreshNow();

0 commit comments

Comments
 (0)