diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java index d2423b3..d25ec70 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -667,34 +667,10 @@ public class HTable implements Table { public long incrementColumnValue(final byte [] row, final byte [] family, final byte [] qualifier, final long amount, final Durability durability) throws IOException { - NullPointerException npe = null; - if (row == null) { - npe = new NullPointerException("row is null"); - } else if (family == null) { - npe = new NullPointerException("family is null"); - } else if (qualifier == null) { - npe = new NullPointerException("qualifier is null"); - } - if (npe != null) { - throw new IOException( - "Invalid arguments to incrementColumnValue", npe); - } - - NoncedRegionServerCallable callable = - new NoncedRegionServerCallable(this.connection, this.rpcControllerFactory, getName(), - row) { - @Override - protected Long call(PayloadCarryingRpcController controller) throws Exception { - MutateRequest request = RequestConverter.buildIncrementRequest( - getLocation().getRegionInfo().getRegionName(), row, family, - qualifier, amount, durability, getNonceGroup(), getNonce()); - MutateResponse response = getStub().mutate(controller, request); - Result result = ProtobufUtil.toResult(response.getResult(), controller.cellScanner()); - return Long.valueOf(Bytes.toLong(result.getValue(family, qualifier))); - } - }; - return rpcCallerFactory. newCaller(this.writeRpcTimeout). - callWithRetries(callable, this.operationTimeout); + Increment inc = new Increment(row); + inc.addColumn(family, qualifier, amount) + .setDurability(durability); + return Bytes.toLong(increment(inc).getValue(family, qualifier)); } /** diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java index 187c077..58ac564 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java @@ -123,9 +123,7 @@ public class Increment extends Mutation implements Comparable { if (family == null) { throw new IllegalArgumentException("family cannot be null"); } - if (qualifier == null) { - throw new IllegalArgumentException("qualifier cannot be null"); - } + List list = getCellList(family); KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount)); list.add(kv); diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index b75d2b8..69a2e07 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -148,46 +148,6 @@ public final class RequestConverter { } /** - * Create a protocol buffer MutateRequest for a client increment - * - * @param regionName - * @param row - * @param family - * @param qualifier - * @param amount - * @param durability - * @return a mutate request - */ - public static MutateRequest buildIncrementRequest( - final byte[] regionName, final byte[] row, final byte[] family, final byte[] qualifier, - final long amount, final Durability durability, long nonceGroup, long nonce) { - MutateRequest.Builder builder = MutateRequest.newBuilder(); - RegionSpecifier region = buildRegionSpecifier( - RegionSpecifierType.REGION_NAME, regionName); - builder.setRegion(region); - - MutationProto.Builder mutateBuilder = MutationProto.newBuilder(); - mutateBuilder.setRow(ByteStringer.wrap(row)); - mutateBuilder.setMutateType(MutationType.INCREMENT); - mutateBuilder.setDurability(ProtobufUtil.toDurability(durability)); - ColumnValue.Builder columnBuilder = ColumnValue.newBuilder(); - columnBuilder.setFamily(ByteStringer.wrap(family)); - QualifierValue.Builder valueBuilder = QualifierValue.newBuilder(); - valueBuilder.setValue(ByteStringer.wrap(Bytes.toBytes(amount))); - valueBuilder.setQualifier(ByteStringer.wrap(qualifier)); - columnBuilder.addQualifierValue(valueBuilder.build()); - mutateBuilder.addColumnValue(columnBuilder.build()); - if (nonce != HConstants.NO_NONCE) { - mutateBuilder.setNonce(nonce); - } - builder.setMutation(mutateBuilder.build()); - if (nonceGroup != HConstants.NO_NONCE) { - builder.setNonceGroup(nonceGroup); - } - return builder.build(); - } - - /** * Create a protocol buffer MutateRequest for a conditioned put * * @param regionName diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java index 3ddfef4..dd6e122 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.IOException; +import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; @@ -143,10 +144,24 @@ public class TestIncrementsFromClientSide { ht.incrementColumnValue(ROW, FAMILY, COLUMN, 5); - Get get = new Get(ROW); - Result r = ht.get(get); - assertEquals(1, r.size()); - assertEquals(5, Bytes.toLong(r.getValue(FAMILY, COLUMN))); + // try null qualifier + Get get1 = new Get(ROW); + Result r1 = ht.get(get1); + assertEquals(1, r1.size()); + assertEquals(5, Bytes.toLong(r1.getValue(FAMILY, COLUMN))); + + ht.incrementColumnValue(ROW, FAMILY, null, 5); + TEST_UTIL.flush(TABLENAME); + + Delete de2 = new Delete(ROW); + de2.addColumn(FAMILY, null); + ht.delete(de2); + + ht.incrementColumnValue(ROW, FAMILY, null, 5); + Get get2 = new Get(ROW); + Result r2 = ht.get(get2); + assertEquals(2, r2.size()); + assertEquals(5, Bytes.toLong(r2.getValue(FAMILY, null))); } @Test @@ -177,6 +192,26 @@ public class TestIncrementsFromClientSide { } @Test + public void testIncrementWithNullQualifier() throws Exception { + LOG.info("Starting " + this.name.getMethodName()); + final TableName TABLENAME = + TableName.valueOf(filterStringSoTableNameSafe(this.name.getMethodName())); + Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY); + Result result = ht.get(new Get(ROW)); + byte[] value = result.getValue(FAMILY, null); + long defaultValue = value == null ? 0 : Bytes.toLong(value); + + Increment inc = new Increment(ROW); + inc.addColumn(FAMILY, null, 100); + ht.increment(inc); + assertEquals(100 + defaultValue, + Bytes.toLong(ht.get(new Get(ROW)).getValue(FAMILY, null))); + + assertEquals(100 + 100 + defaultValue, + ht.incrementColumnValue(ROW, FAMILY, null, 100)); + } + + @Test public void testIncrementInvalidArguments() throws Exception { LOG.info("Starting " + this.name.getMethodName()); final TableName TABLENAME = @@ -187,23 +222,10 @@ public class TestIncrementsFromClientSide { // try null row ht.incrementColumnValue(null, FAMILY, COLUMN, 5); fail("Should have thrown IOException"); - } catch (IOException iox) { - // success - } - try { - // try null family - ht.incrementColumnValue(ROW, null, COLUMN, 5); - fail("Should have thrown IOException"); - } catch (IOException iox) { - // success - } - try { - // try null qualifier - ht.incrementColumnValue(ROW, FAMILY, null, 5); - fail("Should have thrown IOException"); - } catch (IOException iox) { + } catch (NullPointerException iox) { // success } + // try null row try { Increment incNoRow = new Increment((byte [])null); @@ -222,14 +244,6 @@ public class TestIncrementsFromClientSide { } catch (IllegalArgumentException iax) { // success } - // try null qualifier - try { - Increment incNoQualifier = new Increment(ROW); - incNoQualifier.addColumn(FAMILY, null, 5); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException iax) { - // success - } } @Test