From f6d69be949c70a51e2d464a1d9e3c414836015f5 Mon Sep 17 00:00:00 2001 From: chenheng Date: Wed, 17 Feb 2016 17:19:26 +0800 Subject: [PATCH] HBASE-15280 Scan metrics should not ignore empty rows --- .../hadoop/hbase/regionserver/RSRpcServices.java | 5 +- .../regionserver/TestRegionServerMetrics.java | 82 ++++++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 7bcde52..40ea68c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -2652,6 +2652,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, region.startRegionOperation(Operation.SCAN); try { int i = 0; + int requestNum = 0; synchronized(scanner) { boolean stale = (region.getRegionInfo().getReplicaId() != 0); boolean clientHandlesPartials = @@ -2735,7 +2736,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, results.add(r); i++; } - + requestNum++; boolean sizeLimitReached = scannerContext.checkSizeLimit(LimitScope.BETWEEN_ROWS); boolean timeLimitReached = scannerContext.checkTimeLimit(LimitScope.BETWEEN_ROWS); boolean rowLimitReached = i >= rows; @@ -2783,7 +2784,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, builder.setScanMetrics(metricBuilder.build()); } } - region.updateReadRequestsCount(i); + region.updateReadRequestsCount(requestNum); long responseCellSize = context != null ? context.getResponseCellSize() : 0; region.getMetrics().updateScanNext(responseCellSize); if (regionServer.metricsRegionServer != null) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java index 79df5e8..03c2f03 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java @@ -64,6 +64,8 @@ public class TestRegionServerMetrics { conf.getLong("hbase.splitlog.max.resubmit", 0); // Make the failure test faster conf.setInt("zookeeper.recovery.retry", 0); + // Disable major compation + conf.setInt(HConstants.MAJOR_COMPACTION_PERIOD, 0); conf.setInt(HConstants.REGIONSERVER_INFO_PORT, -1); TEST_UTIL.startMiniCluster(1, 1); @@ -187,6 +189,86 @@ public class TestRegionServerMetrics { } @Test + public void testScanMetrices() throws Exception { + String tableNameString = "testScanMetrices"; + TableName tName = TableName.valueOf(tableNameString); + byte[] cfName = Bytes.toBytes("d"); + byte[] qualifier = Bytes.toBytes("qual"); + byte[] initValue = Bytes.toBytes("Value"); + + TEST_UTIL.createTable(tName, cfName); + + Connection connection = TEST_UTIL.getConnection(); + connection.getTable(tName).close(); //wait for the table to come up. + + byte[] rowa = Bytes.toBytes("a"); + byte[] rowb = Bytes.toBytes("b"); + byte[] rowc = Bytes.toBytes("c"); + byte[] rowd = Bytes.toBytes("d"); + + // put a, b, d + Table table = connection.getTable(tName); + Put p = new Put(rowa); + p.addColumn(cfName, qualifier, initValue); + table.put(p); + p = new Put(rowb); + p.addColumn(cfName, qualifier, initValue); + table.put(p); + p = new Put(rowd); + p.addColumn(cfName, qualifier, initValue); + table.put(p); + + + metricsRegionServer.getRegionServerWrapper().forceRecompute(); + long readRequests = metricsHelper.getCounter("readRequestCount", serverSource); + int count = scanTable(table, rowa, rowb); + metricsRegionServer.getRegionServerWrapper().forceRecompute(); + assertEquals(count, 2); + metricsHelper.assertCounter("readRequestCount", readRequests + 2, serverSource); + + // now scan unexist c + count = scanTable(table, rowc, rowc); + metricsRegionServer.getRegionServerWrapper().forceRecompute(); + assertEquals(count, 0); + metricsHelper.assertCounter("readRequestCount", readRequests + 3, serverSource); + + // delete b + Delete delete = new Delete(rowb); + table.delete(delete); + count = scanTable(table, rowb, rowb); + metricsRegionServer.getRegionServerWrapper().forceRecompute(); + assertEquals(count, 0); + metricsHelper.assertCounter("readRequestCount", readRequests + 4, serverSource); + + count = scanTable(table, rowa, rowd); + metricsRegionServer.getRegionServerWrapper().forceRecompute(); + assertEquals(count, 2); + // It is weired! The deleted rowb not calculated!! + metricsHelper.assertCounter("readRequestCount", readRequests + 6, serverSource); + + table.close(); + } + + // scan table from [startRow, endRow] + private int scanTable(Table table, byte[] startRow, byte[] endRow) throws IOException { + int count = 0; + byte[] stopRow = new byte[endRow.length + 1]; + System.arraycopy(endRow, 0, stopRow, 0, endRow.length); + stopRow[endRow.length] = 0; + Scan scan = new Scan(); + scan.setStartRow(startRow); + scan.setStopRow(stopRow); + ResultScanner scanner = table.getScanner(scan); + Result res = scanner.next(); + while (res != null) { + count++; + res = scanner.next(); + } + return count; + } + + + @Test public void testMutationsWithoutWal() throws Exception { TableName tableName = TableName.valueOf("testMutationsWithoutWal"); byte[] cf = Bytes.toBytes("d"); -- 1.9.3 (Apple Git-50)