1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.client;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.Map;
25
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.CellScannable;
28 import org.apache.hadoop.hbase.DoNotRetryIOException;
29 import org.apache.hadoop.hbase.HConstants;
30 import org.apache.hadoop.hbase.HRegionLocation;
31 import org.apache.hadoop.hbase.TableName;
32 import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController;
33 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
34 import org.apache.hadoop.hbase.protobuf.RequestConverter;
35 import org.apache.hadoop.hbase.protobuf.ResponseConverter;
36 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
37 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
38 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;
39 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;
40 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionAction;
41
42 import com.google.protobuf.ServiceException;
43
44
45
46
47
48
49
50 class MultiServerCallable<R> extends RegionServerCallable<MultiResponse> {
51 private final MultiAction<R> multiAction;
52 private final boolean cellBlock;
53
54 MultiServerCallable(final HConnection connection, final TableName tableName,
55 final HRegionLocation location, final MultiAction<R> multi) {
56 super(connection, tableName, null);
57 this.multiAction = multi;
58 setLocation(location);
59 this.cellBlock = isCellBlock();
60 }
61
62 MultiAction<R> getMulti() {
63 return this.multiAction;
64 }
65
66 @Override
67 public MultiResponse call() throws IOException {
68 int countOfActions = this.multiAction.size();
69 if (countOfActions <= 0) throw new DoNotRetryIOException("No Actions");
70 MultiRequest.Builder multiRequestBuilder = MultiRequest.newBuilder();
71 RegionAction.Builder regionActionBuilder = RegionAction.newBuilder();
72 ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder();
73 MutationProto.Builder mutationBuilder = MutationProto.newBuilder();
74 List<CellScannable> cells = null;
75
76 long nonceGroup = multiAction.getNonceGroup();
77 if (nonceGroup != HConstants.NO_NONCE) {
78 multiRequestBuilder.setNonceGroup(nonceGroup);
79 }
80 for (Map.Entry<byte[], List<Action<R>>> e: this.multiAction.actions.entrySet()) {
81 final byte [] regionName = e.getKey();
82 final List<Action<R>> actions = e.getValue();
83 regionActionBuilder.clear();
84 regionActionBuilder.setRegion(RequestConverter.buildRegionSpecifier(
85 HBaseProtos.RegionSpecifier.RegionSpecifierType.REGION_NAME, regionName) );
86
87
88 if (this.cellBlock) {
89
90 if (cells == null) cells = new ArrayList<CellScannable>(countOfActions);
91
92
93 regionActionBuilder = RequestConverter.buildNoDataRegionAction(regionName, actions, cells,
94 regionActionBuilder, actionBuilder, mutationBuilder);
95 } else {
96 regionActionBuilder = RequestConverter.buildRegionAction(regionName, actions,
97 regionActionBuilder, actionBuilder, mutationBuilder);
98 }
99 multiRequestBuilder.addRegionAction(regionActionBuilder.build());
100 }
101
102
103
104 PayloadCarryingRpcController controller = new PayloadCarryingRpcController(cells);
105 controller.setPriority(getTableName());
106 ClientProtos.MultiResponse responseProto;
107 ClientProtos.MultiRequest requestProto = multiRequestBuilder.build();
108 try {
109 responseProto = getStub().multi(controller, requestProto);
110 } catch (ServiceException e) {
111 throw ProtobufUtil.getRemoteException(e);
112 }
113 return ResponseConverter.getResults(requestProto, responseProto, controller.cellScanner());
114 }
115
116
117
118
119
120
121
122 private boolean isCellBlock() {
123
124
125 HConnection connection = getConnection();
126 if (connection == null) return true;
127 Configuration configuration = connection.getConfiguration();
128 if (configuration == null) return true;
129 String codec = configuration.get(HConstants.RPC_CODEC_CONF_KEY, "");
130 return codec != null && codec.length() > 0;
131 }
132
133 @Override
134 public void prepare(boolean reload) throws IOException {
135
136 setStub(getConnection().getClient(getLocation().getServerName()));
137 }
138 }