From 6224df7fcbf40d67776a9a09e172ae2f9874fdbc Mon Sep 17 00:00:00 2001 From: jinghan Date: Tue, 7 Aug 2018 17:52:27 -0700 Subject: [PATCH] make region num metric return a pair --- .../hadoop/hbase/master/MetricsMasterSource.java | 4 ++ .../hadoop/hbase/master/MetricsMasterWrapper.java | 8 +++ .../hbase/master/MetricsMasterSourceImpl.java | 7 +++ .../hbase/master/MetricsMasterWrapperImpl.java | 35 ++++++++++- .../hbase/master/TestMasterMetricsWrapper.java | 67 ++++++++++++++++++++++ 5 files changed, 119 insertions(+), 2 deletions(-) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java index 7dcb5009e..b19ac0323 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java @@ -57,6 +57,8 @@ public interface MetricsMasterSource extends BaseSource { String SERVER_NAME_NAME = "serverName"; String CLUSTER_ID_NAME = "clusterId"; String IS_ACTIVE_MASTER_NAME = "isActiveMaster"; + String ONLINE_REGION_COUNT_NAME = "onlineRegionCount"; + String OFFLINE_REGION_COUNT_NAME = "offlineRegionCount"; String CLUSTER_REQUESTS_NAME = "clusterRequests"; @@ -71,6 +73,8 @@ public interface MetricsMasterSource extends BaseSource { String SERVER_NAME_DESC = "Server Name"; String CLUSTER_ID_DESC = "Cluster Id"; String IS_ACTIVE_MASTER_DESC = "Is Active Master"; + String ONLINE_REGION_COUNT_DESC = "Online Region Count"; + String OFFLINE_REGION_COUNT_DESC = "Offline Region Count"; diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java index 644522a56..47fd6602c 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java @@ -18,6 +18,8 @@ package org.apache.hadoop.hbase.master; +import javafx.util.Pair; + /** * This is the interface that will expose information to hadoop1/hadoop2 implementations of the * MetricsMasterSource. @@ -107,4 +109,10 @@ public interface MetricsMasterWrapper { */ int getNumDeadRegionServers(); + /** + * Get the online and offline region count + * + * @return pair of of online region count and offline region count + */ + Pair getRegionCounts(); } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java index c5ce5e417..0ba145f81 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.master; +import javafx.util.Pair; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.metrics.BaseSourceImpl; import org.apache.hadoop.metrics2.MetricsCollector; @@ -70,6 +71,8 @@ public class MetricsMasterSourceImpl public void getMetrics(MetricsCollector metricsCollector, boolean all) { MetricsRecordBuilder metricsRecordBuilder = metricsCollector.addRecord(metricsName); + // Pair + Pair regionCounts = masterWrapper.getRegionCounts(); // masterWrapper can be null because this function is called inside of init. if (masterWrapper != null) { @@ -80,6 +83,10 @@ public class MetricsMasterSourceImpl MASTER_START_TIME_DESC), masterWrapper.getStartTime()) .addGauge(Interns.info(AVERAGE_LOAD_NAME, AVERAGE_LOAD_DESC), masterWrapper.getAverageLoad()) + .addGauge(Interns.info(ONLINE_REGION_COUNT_NAME, ONLINE_REGION_COUNT_DESC), + regionCounts.getKey()) + .addGauge(Interns.info(OFFLINE_REGION_COUNT_NAME, OFFLINE_REGION_COUNT_DESC), + regionCounts.getValue()) .tag(Interns.info(LIVE_REGION_SERVERS_NAME, LIVE_REGION_SERVERS_DESC), masterWrapper.getRegionServers()) .addGauge(Interns.info(NUM_REGION_SERVERS_NAME, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java index 727f9b240..2167b4b8e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java @@ -17,11 +17,20 @@ */ package org.apache.hadoop.hbase.master; +import javafx.util.Pair; import org.apache.commons.lang.StringUtils; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; +import java.io.IOException; +import java.util.List; +import java.util.Map; + /** * Impl for exposing HMaster Information through JMX */ @@ -76,7 +85,7 @@ public class MetricsMasterWrapperImpl implements MetricsMasterWrapper { } return StringUtils.join(serverManager.getOnlineServers().keySet(), ";"); } - + @Override public int getNumRegionServers() { ServerManager serverManager = this.master.getServerManager(); @@ -95,7 +104,7 @@ public class MetricsMasterWrapperImpl implements MetricsMasterWrapper { return StringUtils.join(serverManager.getDeadServers().copyServerNames(), ";"); } - + @Override public int getNumDeadRegionServers() { ServerManager serverManager = this.master.getServerManager(); @@ -118,4 +127,26 @@ public class MetricsMasterWrapperImpl implements MetricsMasterWrapper { public boolean getIsActiveMaster() { return master.isActiveMaster(); } + + @Override + public Pair getRegionCounts() { + try { + Admin admin = master.getConnection().getAdmin(); + if (!master.isInitialized()) + return new Pair<>(0, 0); + Integer onlineRegionCount = 0; + Integer offlineRegionCount = 0; + for (HTableDescriptor htDesc : admin.listTables()) { + TableName tableName = htDesc.getTableName(); + Map> tableRegions = + master.getAssignmentManager().getRegionStates() + .getRegionByStateOfTable(tableName); + onlineRegionCount += tableRegions.get(RegionState.State.OPEN).size(); + offlineRegionCount += tableRegions.get(RegionState.State.OFFLINE).size(); + } + return new Pair<>(onlineRegionCount, offlineRegionCount); + } catch (IOException e) { + return new Pair<>(0, 0); + } + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java index e7061deb7..497f0c7e9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java @@ -19,17 +19,26 @@ package org.apache.hadoop.hbase.master; import static org.junit.Assert.*; +import javafx.util.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Threads; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; +import java.io.IOException; +import java.util.List; + @Category({MasterTests.class, MediumTests.class}) public class TestMasterMetricsWrapper { private static final Log LOG = LogFactory.getLog(TestMasterMetricsWrapper.class); @@ -74,4 +83,62 @@ public class TestMasterMetricsWrapper { assertEquals(3, info.getNumRegionServers()); assertEquals(1, info.getNumDeadRegionServers()); } + + /** + * tests online and offline region counts + */ + @Test (timeout=30000) + public void testOfflineRegion() throws Exception { + HMaster master = TEST_UTIL.getHBaseCluster().getMaster(); + MetricsMasterWrapperImpl info = new MetricsMasterWrapperImpl(master); + TableName table = TableName.valueOf("testRegionCounts"); + try { + HRegionInfo hri; + HTableDescriptor desc = new HTableDescriptor(table); + byte[] FAMILY = Bytes.toBytes("FAMILY"); + desc.addFamily(new HColumnDescriptor(FAMILY)); + TEST_UTIL.getHBaseAdmin().createTable(desc, Bytes.toBytes("A"), Bytes.toBytes("Z"), 5); + + // wait till the table is assigned + long timeoutTime = System.currentTimeMillis() + 1000; + while (true) { + List regions = master.getAssignmentManager(). + getRegionStates().getRegionsOfTable(table); + if (regions.size() > 3) { + hri = regions.get(2); + break; + } + long now = System.currentTimeMillis(); + if (now > timeoutTime) { + fail("Could not find an online region"); + } + Thread.sleep(10); + } + + Pair regionCounts = info.getRegionCounts(); + assertEquals(5, regionCounts.getKey().intValue()); + assertEquals(0, regionCounts.getValue().intValue()); + + TEST_UTIL.getHBaseAdmin().offline(hri.getRegionName()); + + timeoutTime = System.currentTimeMillis() + 800; + RegionStates regionStates = master.getAssignmentManager().getRegionStates(); + while (true) { + if (regionStates.getRegionByStateOfTable(table) + .get(RegionState.State.OFFLINE).contains(hri)) + break; + long now = System.currentTimeMillis(); + if (now > timeoutTime) { + fail("Failed to offline the region in time"); + break; + } + Thread.sleep(10); + } + regionCounts = info.getRegionCounts(); + assertEquals(4, regionCounts.getKey().intValue()); + assertEquals(1, regionCounts.getValue().intValue()); + } finally { + TEST_UTIL.deleteTable(table); + } + } } \ No newline at end of file -- 2.16.3