You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ha...@apache.org on 2022/02/16 03:23:10 UTC
[hbase] branch branch-2 updated: HBASE-26742 Comparator of NOT_EQUAL NULL is invalid for checkAndMutate (#4105)
This is an automated email from the ASF dual-hosted git repository.
haxiaolin pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new 6906291 HBASE-26742 Comparator of NOT_EQUAL NULL is invalid for checkAndMutate (#4105)
6906291 is described below
commit 69062916a38aac07eb2830f4ea06df1e923d4c2a
Author: Xiaolin Ha <ha...@apache.org>
AuthorDate: Wed Feb 16 11:08:33 2022 +0800
HBASE-26742 Comparator of NOT_EQUAL NULL is invalid for checkAndMutate (#4105)
Signed-off-by: Duo Zhang <zh...@apache.org>
---
.../apache/hadoop/hbase/regionserver/HRegion.java | 8 ++--
.../hadoop/hbase/client/TestCheckAndMutate.java | 51 +++++++++++++++++++++-
2 files changed, 54 insertions(+), 5 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index da22c5b..55ba3aa 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -4880,11 +4880,11 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
boolean valueIsNull =
comparator.getValue() == null || comparator.getValue().length == 0;
if (result.isEmpty() && valueIsNull) {
- matches = true;
- } else if (result.size() > 0 && result.get(0).getValueLength() == 0 && valueIsNull) {
- matches = true;
+ matches = op != CompareOperator.NOT_EQUAL;
+ } else if (result.size() > 0 && valueIsNull) {
+ matches = (result.get(0).getValueLength() == 0) == (op != CompareOperator.NOT_EQUAL);
cellTs = result.get(0).getTimestamp();
- } else if (result.size() == 1 && !valueIsNull) {
+ } else if (result.size() == 1) {
Cell kv = result.get(0);
cellTs = kv.getTimestamp();
int compareResult = PrivateCellUtil.compareValue(kv, comparator);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java
index 51918d4..3b2b67a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
@@ -1218,4 +1217,54 @@ public class TestCheckAndMutate {
assertEquals("h", Bytes.toString(result.getValue(FAMILY, Bytes.toBytes("H"))));
}
}
+
+ @Test
+ public void testCheckAndMutateForNull() throws Exception {
+ byte[] qualifier = Bytes.toBytes("Q");
+ try (Table table = createTable()) {
+ byte [] row1 = Bytes.toBytes("testRow1");
+ Put put = new Put(row1);
+ put.addColumn(FAMILY, qualifier, Bytes.toBytes("v0"));
+ table.put(put);
+ assertEquals("v0", Bytes.toString(
+ table.get(new Get(row1).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
+
+ CheckAndMutate checkAndMutate1 = CheckAndMutate.newBuilder(row1)
+ .ifMatches(FAMILY, qualifier, CompareOperator.NOT_EQUAL, new byte[] {})
+ .build(new Put(row1).addColumn(FAMILY, qualifier, Bytes.toBytes("v1")));
+ table.checkAndMutate(checkAndMutate1);
+ assertEquals("v1", Bytes.toString(
+ table.get(new Get(row1).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
+
+ byte [] row2 = Bytes.toBytes("testRow2");
+ put = new Put(row2);
+ put.addColumn(FAMILY, qualifier, new byte[] {});
+ table.put(put);
+ assertEquals(0,
+ table.get(new Get(row2).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier).length);
+
+ CheckAndMutate checkAndMutate2 = CheckAndMutate.newBuilder(row2)
+ .ifMatches(FAMILY, qualifier, CompareOperator.EQUAL, new byte[] {})
+ .build(new Put(row2).addColumn(FAMILY, qualifier, Bytes.toBytes("v2")));
+ table.checkAndMutate(checkAndMutate2);
+ assertEquals("v2", Bytes.toString(
+ table.get(new Get(row2).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
+
+ byte [] row3 = Bytes.toBytes("testRow3");
+ put = new Put(row3).addColumn(FAMILY, qualifier, Bytes.toBytes("v0"));
+ assertNull(table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier));
+ CheckAndMutate checkAndMutate3 = CheckAndMutate.newBuilder(row3)
+ .ifMatches(FAMILY, qualifier, CompareOperator.NOT_EQUAL, new byte[] {})
+ .build(put);
+ table.checkAndMutate(checkAndMutate3);
+ assertNull(table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier));
+
+ CheckAndMutate checkAndMutate4 = CheckAndMutate.newBuilder(row3)
+ .ifMatches(FAMILY, qualifier, CompareOperator.EQUAL, new byte[] {})
+ .build(put);
+ table.checkAndMutate(checkAndMutate4);
+ assertEquals("v0", Bytes.toString(
+ table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
+ }
+ }
}