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());