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.HConnection;
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 HConnection connection;
43 private final ServerName serverName;
44
45 public RegionServerCoprocessorRpcChannel(HConnection 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
57 final ClientProtos.CoprocessorServiceCall call =
58 ClientProtos.CoprocessorServiceCall.newBuilder()
59 .setRow(ByteStringer.wrap(HConstants.EMPTY_BYTE_ARRAY))
60 .setServiceName(method.getService().getFullName()).setMethodName(method.getName())
61 .setRequest(request.toByteString()).build();
62 CoprocessorServiceResponse result =
63 ProtobufUtil.execRegionServerService(connection.getClient(serverName), call);
64 Message response = null;
65 if (result.getValue().hasValue()) {
66 response =
67 responsePrototype.newBuilderForType().mergeFrom(result.getValue().getValue()).build();
68 } else {
69 response = responsePrototype.getDefaultInstanceForType();
70 }
71 if (LOG.isTraceEnabled()) {
72 LOG.trace("Result is value=" + response);
73 }
74 return response;
75 }
76 }