You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2013/12/26 06:29:39 UTC

svn commit: r1553453 - in /hbase/trunk/hbase-server/src: main/java/org/apache/hadoop/hbase/regionserver/HRegion.java test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java

Author: tedyu
Date: Thu Dec 26 05:29:39 2013
New Revision: 1553453

URL: http://svn.apache.org/r1553453
Log:
HBASE-7226 HRegion.checkAndMutate uses incorrect comparison result for <, <=, > and >=


Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1553453&r1=1553452&r2=1553453&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Thu Dec 26 05:29:39 2013
@@ -2601,10 +2601,10 @@ public class HRegion implements HeapSize
               kv.getValueOffset(), kv.getValueLength());
           switch (compareOp) {
           case LESS:
-            matches = compareResult <= 0;
+            matches = compareResult < 0;
             break;
           case LESS_OR_EQUAL:
-            matches = compareResult < 0;
+            matches = compareResult <= 0;
             break;
           case EQUAL:
             matches = compareResult == 0;
@@ -2613,10 +2613,10 @@ public class HRegion implements HeapSize
             matches = compareResult != 0;
             break;
           case GREATER_OR_EQUAL:
-            matches = compareResult > 0;
+            matches = compareResult >= 0;
             break;
           case GREATER:
-            matches = compareResult >= 0;
+            matches = compareResult > 0;
             break;
           default:
             throw new RuntimeException("Unknown Compare op " + compareOp.name());

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=1553453&r1=1553452&r2=1553453&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java Thu Dec 26 05:29:39 2013
@@ -1033,6 +1033,101 @@ public class TestHRegion {
   }
 
   @Test
+  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {
+    byte[] row1 = Bytes.toBytes("row1");
+    byte[] fam1 = Bytes.toBytes("fam1");
+    byte[] qf1 = Bytes.toBytes("qualifier");
+    byte[] val1 = Bytes.toBytes("value1");
+    byte[] val2 = Bytes.toBytes("value2");
+    byte[] val3 = Bytes.toBytes("value3");
+    byte[] val4 = Bytes.toBytes("value4");
+
+    // Setting up region
+    String method = this.getName();
+    this.region = initHRegion(tableName, method, conf, fam1);
+    try {
+      // Putting val3 in key
+      Put put = new Put(row1);
+      put.add(fam1, qf1, val3);
+      region.put(put);
+
+      // Test CompareOp.LESS: original = val3, compare with val3, fail
+      boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS,
+          new BinaryComparator(val3), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.LESS: original = val3, compare with val4, fail
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS,
+          new BinaryComparator(val4), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.LESS: original = val3, compare with val2,
+      // succeed (now value = val2)
+      put = new Put(row1);
+      put.add(fam1, qf1, val2);
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS,
+          new BinaryComparator(val2), put, true);
+      assertEquals(true, res);
+
+      // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS_OR_EQUAL,
+          new BinaryComparator(val3), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,
+      // succeed (value still = val2)
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS_OR_EQUAL,
+          new BinaryComparator(val2), put, true);
+      assertEquals(true, res);
+
+      // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,
+      // succeed (now value = val3)
+      put = new Put(row1);
+      put.add(fam1, qf1, val3);
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.LESS_OR_EQUAL,
+          new BinaryComparator(val1), put, true);
+      assertEquals(true, res);
+
+      // Test CompareOp.GREATER: original = val3, compare with val3, fail
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER,
+          new BinaryComparator(val3), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.GREATER: original = val3, compare with val2, fail
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER,
+          new BinaryComparator(val2), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.GREATER: original = val3, compare with val4,
+      // succeed (now value = val2)
+      put = new Put(row1);
+      put.add(fam1, qf1, val2);
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER,
+          new BinaryComparator(val4), put, true);
+      assertEquals(true, res);
+
+      // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER_OR_EQUAL,
+          new BinaryComparator(val1), put, true);
+      assertEquals(false, res);
+
+      // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,
+      // succeed (value still = val2)
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER_OR_EQUAL,
+          new BinaryComparator(val2), put, true);
+      assertEquals(true, res);
+
+      // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed
+      res = region.checkAndMutate(row1, fam1, qf1, CompareOp.GREATER_OR_EQUAL,
+          new BinaryComparator(val3), put, true);
+      assertEquals(true, res);
+    } finally {
+      HRegion.closeHRegion(this.region);
+      this.region = null;
+    }
+  }
+
+  @Test
   public void testCheckAndPut_ThatPutWasWritten() throws IOException {
     byte[] row1 = Bytes.toBytes("row1");
     byte[] fam1 = Bytes.toBytes("fam1");