diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java index 327b501..f7c0843 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java @@ -2820,6 +2820,14 @@ public class HConnectionManager { throws IOException { return getHTableDescriptor(TableName.valueOf(tableName)); } + + /** + * @return true when this connection uses a {@link org.apache.hadoop.hbase.codec.Codec} and so + * supports cell blocks. + */ + public boolean hasCellBlockSupport() { + return this.rpcClient.hasCellBlockSupport(); + } } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MultiServerCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MultiServerCallable.java index 57ea476..1241e02 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MultiServerCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MultiServerCallable.java @@ -19,16 +19,15 @@ package org.apache.hadoop.hbase.client; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; -import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScannable; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HConnectionManager.HConnectionImplementation; import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController; import org.apache.hadoop.hbase.ipc.RpcControllerFactory; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; @@ -127,11 +126,9 @@ class MultiServerCallable extends RegionServerCallable { // This is not exact -- the configuration could have changed on us after connection was set up // but it will do for now. HConnection connection = getConnection(); - if (connection == null) return true; // Default is to do cellblocks. - Configuration configuration = connection.getConfiguration(); - if (configuration == null) return true; - String codec = configuration.get(HConstants.RPC_CODEC_CONF_KEY, ""); - return codec != null && codec.length() > 0; + // Default is to do cellblocks. + if (!(connection instanceof HConnectionImplementation)) return true; + return ((HConnectionImplementation) connection).hasCellBlockSupport(); } @Override diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java index 7f11038..7080d1e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java @@ -1724,6 +1724,14 @@ public class RpcClient { } /** + * @return true when this client uses a {@link org.apache.hadoop.hbase.codec.Codec} and so + * supports cell blocks. + */ + public boolean hasCellBlockSupport() { + return this.codec != null; + } + + /** * Blocking rpc channel that goes via hbase rpc. */ // Public so can be subclassed for tests. diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java index cee0ace..e173ab1 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java @@ -1137,10 +1137,6 @@ public final class ProtobufUtil { valueBuilder.setValue(ByteStringer.wrap( kv.getValueArray(), kv.getValueOffset(), kv.getValueLength())); valueBuilder.setTimestamp(kv.getTimestamp()); - if(cell.getTagsLengthUnsigned() > 0) { - valueBuilder.setTags(ByteStringer.wrap(kv.getTagsArray(), kv.getTagsOffset(), - kv.getTagsLengthUnsigned())); - } if (type == MutationType.DELETE || (type == MutationType.PUT && CellUtil.isDelete(kv))) { KeyValue.Type keyValueType = KeyValue.Type.codeToType(kv.getType()); valueBuilder.setDeleteType(toDeleteType(keyValueType)); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index 30ceb09..650f7ad 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -663,8 +663,15 @@ public final class RequestConverter { cells.add(i); builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutationNoData( MutationType.INCREMENT, i, mutationBuilder, action.getNonce()))); + } else if (row instanceof RegionCoprocessorServiceExec) { + RegionCoprocessorServiceExec exec = (RegionCoprocessorServiceExec) row; + builder.addAction(actionBuilder.setServiceCall(ClientProtos.CoprocessorServiceCall + .newBuilder().setRow(ByteStringer.wrap(exec.getRow())) + .setServiceName(exec.getMethod().getService().getFullName()) + .setMethodName(exec.getMethod().getName()) + .setRequest(exec.getRequest().toByteString()))); } else if (row instanceof RowMutations) { - continue; // ignore RowMutations + throw new UnsupportedOperationException("No RowMutations in multi calls; use mutateRow"); } else { throw new DoNotRetryIOException("Multi doesn't support " + row.getClass().getName()); } diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java index 0405579..781f840 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java @@ -204,6 +204,11 @@ public class TestAsyncProcess { final byte[] row) { return loc1; } + + @Override + public boolean hasCellBlockSupport() { + return false; + } } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java index fae0a08..7bdc489 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java @@ -135,10 +135,15 @@ public class CoprocessorHConnection extends HConnectionImplementation { public Message callBlockingMethod(MethodDescriptor method, RpcController controller, Message request, Message responsePrototype) throws ServiceException { try { - Pair ret = rpc.call(blocking, method, request, null, timestamp, - status); - if (ret.getSecond() != null) { - PayloadCarryingRpcController rpcc = (PayloadCarryingRpcController) controller; + PayloadCarryingRpcController rpcc = null; + CellScanner cellScanner = null; + if (controller instanceof PayloadCarryingRpcController) { + rpcc = (PayloadCarryingRpcController) controller; + cellScanner = rpcc.cellScanner(); + } + Pair ret = rpc.call(blocking, method, request, cellScanner, + timestamp, status); + if (rpcc != null && ret.getSecond() != null) { rpcc.setCellScanner(ret.getSecond()); } return ret.getFirst(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java index 179045b..60b3e46 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java @@ -51,7 +51,6 @@ import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.TableNotFoundException; -import org.apache.hadoop.hbase.Tag; import org.apache.hadoop.hbase.client.Append; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; @@ -2386,32 +2385,6 @@ public class TestAccessController extends SecureTestUtil { } @Test - public void testReservedCellTags() throws Exception { - AccessTestAction putWithReservedTag = new AccessTestAction() { - @Override - public Object run() throws Exception { - HTable t = new HTable(conf, TEST_TABLE); - try { - KeyValue kv = new KeyValue(TEST_ROW, TEST_FAMILY, TEST_QUALIFIER, - HConstants.LATEST_TIMESTAMP, HConstants.EMPTY_BYTE_ARRAY, - new Tag[] { new Tag(AccessControlLists.ACL_TAG_TYPE, - ProtobufUtil.toUsersAndPermissions(USER_OWNER.getShortName(), - new Permission(Permission.Action.READ)).toByteArray()) }); - t.put(new Put(TEST_ROW).add(kv)); - } finally { - t.close(); - } - return null; - } - }; - - // Current user is superuser - verifyAllowed(putWithReservedTag, User.getCurrent()); - // No other user should be allowed - verifyDenied(putWithReservedTag, USER_OWNER, USER_ADMIN, USER_CREATE, USER_RW, USER_RO); - } - - @Test public void testGetNamespacePermission() throws Exception { String namespace = "testNamespace"; NamespaceDescriptor desc = NamespaceDescriptor.create(namespace).build();