Author: stack
Date: Mon Jun 13 23:43:49 2011
New Revision: 1135342
URL: http://svn.apache.org/viewvc?rev=1135342&view=rev
Log:
HBASE-3793 HBASE-3468 Broke checkAndPut with null value
Modified:
hbase/trunk/CHANGES.txt
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
Modified: hbase/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1135342&r1=1135341&r2=1135342&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Mon Jun 13 23:43:49 2011
@@ -124,6 +124,7 @@ Release 0.91.0 - Unreleased
indicates to bypass default action (Ming Ma)
HBASE-3963 Schedule all log-spliiting at startup all at once (mingjian)
HBASE-3983 list command in shell seems broken
+ HBASE-3793 HBASE-3468 Broke checkAndPut with null value (Ming Ma)
IMPROVEMENTS
HBASE-3290 Max Compaction Size (Nicolas Spiegelberg via Stack)
Modified:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1135342&r1=1135341&r2=1135342&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
Mon Jun 13 23:43:49 2011
@@ -1774,11 +1774,12 @@ public class HRegion implements HeapSize
try {
result = get(get, false);
+ boolean valueIsNull = comparator.getValue() == null ||
+ comparator.getValue().length == 0;
boolean matches = false;
- if (result.size() == 0 &&
- (comparator.getValue() == null || comparator.getValue().length ==
0)) {
+ if (result.size() == 0 && valueIsNull) {
matches = true;
- } else if (result.size() == 1) {
+ } else if (result.size() == 1 && !valueIsNull) {
int compareResult = comparator.compareTo(result.get(0).getValue());
switch (compareOp) {
case LESS:
Modified:
hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java?rev=1135342&r1=1135341&r2=1135342&view=diff
==============================================================================
---
hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
(original)
+++
hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
Mon Jun 13 23:43:49 2011
@@ -4151,5 +4151,47 @@ public class TestFromClientSide {
}
executorService.shutdownNow();
}
+
+
+ @Test
+ public void testCheckAndPut() throws IOException {
+ final byte [] anotherrow = Bytes.toBytes("anotherrow");
+ final byte [] value2 = Bytes.toBytes("abcd");
+
+ HTable table = TEST_UTIL.createTable(Bytes.toBytes("testCheckAndPut"),
+ new byte [][] {FAMILY});
+ Put put1 = new Put(ROW);
+ put1.add(FAMILY, QUALIFIER, VALUE);
+
+ // row doesn't exist, so using non-null value should be considered "not
match".
+ boolean ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put1);
+ assertEquals(ok, false);
+
+ // row doesn't exist, so using "null" to check for existence should be
considered "match".
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1);
+ assertEquals(ok, true);
+
+ // row now exists, so using "null" to check for existence should be
considered "not match".
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1);
+ assertEquals(ok, false);
+
+ Put put2 = new Put(ROW);
+ put2.add(FAMILY, QUALIFIER, value2);
+
+ // row now exists, use the matching value to check
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put2);
+ assertEquals(ok, true);
+
+ Put put3 = new Put(anotherrow);
+ put3.add(FAMILY, QUALIFIER, VALUE);
+
+ // try to do CheckAndPut on different rows
+ try {
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, value2, put3);
+ fail("trying to check and modify different rows should have failed.");
+ } catch(Exception e) {}
+
+ }
+
}