You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by me...@apache.org on 2021/07/22 08:08:27 UTC

[hbase] branch master updated: HBASE-24734 RegionInfo#containsRange should support check meta table (#3496)

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

meiyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e27de6  HBASE-24734 RegionInfo#containsRange should support check meta table (#3496)
9e27de6 is described below

commit 9e27de6aed43bfcf9230272f1979122a8da4a08e
Author: meiyi <my...@gmail.com>
AuthorDate: Thu Jul 22 16:07:52 2021 +0800

    HBASE-24734 RegionInfo#containsRange should support check meta table (#3496)
    
    Signed-off-by: zhangduo <zh...@apache.org>
---
 .../hadoop/hbase/client/MutableRegionInfo.java     | 14 +++++----
 .../hadoop/hbase/client/TestRegionInfoBuilder.java | 34 ++++++++++++++++++++++
 .../org/apache/hadoop/hbase/CellComparator.java    | 12 ++++++++
 .../apache/hadoop/hbase/MetaCellComparator.java    |  5 ++++
 .../hadoop/hbase/regionserver/TestRegionInfo.java  | 34 ++++++++++++++++++++++
 5 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MutableRegionInfo.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MutableRegionInfo.java
index 028608d..0aa301c 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MutableRegionInfo.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MutableRegionInfo.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 import java.util.Arrays;
+import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -206,15 +208,16 @@ class MutableRegionInfo implements RegionInfo {
    */
   @Override
   public boolean containsRange(byte[] rangeStartKey, byte[] rangeEndKey) {
-    if (Bytes.compareTo(rangeStartKey, rangeEndKey) > 0) {
+    CellComparator cellComparator = CellComparatorImpl.getCellComparator(tableName);
+    if (cellComparator.compareRows(rangeStartKey, rangeEndKey) > 0) {
       throw new IllegalArgumentException(
       "Invalid range: " + Bytes.toStringBinary(rangeStartKey) +
       " > " + Bytes.toStringBinary(rangeEndKey));
     }
 
-    boolean firstKeyInRange = Bytes.compareTo(rangeStartKey, startKey) >= 0;
+    boolean firstKeyInRange = cellComparator.compareRows(rangeStartKey, startKey) >= 0;
     boolean lastKeyInRange =
-      Bytes.compareTo(rangeEndKey, endKey) < 0 ||
+      cellComparator.compareRows(rangeEndKey, endKey) < 0 ||
       Bytes.equals(endKey, HConstants.EMPTY_BYTE_ARRAY);
     return firstKeyInRange && lastKeyInRange;
   }
@@ -224,8 +227,9 @@ class MutableRegionInfo implements RegionInfo {
    */
   @Override
   public boolean containsRow(byte[] row) {
-    return Bytes.compareTo(row, startKey) >= 0 &&
-      (Bytes.compareTo(row, endKey) < 0 ||
+    CellComparator cellComparator = CellComparatorImpl.getCellComparator(tableName);
+    return cellComparator.compareRows(row, startKey) >= 0 &&
+      (cellComparator.compareRows(row, endKey) < 0 ||
        Bytes.equals(endKey, HConstants.EMPTY_BYTE_ARRAY));
   }
 
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
index d7b375b..3b66f7e 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -138,6 +139,39 @@ public class TestRegionInfoBuilder {
   }
 
   @Test
+  public void testContainsRangeForMetaTable() {
+    TableDescriptor tableDesc =
+        TableDescriptorBuilder.newBuilder(TableName.META_TABLE_NAME).build();
+    RegionInfo hri = RegionInfoBuilder.newBuilder(tableDesc.getTableName()).build();
+    byte[] startRow = HConstants.EMPTY_START_ROW;
+    byte[] row1 = Bytes.toBytes("a,a,0");
+    byte[] row2 = Bytes.toBytes("aaaaa,,1");
+    byte[] row3 = Bytes.toBytes("aaaaa,\u0000\u0000,2");
+    byte[] row4 = Bytes.toBytes("aaaaa,\u0001,3");
+    byte[] row5 = Bytes.toBytes("aaaaa,a,4");
+    byte[] row6 = Bytes.toBytes("aaaaa,\u1000,5");
+
+    // Single row range at start of region
+    assertTrue(hri.containsRange(startRow, startRow));
+    // Fully contained range
+    assertTrue(hri.containsRange(row1, row2));
+    assertTrue(hri.containsRange(row2, row3));
+    assertTrue(hri.containsRange(row3, row4));
+    assertTrue(hri.containsRange(row4, row5));
+    assertTrue(hri.containsRange(row5, row6));
+    // Range overlapping start of region
+    assertTrue(hri.containsRange(startRow, row2));
+    // Fully contained single-row range
+    assertTrue(hri.containsRange(row1, row1));
+    // Degenerate range
+    try {
+      hri.containsRange(row3, row2);
+      fail("Invalid range did not throw IAE");
+    } catch (IllegalArgumentException iae) {
+    }
+  }
+
+  @Test
   public void testLastRegionCompare() {
     TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(name.getTableName()).build();
     RegionInfo rip = RegionInfoBuilder.newBuilder(tableDesc.getTableName())
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
index 474f772..2864986 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase;
 import java.nio.ByteBuffer;
 import java.util.Comparator;
 import org.apache.hadoop.hbase.util.ByteBufferUtils;
+import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.yetus.audience.InterfaceStability;
 
@@ -83,6 +84,17 @@ public interface CellComparator extends Comparator<Cell> {
   int compareRows(Cell cell, byte[] bytes, int offset, int length);
 
   /**
+   * Compares two row bytes
+   * @param leftRow the byte array of the left row
+   * @param rightRow the byte array of the right row
+   * @return greater than 0 if leftRow is bigger, less than 0 if rightRow is bigger, 0 if both
+   *         rows are equal
+   */
+  default int compareRows(byte[] leftRow, byte[] rightRow) {
+    return Bytes.compareTo(leftRow, rightRow);
+  }
+
+  /**
    * @param row ByteBuffer that wraps a row; will read from current position and will reading all
    *            remaining; will not disturb the ByteBuffer internal state.
    * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is bigger, 0 if both
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/MetaCellComparator.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/MetaCellComparator.java
index 4c18cfe..5adb1e8 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/MetaCellComparator.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/MetaCellComparator.java
@@ -56,6 +56,11 @@ public class MetaCellComparator extends CellComparatorImpl {
   }
 
   @Override
+  public int compareRows(byte[] leftRow, byte[] rightRow) {
+    return compareRows(leftRow, 0, leftRow.length, rightRow, 0, rightRow.length);
+  }
+
+  @Override
   public int compare(final Cell a, final Cell b, boolean ignoreSequenceid) {
     int diff = compareRows(a, b);
     if (diff != 0) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInfo.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInfo.java
index 2874206..56a8ea0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInfo.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInfo.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtil;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.RegionInfoBuilder;
@@ -263,6 +264,39 @@ public class TestRegionInfo {
   }
 
   @Test
+  public void testContainsRangeForMetaTable() {
+    TableDescriptor tableDesc =
+        TableDescriptorBuilder.newBuilder(TableName.META_TABLE_NAME).build();
+    RegionInfo hri = RegionInfoBuilder.newBuilder(tableDesc.getTableName()).build();
+    byte[] startRow = HConstants.EMPTY_START_ROW;
+    byte[] row1 = Bytes.toBytes("a,a,0");
+    byte[] row2 = Bytes.toBytes("aaaaa,,1");
+    byte[] row3 = Bytes.toBytes("aaaaa,\u0000\u0000,2");
+    byte[] row4 = Bytes.toBytes("aaaaa,\u0001,3");
+    byte[] row5 = Bytes.toBytes("aaaaa,a,4");
+    byte[] row6 = Bytes.toBytes("aaaaa,\u1000,5");
+
+    // Single row range at start of region
+    assertTrue(hri.containsRange(startRow, startRow));
+    // Fully contained range
+    assertTrue(hri.containsRange(row1, row2));
+    assertTrue(hri.containsRange(row2, row3));
+    assertTrue(hri.containsRange(row3, row4));
+    assertTrue(hri.containsRange(row4, row5));
+    assertTrue(hri.containsRange(row5, row6));
+    // Range overlapping start of region
+    assertTrue(hri.containsRange(startRow, row2));
+    // Fully contained single-row range
+    assertTrue(hri.containsRange(row1, row1));
+    // Degenerate range
+    try {
+      hri.containsRange(row3, row2);
+      fail("Invalid range did not throw IAE");
+    } catch (IllegalArgumentException iae) {
+    }
+  }
+
+  @Test
   public void testLastRegionCompare() {
     TableDescriptor tableDesc =
       TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())).build();