1
2
3
4
5
6
7
8
9
10
11
12 package org.apache.hadoop.hbase.ipc;
13
14 import java.io.IOException;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.apache.hadoop.hbase.classification.InterfaceAudience;
19 import org.apache.hadoop.hbase.HConstants;
20 import org.apache.hadoop.hbase.ServerName;
21 import org.apache.hadoop.hbase.client.ClusterConnection;
22 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
23 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
24 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceResponse;
25 import org.apache.hadoop.hbase.util.ByteStringer;
26
27
28 import com.google.protobuf.Descriptors;
29 import com.google.protobuf.Message;
30
31
32
33
34
35
36
37
38
39 @InterfaceAudience.Private
40 public class RegionServerCoprocessorRpcChannel extends CoprocessorRpcChannel {
41 private static Log LOG = LogFactory.getLog(RegionServerCoprocessorRpcChannel.class);
42 private final ClusterConnection connection;
43 private final ServerName serverName;
44
45 public RegionServerCoprocessorRpcChannel(ClusterConnection conn, ServerName serverName) {
46 this.connection = conn;
47 this.serverName = serverName;
48 }
49
50 @Override
51 protected Message callExecService(Descriptors.MethodDescriptor method, Message request,
52 Message responsePrototype) throws IOException {
53 if (LOG.isTraceEnabled()) {
54 LOG.trace("Call: " + method.getName() + ", " + request.toString());
55 }
56 final ClientProtos.CoprocessorServiceCall call =
57 ClientProtos.CoprocessorServiceCall.newBuilder()
58 .setRow(ByteStringer.wrap(HConstants.EMPTY_BYTE_ARRAY))
59 .setServiceName(method.getService().getFullName()).setMethodName(method.getName())
60 .setRequest(request.toByteString()).build();
61 CoprocessorServiceResponse result =
62 ProtobufUtil.execRegionServerService(connection.getClient(serverName), call);
63 Message response = null;
64 if (result.getValue().hasValue()) {
65 response =
66 responsePrototype.newBuilderForType().mergeFrom(result.getValue().getValue()).build();
67 } else {
68 response = responsePrototype.getDefaultInstanceForType();
69 }
70 if (LOG.isTraceEnabled()) {
71 LOG.trace("Result is value=" + response);
72 }
73 return response;
74 }
75 }