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)));
+    }
+  }
 }