You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2012/09/27 23:07:13 UTC
svn commit: r1391219 -
/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
Author: mbautin
Date: Thu Sep 27 21:07:13 2012
New Revision: 1391219
URL: http://svn.apache.org/viewvc?rev=1391219&view=rev
Log:
[HBASE-3793] NPE for checkAndPut API when client passes a NULL as the expected value
Author: liyintang
Summary:
There is a NPE when the client passes a NULL as the expected value for the checkAndPut API. According to the javadoc, the NULL expected value means HBase shall atomically execute a Put if that row does NOT has a value currently. However, the code has a bug when handling this NULL expected value.
Test Plan: not tested. Going to test it on the ods shadow.
Reviewers: kannan, kranganathan
Reviewed By: kannan
CC: hbase-eng@, vinodv
Differential Revision: https://phabricator.fb.com/D585826
Task ID: 1761087
Modified:
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1391219&r1=1391218&r2=1391219&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Thu Sep 27 21:07:13 2012
@@ -2172,23 +2172,24 @@ public class HRegion implements HeapSize
Get get = new Get(row, lock);
checkFamily(family);
get.addColumn(family, qualifier);
-
// Lock row
Integer lid = getLock(lockId, get.getRow(), true);
List<KeyValue> result = new ArrayList<KeyValue>();
try {
result = get(get);
-
boolean matches = false;
- if (result.size() == 0
- && (expectedValue == null || expectedValue.length == 0)) {
- matches = true;
+
+ if (result.size() == 0) {
+ if (expectedValue == null ) {
+ matches = true;
+ }
} else if (result.size() == 1) {
- // Compare the expected value with the actual value without copying anything
- KeyValue kv = result.get(0);
- matches = Bytes.equals(
- expectedValue, 0, expectedValue.length,
- kv.getBuffer(), kv.getValueOffset(), kv.getValueLength());
+ if (expectedValue != null) {
+ // Compare the expected value with the actual value without copying anything
+ KeyValue kv = result.get(0);
+ matches = Bytes.equals(expectedValue, 0, expectedValue.length,
+ kv.getBuffer(), kv.getValueOffset(), kv.getValueLength());
+ }
} else {
throw new IOException("Internal error: more than one result returned for row/column");
}