You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2014/01/04 15:38:14 UTC
svn commit: r1555351 - in /hbase/trunk:
hbase-client/src/main/java/org/apache/hadoop/hbase/client/
hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/
hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/
hbase-server/src/test/jav...
Author: tedyu
Date: Sat Jan 4 14:38:14 2014
New Revision: 1555351
URL: http://svn.apache.org/r1555351
Log:
HBASE-5923 Cleanup checkAndXXX logic
Modified:
hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java
hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java Sat Jan 4 14:38:14 2014
@@ -53,6 +53,7 @@ import org.apache.hadoop.hbase.ServerNam
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
import org.apache.hadoop.hbase.filter.BinaryComparator;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController;
import org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel;
@@ -1148,6 +1149,31 @@ public class HTable implements HTableInt
return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean checkAndPut(final byte [] row, final byte [] family,
+ final byte [] qualifier, final CompareOp compareOp, final byte [] value,
+ final Put put)
+ throws IOException {
+ RegionServerCallable<Boolean> callable =
+ new RegionServerCallable<Boolean>(connection, getName(), row) {
+ public Boolean call() throws IOException {
+ try {
+ CompareType compareType = CompareType.valueOf(compareOp.name());
+ MutateRequest request = RequestConverter.buildMutateRequest(
+ getLocation().getRegionInfo().getRegionName(), row, family, qualifier,
+ new BinaryComparator(value), compareType, put);
+ MutateResponse response = getStub().mutate(null, request);
+ return Boolean.valueOf(response.getProcessed());
+ } catch (ServiceException se) {
+ throw ProtobufUtil.getRemoteException(se);
+ }
+ }
+ };
+ return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout);
+ }
/**
* {@inheritDoc}
@@ -1178,6 +1204,32 @@ public class HTable implements HTableInt
* {@inheritDoc}
*/
@Override
+ public boolean checkAndDelete(final byte [] row, final byte [] family,
+ final byte [] qualifier, final CompareOp compareOp, final byte [] value,
+ final Delete delete)
+ throws IOException {
+ RegionServerCallable<Boolean> callable =
+ new RegionServerCallable<Boolean>(connection, getName(), row) {
+ public Boolean call() throws IOException {
+ try {
+ CompareType compareType = CompareType.valueOf(compareOp.name());
+ MutateRequest request = RequestConverter.buildMutateRequest(
+ getLocation().getRegionInfo().getRegionName(), row, family, qualifier,
+ new BinaryComparator(value), compareType, delete);
+ MutateResponse response = getStub().mutate(null, request);
+ return Boolean.valueOf(response.getProcessed());
+ } catch (ServiceException se) {
+ throw ProtobufUtil.getRemoteException(se);
+ }
+ }
+ };
+ return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public boolean exists(final Get get) throws IOException {
get.setCheckExistenceOnly(true);
Result r = get(get);
Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java Sat Jan 4 14:38:14 2014
@@ -28,6 +28,7 @@ import org.apache.hadoop.hbase.TableName
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
import java.io.Closeable;
@@ -280,6 +281,8 @@ public interface HTableInterface extends
boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Put put) throws IOException;
+ boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Put put) throws IOException;
/**
* Deletes the specified cells/row.
*
@@ -318,6 +321,9 @@ public interface HTableInterface extends
boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Delete delete) throws IOException;
+ boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Delete delete) throws IOException;
+
/**
* Performs multiple mutations atomically on a single row. Currently
* {@link Put} and {@link Delete} are supported.
Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java Sat Jan 4 14:38:14 2014
@@ -31,6 +31,8 @@ import org.apache.hadoop.hbase.HTableDes
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
import org.apache.hadoop.hbase.client.coprocessor.Batch.Callback;
+import org.apache.hadoop.hbase.filter.BinaryComparator;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.PoolMap;
@@ -446,6 +448,13 @@ public class HTablePool implements Close
}
@Override
+ public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Put put) throws IOException {
+ checkState();
+ return table.checkAndPut(row, family, qualifier, compareOp, value, put);
+ }
+
+ @Override
public void delete(Delete delete) throws IOException {
checkState();
table.delete(delete);
@@ -465,6 +474,13 @@ public class HTablePool implements Close
}
@Override
+ public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Delete delete) throws IOException {
+ checkState();
+ return table.checkAndDelete(row, family, qualifier, compareOp, value, delete);
+ }
+
+ @Override
public Result increment(Increment increment) throws IOException {
checkState();
return table.increment(increment);
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java Sat Jan 4 14:38:14 2014
@@ -62,6 +62,7 @@ import org.apache.hadoop.hbase.client.Ro
import org.apache.hadoop.hbase.client.RowMutations;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.CoprocessorClassLoader;
@@ -453,11 +454,21 @@ public abstract class CoprocessorHost<E
return table.checkAndPut(row, family, qualifier, value, put);
}
+ public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Put put) throws IOException {
+ return table.checkAndPut(row, family, qualifier, compareOp, value, put);
+ }
+
public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Delete delete) throws IOException {
return table.checkAndDelete(row, family, qualifier, value, delete);
}
+ public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Delete delete) throws IOException {
+ return table.checkAndDelete(row, family, qualifier, compareOp, value, delete);
+ }
+
public long incrementColumnValue(byte[] row, byte[] family,
byte[] qualifier, long amount) throws IOException {
return table.incrementColumnValue(row, family, qualifier, amount);
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java Sat Jan 4 14:38:14 2014
@@ -53,6 +53,7 @@ import org.apache.hadoop.hbase.client.Ro
import org.apache.hadoop.hbase.client.RowMutations;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.io.TimeRange;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
import org.apache.hadoop.hbase.rest.Constants;
@@ -668,6 +669,11 @@ public class RemoteHTable implements HTa
throw new IOException("checkAndPut request timed out");
}
+ public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Put put) throws IOException {
+ throw new IOException("checkAndPut for non-equal comparison not implemented");
+ }
+
public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Delete delete) throws IOException {
Put put = new Put(row);
@@ -703,6 +709,11 @@ public class RemoteHTable implements HTa
throw new IOException("checkAndDelete request timed out");
}
+ public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
+ CompareOp compareOp, byte[] value, Delete delete) throws IOException {
+ throw new IOException("checkAndDelete for non-equal comparison not implemented");
+ }
+
public Result increment(Increment increment) throws IOException {
throw new IOException("Increment not supported");
}
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java?rev=1555351&r1=1555350&r2=1555351&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java Sat Jan 4 14:38:14 2014
@@ -4775,6 +4775,146 @@ public class TestFromClientSide {
}
+ @Test
+ public void testCheckAndPutWithCompareOp() throws IOException {
+ final byte [] value1 = Bytes.toBytes("aaaa");
+ final byte [] value2 = Bytes.toBytes("bbbb");
+ final byte [] value3 = Bytes.toBytes("cccc");
+ final byte [] value4 = Bytes.toBytes("dddd");
+
+ HTable table = TEST_UTIL.createTable(Bytes.toBytes("testCheckAndPutWithCompareOp"),
+ new byte [][] {FAMILY});
+
+ Put put2 = new Put(ROW);
+ put2.add(FAMILY, QUALIFIER, value2);
+
+ Put put3 = new Put(ROW);
+ put3.add(FAMILY, QUALIFIER, value3);
+
+ // row doesn't exist, so using "null" to check for existence should be considered "match".
+ boolean ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put2);
+ assertEquals(ok, true);
+
+ // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL
+ // turns out "match"
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value1, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value1, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value1, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value1, put2);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value1, put2);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value1, put3);
+ assertEquals(ok, true);
+
+ // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL
+ // turns out "match"
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value4, put3);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value4, put3);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value4, put3);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value4, put3);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value4, put3);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value4, put2);
+ assertEquals(ok, true);
+
+ // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL
+ // turns out "match"
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value2, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value2, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value2, put2);
+ assertEquals(ok, false);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value2, put2);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value2, put2);
+ assertEquals(ok, true);
+ ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value2, put3);
+ assertEquals(ok, true);
+ }
+
+ @Test
+ public void testCheckAndDeleteWithCompareOp() throws IOException {
+ final byte [] value1 = Bytes.toBytes("aaaa");
+ final byte [] value2 = Bytes.toBytes("bbbb");
+ final byte [] value3 = Bytes.toBytes("cccc");
+ final byte [] value4 = Bytes.toBytes("dddd");
+
+ HTable table = TEST_UTIL.createTable(Bytes.toBytes("testCheckAndDeleteWithCompareOp"),
+ new byte [][] {FAMILY});
+
+ Put put2 = new Put(ROW);
+ put2.add(FAMILY, QUALIFIER, value2);
+ table.put(put2);
+
+ Put put3 = new Put(ROW);
+ put3.add(FAMILY, QUALIFIER, value3);
+
+ Delete delete = new Delete(ROW);
+ delete.deleteColumns(FAMILY, QUALIFIER);
+
+ // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL
+ // turns out "match"
+ boolean ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value1, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value1, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value1, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value1, delete);
+ assertEquals(ok, true);
+ table.put(put2);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value1, delete);
+ assertEquals(ok, true);
+ table.put(put2);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value1, delete);
+ assertEquals(ok, true);
+
+ // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL
+ // turns out "match"
+ table.put(put3);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value4, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value4, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value4, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value4, delete);
+ assertEquals(ok, true);
+ table.put(put3);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value4, delete);
+ assertEquals(ok, true);
+ table.put(put3);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value4, delete);
+ assertEquals(ok, true);
+
+ // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL
+ // turns out "match"
+ table.put(put2);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value2, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value2, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value2, delete);
+ assertEquals(ok, false);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value2, delete);
+ assertEquals(ok, true);
+ table.put(put2);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value2, delete);
+ assertEquals(ok, true);
+ table.put(put2);
+ ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value2, delete);
+ assertEquals(ok, true);
+ }
+
/**
* Test ScanMetrics
* @throws Exception