You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/08/24 06:04:30 UTC

[hbase] branch master updated: HBASE-26182 Allow disabling refresh of connection registry endpoint (#3605)

This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 6ed03d9  HBASE-26182 Allow disabling refresh of connection registry endpoint (#3605)
6ed03d9 is described below

commit 6ed03d98ef821690bce6d7d4f5671935cd04171a
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Tue Aug 24 14:04:05 2021 +0800

    HBASE-26182 Allow disabling refresh of connection registry endpoint (#3605)
    
    Signed-off-by: Bharath Vissapragada <bh...@apache.org>
---
 .../client/AbstractRpcBasedConnectionRegistry.java |  6 ++--
 .../hbase/client/RegistryEndpointsRefresher.java   | 41 ++++++++++++++--------
 .../client/TestRegistryEndpointsRefresher.java     | 19 ++++++----
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractRpcBasedConnectionRegistry.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractRpcBasedConnectionRegistry.java
index fbed214..5fdbc55 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractRpcBasedConnectionRegistry.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractRpcBasedConnectionRegistry.java
@@ -102,9 +102,9 @@ abstract class AbstractRpcBasedConnectionRegistry implements ConnectionRegistry
     rpcClient = RpcClientFactory.createClient(conf, null);
     rpcControllerFactory = RpcControllerFactory.instantiate(conf);
     populateStubs(getBootstrapNodes(conf));
-    registryEndpointRefresher = new RegistryEndpointsRefresher(conf, refreshIntervalSecsConfigName,
-      minRefreshIntervalSecsConfigName, this::refreshStubs);
-    registryEndpointRefresher.start();
+    // could return null here is refresh interval is less than zero
+    registryEndpointRefresher = RegistryEndpointsRefresher.create(conf,
+      refreshIntervalSecsConfigName, minRefreshIntervalSecsConfigName, this::refreshStubs);
   }
 
   protected abstract Set<ServerName> getBootstrapNodes(Configuration conf) throws IOException;
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegistryEndpointsRefresher.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegistryEndpointsRefresher.java
index 6599b62..9b450f9 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegistryEndpointsRefresher.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegistryEndpointsRefresher.java
@@ -35,7 +35,7 @@ import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;
  * {@code minIntervalSecsConfigName} seconds apart.
  */
 @InterfaceAudience.Private
-class RegistryEndpointsRefresher {
+final class RegistryEndpointsRefresher {
 
   private static final Logger LOG = LoggerFactory.getLogger(RegistryEndpointsRefresher.class);
 
@@ -51,11 +51,7 @@ class RegistryEndpointsRefresher {
   private boolean refreshNow = false;
   private boolean stopped = false;
 
-  public void start() {
-    thread.start();
-  }
-
-  public synchronized void stop() {
+  synchronized void stop() {
     stopped = true;
     notifyAll();
   }
@@ -108,18 +104,15 @@ class RegistryEndpointsRefresher {
     void refresh() throws IOException;
   }
 
-  RegistryEndpointsRefresher(Configuration conf, String intervalSecsConfigName,
-    String minIntervalSecsConfigName, Refresher refresher) {
-    periodicRefreshMs = TimeUnit.SECONDS
-      .toMillis(conf.getLong(intervalSecsConfigName, PERIODIC_REFRESH_INTERVAL_SECS_DEFAULT));
-    minTimeBetweenRefreshesMs = TimeUnit.SECONDS
-      .toMillis(conf.getLong(minIntervalSecsConfigName, MIN_SECS_BETWEEN_REFRESHES_DEFAULT));
-    Preconditions.checkArgument(periodicRefreshMs > 0);
-    Preconditions.checkArgument(minTimeBetweenRefreshesMs < periodicRefreshMs);
+  private RegistryEndpointsRefresher(long periodicRefreshMs, long minTimeBetweenRefreshesMs,
+    Refresher refresher) {
+    this.periodicRefreshMs = periodicRefreshMs;
+    this.minTimeBetweenRefreshesMs = minTimeBetweenRefreshesMs;
+    this.refresher = refresher;
     thread = new Thread(this::mainLoop);
     thread.setName("Registry-endpoints-refresh-end-points");
     thread.setDaemon(true);
-    this.refresher = refresher;
+    thread.start();
   }
 
   /**
@@ -130,4 +123,22 @@ class RegistryEndpointsRefresher {
     refreshNow = true;
     notifyAll();
   }
+
+  /**
+   * Create a {@link RegistryEndpointsRefresher}. If the interval secs configured via
+   * {@code intervalSecsConfigName} is less than zero, will return null here, which means disable
+   * refreshing of endpoints.
+   */
+  static RegistryEndpointsRefresher create(Configuration conf, String intervalSecsConfigName,
+    String minIntervalSecsConfigName, Refresher refresher) {
+    long periodicRefreshMs = TimeUnit.SECONDS
+      .toMillis(conf.getLong(intervalSecsConfigName, PERIODIC_REFRESH_INTERVAL_SECS_DEFAULT));
+    if (periodicRefreshMs <= 0) {
+      return null;
+    }
+    long minTimeBetweenRefreshesMs = TimeUnit.SECONDS
+      .toMillis(conf.getLong(minIntervalSecsConfigName, MIN_SECS_BETWEEN_REFRESHES_DEFAULT));
+    Preconditions.checkArgument(minTimeBetweenRefreshesMs < periodicRefreshMs);
+    return new RegistryEndpointsRefresher(periodicRefreshMs, minTimeBetweenRefreshesMs, refresher);
+  }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
index 748ad41..f8893c9 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -74,18 +75,24 @@ public class TestRegistryEndpointsRefresher {
     callTimestamps.add(EnvironmentEdgeManager.currentTime());
   }
 
-  private void createAndStartRefresher(long intervalSecs, long minIntervalSecs) {
+  private void createRefresher(long intervalSecs, long minIntervalSecs) {
     conf.setLong(INTERVAL_SECS_CONFIG_NAME, intervalSecs);
     conf.setLong(MIN_INTERVAL_SECS_CONFIG_NAME, minIntervalSecs);
-    refresher = new RegistryEndpointsRefresher(conf, INTERVAL_SECS_CONFIG_NAME,
+    refresher = RegistryEndpointsRefresher.create(conf, INTERVAL_SECS_CONFIG_NAME,
       MIN_INTERVAL_SECS_CONFIG_NAME, this::refresh);
-    refresher.start();
   }
 
   @Test
-  public void testPeriodicMasterEndPointRefresh() throws IOException {
+  public void testDisableRefresh() {
+    conf.setLong(INTERVAL_SECS_CONFIG_NAME, -1);
+    assertNull(RegistryEndpointsRefresher.create(conf, INTERVAL_SECS_CONFIG_NAME,
+      MIN_INTERVAL_SECS_CONFIG_NAME, this::refresh));
+  }
+
+  @Test
+  public void testPeriodicEndpointRefresh() throws IOException {
     // Refresh every 1 second.
-    createAndStartRefresher(1, 0);
+    createRefresher(1, 0);
     // Wait for > 3 seconds to see that at least 3 refresh have been made.
     Waiter.waitFor(conf, 5000, () -> refreshCallCounter.get() > 3);
   }
@@ -94,7 +101,7 @@ public class TestRegistryEndpointsRefresher {
   public void testDurationBetweenRefreshes() throws IOException {
     // Disable periodic refresh
     // A minimum duration of 1s between refreshes
-    createAndStartRefresher(Integer.MAX_VALUE, 1);
+    createRefresher(Integer.MAX_VALUE, 1);
     // Issue a ton of manual refreshes.
     for (int i = 0; i < 10000; i++) {
       refresher.refreshNow();