From e2f0eaf042b79b0f096bf6b34eaa27dedcd2167c Mon Sep 17 00:00:00 2001 From: "daoye.ch" Date: Tue, 15 Nov 2016 21:54:26 +0800 Subject: [PATCH] HBASE-17096 checkAndMutateApi doesn't work correctly on 0.98.19+ --- .../org/apache/hadoop/hbase/client/HTable.java | 9 +++---- .../hadoop/hbase/client/TestFromClientSide3.java | 31 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java index ada451c..7b44a0a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -1319,13 +1319,10 @@ public class HTable implements HTableInterface { } RpcClient.setRpcTimeout(timeout); try { - RegionAction.Builder regionMutationBuilder = RequestConverter.buildRegionAction( - getLocation().getRegionInfo().getRegionName(), rm); - regionMutationBuilder.setAtomic(true); - MultiRequest request = - MultiRequest.newBuilder().addRegionAction(regionMutationBuilder.build()).build(); + MultiRequest request = RequestConverter.buildMutateRequest( + getLocation().getRegionInfo().getRegionName(), row, family, qualifier, + new BinaryComparator(value), CompareType.EQUAL, rm); ClientProtos.MultiResponse response = getStub().multi(controller, request); - response.getRegionActionResult(0).getResultOrException(0).getResult(); ClientProtos.RegionActionResult res = response.getRegionActionResultList().get(0); if (res.hasException()) { Throwable ex = ProtobufUtil.toException(res.getException()); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java index ca3ae8d..0308242 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java @@ -33,6 +33,7 @@ import java.util.Random; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HRegionLocation; @@ -490,4 +491,34 @@ public class TestFromClientSide3 { table.close(); } } + + @Test + public void testCheckAndMutateApi() throws Exception { + byte[] row = Bytes.toBytes("ROW"); + byte[] tableNameBytes = Bytes.toBytes("testCheckAndMutateApi"); + byte[] family = FAMILY; + byte[] qualifier = Bytes.toBytes("QUALIFIER"); + byte[] oldValue = null; + byte[] newValue = Bytes.toBytes("VALUE"); + Put put = new Put(row); + put.add(family, qualifier, newValue); + HBaseAdmin admin = TEST_UTIL.getHBaseAdmin(); + HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameBytes)); + HColumnDescriptor columnDesc = new HColumnDescriptor(family); + columnDesc.setTimeToLive(120); + tableDesc.addFamily(columnDesc); + admin.createTable(tableDesc); + HTable table = new HTable(TEST_UTIL.getConfiguration(), tableNameBytes); + try { + assertTrue(table.checkAndPut(row, family, qualifier, oldValue, put)); + Delete delete = new Delete(row); + RowMutations mutations = new RowMutations(row); + mutations.add(delete); + assertTrue(table.checkAndMutate(row, family, qualifier, CompareOp.EQUAL, newValue, mutations)); + assertFalse(table.checkAndMutate(row, family, qualifier, CompareOp.EQUAL, newValue, mutations)); + } finally { + table.close(); + } + } + } -- 2.9.3 (Apple Git-75)