This is an automated email from the ASF dual-hosted git repository.
meiyi pushed a commit to branch branch-2.4
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.4 by this push:
new a3940af HBASE-24734 RegionInfo#containsRange should support check
meta table (#3496) (#3517)
a3940af is described below
commit a3940afd25f8e9f49da9713d6c43f7e27728175f
Author: meiyi <[email protected]>
AuthorDate: Thu Jul 22 18:04:24 2021 +0800
HBASE-24734 RegionInfo#containsRange should support check meta table
(#3496) (#3517)
Signed-off-by: zhangduo <[email protected]>
---
.../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/TestHRegionInfo.java | 33 +++++++++++++++++++++
5 files changed, 93 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 0d2b7cc..60636d2 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;
@@ -137,6 +138,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/TestHRegionInfo.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java
index 3e00540..698ee8f 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HTableDescriptor;
+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;
@@ -251,6 +252,38 @@ public class TestHRegionInfo {
}
@Test
+ public void testContainsRangeForMetaTable() {
+ HTableDescriptor tableDesc = new
HTableDescriptor(TableName.META_TABLE_NAME);
+ 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() {
HTableDescriptor tableDesc = new
HTableDescriptor(TableName.valueOf(name.getMethodName()));
HRegionInfo hrip = new HRegionInfo(