From 56d6609470c7e629f4b574c752aee279dd0259c3 Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Thu, 17 Oct 2019 19:51:58 -0700 Subject: [PATCH] patch for branch-1 --- .../apache/hadoop/hbase/tool/CanaryTool.java | 39 ++++++++++++------ .../hadoop/hbase/tool/TestCanaryTool.java | 41 +++++++++++-------- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java index 23daf03920..709d22e73a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java @@ -269,7 +269,7 @@ public class CanaryTool implements Tool, Canary { public static class RegionStdOutSink extends StdOutSink { private Map perTableReadLatency = new HashMap<>(); private AtomicLong writeLatency = new AtomicLong(); - private final Map regionMap = new ConcurrentHashMap<>(); + private final Map> regionMap = new ConcurrentHashMap<>(); public void publishReadFailure(ServerName serverName, HRegionInfo region, Exception e) { incReadFailureCount(); @@ -285,10 +285,13 @@ public class CanaryTool implements Tool, Canary { public void publishReadTiming(ServerName serverName, HRegionInfo region, HColumnDescriptor column, long msTime) { + RegionTaskResult rtr = new RegionTaskResult(region, region.getTable(), serverName, column); + rtr.setReadSuccess(); + rtr.setReadLatency(msTime); + List rtrs = regionMap.get(region.getRegionNameAsString()); + rtrs.add(rtr); + // Note that read success count will be equal to total column family read successes. incReadSuccessCount(); - RegionTaskResult res = this.regionMap.get(region.getRegionNameAsString()); - res.setReadSuccess(); - res.setReadLatency(msTime); LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime); } @@ -307,10 +310,13 @@ public class CanaryTool implements Tool, Canary { public void publishWriteTiming(ServerName serverName, HRegionInfo region, HColumnDescriptor column, long msTime) { + RegionTaskResult rtr = new RegionTaskResult(region, region.getTable(), serverName, column); + rtr.setWriteSuccess(); + rtr.setWriteLatency(msTime); + List rtrs = regionMap.get(region.getRegionNameAsString()); + rtrs.add(rtr); + // Note that write success count will be equal to total column family write successes. incWriteSuccessCount(); - RegionTaskResult res = this.regionMap.get(region.getRegionNameAsString()); - res.setWriteSuccess(); - res.setWriteLatency(msTime); LOG.info("Write to {} on {} {} in {}ms", region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime); } @@ -333,7 +339,7 @@ public class CanaryTool implements Tool, Canary { return this.writeLatency; } - public Map getRegionMap() { + public Map> getRegionMap() { return this.regionMap; } @@ -1042,15 +1048,17 @@ public class CanaryTool implements Tool, Canary { private HRegionInfo region; private TableName tableName; private ServerName serverName; + private HColumnDescriptor column; private AtomicLong readLatency = null; private AtomicLong writeLatency = null; private boolean readSuccess = false; private boolean writeSuccess = false; - public RegionTaskResult(HRegionInfo region, TableName tableName, ServerName serverName) { + public RegionTaskResult(HRegionInfo region, TableName tableName, ServerName serverName, HColumnDescriptor column) { this.region = region; this.tableName = tableName; this.serverName = serverName; + this.column = column; } public HRegionInfo getRegionInfo() { @@ -1077,6 +1085,14 @@ public class CanaryTool implements Tool, Canary { return this.serverName.getServerName(); } + public HColumnDescriptor getColumnFamily() { + return this.column; + } + + public String getColumnFamilyNameAsString() { + return this.column.getNameAsString(); + } + public long getReadLatency() { if (this.readLatency == null) { return -1; @@ -1568,9 +1584,8 @@ public class CanaryTool implements Tool, Canary { HRegionInfo region = location.getRegionInfo(); tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink)sink, taskType, rawScanEnabled, rwLatency)); - Map regionMap = ((RegionStdOutSink) sink).getRegionMap(); - regionMap.put(region.getRegionNameAsString(), new RegionTaskResult(region, - region.getTable(), rs)); + Map> regionMap = ((RegionStdOutSink) sink).getRegionMap(); + regionMap.put(region.getRegionNameAsString(), new ArrayList()); } return executor.invokeAll(tasks); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryTool.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryTool.java index c07e80f08e..f3fbf16310 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryTool.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryTool.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -139,6 +140,10 @@ public class TestCanaryTool { String[] args = { "-writeSniffing", "-t", "10000", "testCanaryRegionTaskResult" }; assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args)); + assertTrue("canary should expect to scan at least 1 region", + sink.getTotalExpectedRegions() > 0); + assertTrue("there should be no read failures", sink.getReadFailureCount() == 0); + assertTrue("there should be no write failures", sink.getWriteFailureCount() == 0); assertTrue("verify read success count > 0", sink.getReadSuccessCount() > 0); assertTrue("verify write success count > 0", sink.getWriteSuccessCount() > 0); verify(sink, atLeastOnce()).publishReadTiming(isA(ServerName.class), isA(HRegionInfo.class), @@ -146,27 +151,29 @@ public class TestCanaryTool { verify(sink, atLeastOnce()).publishWriteTiming(isA(ServerName.class), isA(HRegionInfo.class), isA(HColumnDescriptor.class), anyLong()); - assertTrue("canary should expect to scan at least 1 region", - sink.getTotalExpectedRegions() > 0); - Map regionMap = sink.getRegionMap(); + assertEquals("canary region success count should equal total expected regions", + sink.getReadSuccessCount() + sink.getWriteSuccessCount(), sink.getTotalExpectedRegions()); + Map> regionMap = sink.getRegionMap(); assertFalse("verify region map has size > 0", regionMap.isEmpty()); for (String regionName : regionMap.keySet()) { - CanaryTool.RegionTaskResult res = regionMap.get(regionName); - assertNotNull("verify each expected region has a RegionTaskResult object in the map", res); - assertNotNull("verify getRegionNameAsString()", regionName); - assertNotNull("verify getRegionInfo()", res.getRegionInfo()); - assertNotNull("verify getTableName()", res.getTableName()); - assertNotNull("verify getTableNameAsString()", res.getTableNameAsString()); - assertNotNull("verify getServerName()", res.getServerName()); - assertNotNull("verify getServerNameAsString()", res.getServerNameAsString()); + for (CanaryTool.RegionTaskResult res: regionMap.get(regionName)) { + assertNotNull("verify getRegionNameAsString()", regionName); + assertNotNull("verify getRegionInfo()", res.getRegionInfo()); + assertNotNull("verify getTableName()", res.getTableName()); + assertNotNull("verify getTableNameAsString()", res.getTableNameAsString()); + assertNotNull("verify getServerName()", res.getServerName()); + assertNotNull("verify getServerNameAsString()", res.getServerNameAsString()); + assertNotNull("verify getColumnFamily()", res.getColumnFamily()); + assertNotNull("verify getColumnFamilyNameAsString()", res.getColumnFamilyNameAsString()); - if (regionName.contains(CanaryTool.DEFAULT_WRITE_TABLE_NAME.getNameAsString())) { - assertTrue("write to region " + regionName + " succeeded", res.isWriteSuccess()); - assertTrue("write took some time", res.getWriteLatency() > -1); - } else { - assertTrue("read from region " + regionName + " succeeded", res.isReadSuccess()); - assertTrue("read took some time", res.getReadLatency() > -1); + if (regionName.contains(CanaryTool.DEFAULT_WRITE_TABLE_NAME.getNameAsString())) { + assertTrue("write to region " + regionName + " succeeded", res.isWriteSuccess()); + assertTrue("write took some time", res.getWriteLatency() > -1); + } else { + assertTrue("read from region " + regionName + " succeeded", res.isReadSuccess()); + assertTrue("read took some time", res.getReadLatency() > -1); + } } } } -- 2.20.1