You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by vj...@apache.org on 2024/02/12 17:15:14 UTC

(hbase) branch branch-3 updated: HBASE-28204 : Region Canary can take lot more time If any region (except the first region) starts with delete markers (#5675)

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

vjasani pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-3 by this push:
     new d38983295b3 HBASE-28204 : Region Canary can take lot more time If any region (except the first region) starts with delete markers (#5675)
d38983295b3 is described below

commit d38983295b32b073d31f605ead8bf205246a51c3
Author: Monani Mihir <mo...@gmail.com>
AuthorDate: Mon Feb 12 09:14:06 2024 -0800

    HBASE-28204 : Region Canary can take lot more time If any region (except the first region) starts with delete markers (#5675)
    
    Signed-off-by: David Manning <da...@salesforce.com>
    Signed-off-by: Viraj Jasani <vj...@apache.org>
---
 .../org/apache/hadoop/hbase/tool/CanaryTool.java   | 37 +++++++++++++++++-----
 1 file changed, 29 insertions(+), 8 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 d5676263c82..a3caf1b24c7 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
@@ -510,19 +510,44 @@ public class CanaryTool implements Tool, Canary {
 
     private Void readColumnFamily(Table table, ColumnFamilyDescriptor column) {
       byte[] startKey = null;
-      Get get = null;
       Scan scan = null;
       ResultScanner rs = null;
       StopWatch stopWatch = new StopWatch();
       startKey = region.getStartKey();
       // Can't do a get on empty start row so do a Scan of first element if any instead.
       if (startKey.length > 0) {
-        get = new Get(startKey);
+        Get get = new Get(startKey);
         get.setCacheBlocks(false);
         get.setFilter(new FirstKeyOnlyFilter());
         get.addFamily(column.getName());
+        // Converting get object to scan to enable RAW SCAN.
+        // This will work for all the regions of the HBase tables except first region of the table.
+        scan = new Scan(get);
+        scan.setRaw(rawScanEnabled);
       } else {
         scan = new Scan();
+        // In case of first region of the HBase Table, we do not have start-key for the region.
+        // For Region Canary, we only need to scan a single row/cell in the region to make sure that
+        // region is accessible.
+        //
+        // When HBase table has more than 1 empty regions at start of the row-key space, Canary will
+        // create multiple scan object to find first available row in the table by scanning all the
+        // regions in sequence until it can find first available row.
+        //
+        // This could result in multiple millions of scans based on the size of table and number of
+        // empty regions in sequence. In test environment, A table with no data and 1100 empty
+        // regions, Single canary run was creating close to half million to 1 million scans to
+        // successfully do canary run for the table.
+        //
+        // Since First region of the table doesn't have any start key, We should set End Key as
+        // stop row and set inclusive=false to limit scan to single region only.
+        //
+        // TODO : In future, we can streamline Canary behaviour for all the regions by doing scan
+        // with startRow inclusive and stopRow exclusive instead of different behaviour for First
+        // Region of the table and rest of the region of the table. This way implementation is
+        // simplified. As of now this change has been kept minimal to avoid any unnecessary
+        // perf impact.
+        scan.withStopRow(region.getEndKey(), false);
         LOG.debug("rawScan {} for {}", rawScanEnabled, region.getTable());
         scan.setRaw(rawScanEnabled);
         scan.setCaching(1);
@@ -536,12 +561,8 @@ public class CanaryTool implements Tool, Canary {
         column.getNameAsString(), Bytes.toStringBinary(startKey));
       try {
         stopWatch.start();
-        if (startKey.length > 0) {
-          table.get(get);
-        } else {
-          rs = table.getScanner(scan);
-          rs.next();
-        }
+        rs = table.getScanner(scan);
+        rs.next();
         stopWatch.stop();
         this.readWriteLatency.add(stopWatch.getTime());
         sink.publishReadTiming(serverName, region, column, stopWatch.getTime());