From 9601ab2272fc0f81478004643f78f7080071b29e Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Tue, 20 Mar 2018 22:56:41 -0700 Subject: [PATCH] HBASE-20237 Put back getClosestRowBefore and throw UnsupportedOperation instead... for asynchbase client Throw exception if an old client connects. --- .../src/main/protobuf/Client.proto | 6 ++++++ hbase-protocol/src/main/protobuf/Client.proto | 5 +++++ .../hadoop/hbase/regionserver/RSRpcServices.java | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/hbase-protocol-shaded/src/main/protobuf/Client.proto b/hbase-protocol-shaded/src/main/protobuf/Client.proto index 642eb61c50..325b9c1460 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Client.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Client.proto @@ -81,6 +81,12 @@ message Get { // the existence. optional bool existence_only = 10 [default = false]; + // If the row to get doesn't exist, return the + // closest row before. Deprecated. No longer used! + // Since hbase-2.0.0 but left in place so can test + // for Gets with this set and throw Exception. + optional bool closest_row_before = 11 [default = false]; + optional Consistency consistency = 12 [default = STRONG]; repeated ColumnFamilyTimeRange cf_time_range = 13; optional bool load_column_families_on_demand = 14; /* DO NOT add defaults to load_column_families_on_demand. */ diff --git a/hbase-protocol/src/main/protobuf/Client.proto b/hbase-protocol/src/main/protobuf/Client.proto index 058bd4b066..9b4e3e1f9d 100644 --- a/hbase-protocol/src/main/protobuf/Client.proto +++ b/hbase-protocol/src/main/protobuf/Client.proto @@ -81,6 +81,11 @@ message Get { // the existence. optional bool existence_only = 10 [default = false]; + // If the row to get doesn't exist, return the + // closest row before. Deprecated. No longer used! + // Since hbase-2.0.0. + optional bool closest_row_before = 11 [default = false]; + optional Consistency consistency = 12 [default = STRONG]; repeated ColumnFamilyTimeRange cf_time_range = 13; optional bool load_column_families_on_demand = 14; /* DO NOT add defaults to load_column_families_on_demand. */ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index c559823bd5..f9d6798d02 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -85,6 +85,7 @@ import org.apache.hadoop.hbase.conf.ConfigurationObserver; import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException; import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException; import org.apache.hadoop.hbase.exceptions.ScannerResetException; +import org.apache.hadoop.hbase.exceptions.UnknownProtocolException; import org.apache.hadoop.hbase.filter.ByteArrayComparable; import org.apache.hadoop.hbase.ipc.HBaseRPCErrorHandler; import org.apache.hadoop.hbase.ipc.HBaseRpcController; @@ -816,8 +817,18 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } if (action.hasGet()) { long before = EnvironmentEdgeManager.currentTime(); + ClientProtos.Get pbGet = action.getGet(); + // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do + // a get closest before. Throwing the UnknownProtocolException signals it that it needs + // to switch and do hbase2 protocol (HBase servers do not tell clients what versions + // they are; its a problem for non-native clients like asynchbase. HBASE-20225. + if (pbGet.hasClosestRowBefore() && pbGet.getClosestRowBefore()) { + throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " + + "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " + + "reverse Scan."); + } try { - Get get = ProtobufUtil.toGet(action.getGet()); + Get get = ProtobufUtil.toGet(pbGet); if (context != null) { r = get(get, (region), closeCallBack, context); } else { @@ -2437,6 +2448,15 @@ public class RSRpcServices implements HBaseRPCErrorHandler, GetResponse.Builder builder = GetResponse.newBuilder(); ClientProtos.Get get = request.getGet(); + // An asynchbase client, https://github.com/OpenTSDB/asynchbase, starts by trying to do + // a get closest before. Throwing the UnknownProtocolException signals it that it needs + // to switch and do hbase2 protocol (HBase servers do not tell clients what versions + // they are; its a problem for non-native clients like asynchbase. HBASE-20225. + if (get.hasClosestRowBefore() && get.getClosestRowBefore()) { + throw new UnknownProtocolException("Is this a pre-hbase-1.0.0 or asynchbase client? " + + "Client is invoking getClosestRowBefore removed in hbase-2.0.0 replaced by " + + "reverse Scan."); + } Boolean existence = null; Result r = null; RpcCallContext context = RpcServer.getCurrentCall().orElse(null); -- 2.11.4.GIT