diff --git a/CHANGES.txt b/CHANGES.txt index 3e62f4b1fc2..53be10df209 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -11,6 +11,7 @@ Release 0.92.1 - Unreleased of the writer threads has exceptions. (Ram) HBASE-5243 LogSyncerThread not getting shutdown waiting for the interrupted flag (Ram) HBASE-5255 Use singletons for OperationStatus to save memory (Benoit) + HBASE-5345 CheckAndPut doesn't work when value is empty byte[] (Evert Arckens) TESTS HBASE-5223 TestMetaReaderEditor is missing call to CatalogTracker.stop() diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 25cb31d5313..389b985f64b 100644 --- a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -93,6 +93,7 @@ import org.apache.hadoop.hbase.client.coprocessor.ExecResult; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.IncompatibleFilterException; +import org.apache.hadoop.hbase.filter.NullComparator; import org.apache.hadoop.hbase.filter.WritableByteArrayComparable; import org.apache.hadoop.hbase.io.HeapSize; import org.apache.hadoop.hbase.io.TimeRange; @@ -2275,6 +2276,9 @@ public class HRegion implements HeapSize { // , Writable{ boolean matches = false; if (result.size() == 0 && valueIsNull) { matches = true; + } else if (result.size() > 0 && result.get(0).getValue().length == 0 && + valueIsNull) { + matches = true; } else if (result.size() == 1 && !valueIsNull) { KeyValue kv = result.get(0); int compareResult = comparator.compareTo(kv.getBuffer(), diff --git a/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index 2755179ff2f..97c624d41a0 100644 --- a/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ b/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -593,12 +593,22 @@ public class TestHRegion extends HBaseTestCase { //Setting up region String method = this.getName(); initHRegion(tableName, method, fam1); - //Putting data in key + + //Putting empty data in key Put put = new Put(row1); + put.add(fam1, qf1, emptyVal); + + //checkAndPut with empty value + boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOp.EQUAL, + new BinaryComparator(emptyVal), put, lockId, true); + assertTrue(res); + + //Putting data in key + put = new Put(row1); put.add(fam1, qf1, val1); //checkAndPut with correct value - boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOp.EQUAL, + res = region.checkAndMutate(row1, fam1, qf1, CompareOp.EQUAL, new BinaryComparator(emptyVal), put, lockId, true); assertTrue(res);