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 f022692  HBASE-26157 Expose some IA.LimitedPrivate interface in 
TestingHBaseCluster (#3643)
f022692 is described below

commit f0226921edebc1d6e551ac9fa1f3db2f39756c12
Author: Duo Zhang <zhang...@apache.org>
AuthorDate: Thu Sep 2 16:39:09 2021 +0800

    HBASE-26157 Expose some IA.LimitedPrivate interface in TestingHBaseCluster 
(#3643)
    
    Signed-off-by: Geoffrey Jacoby <gjac...@apache.org>
---
 .../hadoop/hbase/testing/TestingHBaseCluster.java  |  41 ++++++++
 .../hbase/testing/TestingHBaseClusterImpl.java     |  41 ++++++++
 .../hbase/testing/TestTestingHBaseCluster.java     |   7 ++
 .../testing/TestTestingHBaseClusterImplForCPs.java | 107 +++++++++++++++++++++
 4 files changed, 196 insertions(+)

diff --git 
a/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseCluster.java
 
b/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseCluster.java
index b4d4e56..d59c6db 100644
--- 
a/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseCluster.java
+++ 
b/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseCluster.java
@@ -17,9 +17,15 @@
  */
 package org.apache.hadoop.hbase.testing;
 
+import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseInterfaceAudience;
 import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.regionserver.OnlineRegions;
+import org.apache.hadoop.hbase.regionserver.Region;
 import org.apache.yetus.audience.InterfaceAudience;
 
 /**
@@ -115,6 +121,41 @@ public interface TestingHBaseCluster {
   void start() throws Exception;
 
   /**
+   * Get the address of active master if there is one.
+   */
+  Optional<ServerName> getActiveMasterAddress();
+
+  /**
+   * Get all the backup master addresses.
+   */
+  List<ServerName> getBackupMasterAddresses();
+
+  /**
+   * Get all the region server addresses.
+   */
+  List<ServerName> getRegionServerAddresses();
+
+  /**
+   * Get the server side {@link Region} interface for the specific region.
+   * <p/>
+   * This is used for CPs to test something which can only be accessed at 
server side, such as tags.
+   */
+  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)
+  Optional<Region> getRegion(RegionInfo regionInfo);
+
+  /**
+   * Get the server side {@link OnlineRegions} interface for the specific 
region server.
+   * <p/>
+   * You could list the addresses of all the region server through the
+   * {@link #getRegionServerAddresses()} method.
+   * <p/>
+   * This is used for CPs to test something which can only be accessed at 
server side, such as tags.
+   * And also you could use the returned interface to get all regions on this 
region server, etc.
+   */
+  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)
+  Optional<OnlineRegions> getOnlineRegionsInterface(ServerName serverName);
+
+  /**
    * Return whether the cluster is running.
    * <p/>
    * Notice that, this only means you have called {@link #start()} and have 
not called
diff --git 
a/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseClusterImpl.java
 
b/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseClusterImpl.java
index 5128b90..8cea789 100644
--- 
a/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseClusterImpl.java
+++ 
b/hbase-testing-util/src/main/java/org/apache/hadoop/hbase/testing/TestingHBaseClusterImpl.java
@@ -18,13 +18,20 @@
 package org.apache.hadoop.hbase.testing;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseTestingUtil;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.StartTestingClusterOption;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.OnlineRegions;
+import org.apache.hadoop.hbase.regionserver.Region;
 import org.apache.hadoop.hbase.util.JVMClusterUtil.MasterThread;
 import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -172,4 +179,38 @@ class TestingHBaseClusterImpl implements 
TestingHBaseCluster {
   public void startRegionServer(String hostname, int port) throws Exception {
     util.getMiniHBaseCluster().startRegionServer(hostname, port);
   }
+
+  @Override
+  public Optional<ServerName> getActiveMasterAddress() {
+    return 
Optional.ofNullable(util.getMiniHBaseCluster().getMaster()).map(HMaster::getServerName);
+  }
+
+  @Override
+  public List<ServerName> getBackupMasterAddresses() {
+    return 
util.getMiniHBaseCluster().getMasterThreads().stream().map(MasterThread::getMaster)
+      .filter(m -> 
!m.isActiveMaster()).map(HMaster::getServerName).collect(Collectors.toList());
+  }
+
+  @Override
+  public List<ServerName> getRegionServerAddresses() {
+    return util.getMiniHBaseCluster().getRegionServerThreads().stream()
+      .map(t -> 
t.getRegionServer().getServerName()).collect(Collectors.toList());
+  }
+
+  @Override
+  public Optional<Region> getRegion(RegionInfo regionInfo) {
+    for (RegionServerThread t : 
util.getMiniHBaseCluster().getRegionServerThreads()) {
+      for (HRegion region : t.getRegionServer().getRegions()) {
+        if (region.getRegionInfo().equals(regionInfo)) {
+          return Optional.of(region);
+        }
+      }
+    }
+    return Optional.empty();
+  }
+
+  @Override
+  public Optional<OnlineRegions> getOnlineRegionsInterface(ServerName 
serverName) {
+    return 
Optional.ofNullable(util.getMiniHBaseCluster().getRegionServer(serverName));
+  }
 }
diff --git 
a/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseCluster.java
 
b/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseCluster.java
index 33e7103..4ff7450 100644
--- 
a/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseCluster.java
+++ 
b/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseCluster.java
@@ -144,4 +144,11 @@ public class TestTestingHBaseCluster {
     CLUSTER.startRegionServer(DNS.getHostname(CLUSTER.getConf(), 
ServerType.REGIONSERVER), 0);
     Waiter.waitFor(CLUSTER.getConf(), 30000, () -> 
admin.getRegionServers().size() == 4);
   }
+
+  @Test
+  public void testGetAddresses() throws Exception {
+    assertTrue(CLUSTER.getActiveMasterAddress().isPresent());
+    assertEquals(1, CLUSTER.getBackupMasterAddresses().size());
+    assertEquals(3, CLUSTER.getRegionServerAddresses().size());
+  }
 }
diff --git 
a/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseClusterImplForCPs.java
 
b/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseClusterImplForCPs.java
new file mode 100644
index 0000000..322bd37
--- /dev/null
+++ 
b/hbase-testing-util/src/test/java/org/apache/hadoop/hbase/testing/TestTestingHBaseClusterImplForCPs.java
@@ -0,0 +1,107 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.testing;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
+import org.apache.hadoop.hbase.client.Connection;
+import org.apache.hadoop.hbase.client.ConnectionFactory;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.RegionInfoBuilder;
+import org.apache.hadoop.hbase.client.RegionLocator;
+import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
+import org.apache.hadoop.hbase.regionserver.OnlineRegions;
+import org.apache.hadoop.hbase.regionserver.Region;
+import org.apache.hadoop.hbase.testclassification.LargeTests;
+import org.apache.hadoop.hbase.testclassification.MiscTests;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
+
+@Category({ MiscTests.class, LargeTests.class })
+public class TestTestingHBaseClusterImplForCPs {
+
+  @ClassRule
+  public static final HBaseClassTestRule CLASS_RULE =
+    HBaseClassTestRule.forClass(TestTestingHBaseClusterImplForCPs.class);
+
+  private static TestingHBaseCluster CLUSTER;
+
+  private static TableName NAME = TableName.valueOf("test");
+
+  private static byte[] CF = Bytes.toBytes("cf");
+
+  private static Connection CONN;
+
+  private static Admin ADMIN;
+
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+    CLUSTER = 
TestingHBaseCluster.create(TestingHBaseClusterOption.builder().numMasters(2)
+      .numRegionServers(3).numDataNodes(3).build());
+    CLUSTER.start();
+    CONN = ConnectionFactory.createConnection(CLUSTER.getConf());
+    ADMIN = CONN.getAdmin();
+    ADMIN.createTable(TableDescriptorBuilder.newBuilder(NAME)
+      .setColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)).build());
+    ADMIN.balancerSwitch(false, true);
+  }
+
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
+    Closeables.close(ADMIN, true);
+    Closeables.close(CONN, true);
+    if (CLUSTER.isClusterRunning()) {
+      CLUSTER.stop();
+    }
+  }
+
+  @Test
+  public void testGetRegion() throws IOException {
+    List<RegionInfo> infos = ADMIN.getRegions(NAME);
+    assertEquals(1, infos.size());
+    RegionInfo info = infos.get(0);
+    Region region = CLUSTER.getRegion(info).get();
+    ServerName loc;
+    try (RegionLocator locator = CONN.getRegionLocator(NAME)) {
+      loc = locator.getRegionLocation(info.getStartKey()).getServerName();
+    }
+    OnlineRegions onlineRegionsInterface = 
CLUSTER.getOnlineRegionsInterface(loc).get();
+    List<? extends Region> regions = onlineRegionsInterface.getRegions(NAME);
+    assertEquals(1, regions.size());
+    assertSame(region, regions.get(0));
+
+    assertFalse(CLUSTER
+      
.getRegion(RegionInfoBuilder.newBuilder(TableName.valueOf("whatever")).build()).isPresent());
+    
assertFalse(CLUSTER.getOnlineRegionsInterface(ServerName.valueOf("whatever,1,1")).isPresent());
+  }
+}

Reply via email to