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