1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.protobuf;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.hbase.classification.InterfaceAudience;
27 import org.apache.hadoop.hbase.Cell;
28 import org.apache.hadoop.hbase.CellScanner;
29 import org.apache.hadoop.hbase.DoNotRetryIOException;
30 import org.apache.hadoop.hbase.HRegionInfo;
31 import org.apache.hadoop.hbase.ServerName;
32 import org.apache.hadoop.hbase.client.Result;
33 import org.apache.hadoop.hbase.ipc.ServerRpcController;
34 import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.GetUserPermissionsResponse;
35 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionResponse;
36 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
37 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoResponse;
38 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionResponse;
39 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterResponse;
40 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ServerInfo;
41 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
42 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;
43 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionAction;
44 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionActionResult;
45 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ResultOrException;
46 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse;
47 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiResponse;
48 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
49 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.NameBytesPair;
50 import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.EnableCatalogJanitorResponse;
51 import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.RunCatalogScanResponse;
52 import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdResponse;
53 import org.apache.hadoop.hbase.regionserver.RegionOpeningState;
54 import org.apache.hadoop.hbase.security.access.UserPermission;
55 import org.apache.hadoop.hbase.util.Pair;
56 import org.apache.hadoop.util.StringUtils;
57
58 import com.google.protobuf.ByteString;
59 import com.google.protobuf.RpcController;
60
61
62
63
64
65 @InterfaceAudience.Private
66 public final class ResponseConverter {
67 public static final Log LOG = LogFactory.getLog(ResponseConverter.class);
68
69 private ResponseConverter() {
70 }
71
72
73
74
75
76
77
78
79
80
81
82 public static org.apache.hadoop.hbase.client.MultiResponse getResults(final MultiRequest request,
83 final MultiResponse response, final CellScanner cells)
84 throws IOException {
85 int requestRegionActionCount = request.getRegionActionCount();
86 int responseRegionActionResultCount = response.getRegionActionResultCount();
87 if (requestRegionActionCount != responseRegionActionResultCount) {
88 throw new IllegalStateException("Request mutation count=" + responseRegionActionResultCount +
89 " does not match response mutation result count=" + responseRegionActionResultCount);
90 }
91
92 org.apache.hadoop.hbase.client.MultiResponse results =
93 new org.apache.hadoop.hbase.client.MultiResponse();
94
95 for (int i = 0; i < responseRegionActionResultCount; i++) {
96 RegionAction actions = request.getRegionAction(i);
97 RegionActionResult actionResult = response.getRegionActionResult(i);
98 HBaseProtos.RegionSpecifier rs = actions.getRegion();
99 if (rs.hasType() &&
100 (rs.getType() != HBaseProtos.RegionSpecifier.RegionSpecifierType.REGION_NAME)){
101 throw new IllegalArgumentException(
102 "We support only encoded types for protobuf multi response.");
103 }
104 byte[] regionName = rs.getValue().toByteArray();
105
106 if (actionResult.hasException()){
107 Throwable regionException = ProtobufUtil.toException(actionResult.getException());
108 results.addException(regionName, regionException);
109 continue;
110 }
111
112 if (actions.getActionCount() != actionResult.getResultOrExceptionCount()) {
113 throw new IllegalStateException("actions.getActionCount=" + actions.getActionCount() +
114 ", actionResult.getResultOrExceptionCount=" +
115 actionResult.getResultOrExceptionCount() + " for region " + actions.getRegion());
116 }
117
118 for (ResultOrException roe : actionResult.getResultOrExceptionList()) {
119 Object responseValue;
120 if (roe.hasException()) {
121 responseValue = ProtobufUtil.toException(roe.getException());
122 } else if (roe.hasResult()) {
123 responseValue = ProtobufUtil.toResult(roe.getResult(), cells);
124
125 if (roe.hasLoadStats()) {
126 ((Result) responseValue).addResults(roe.getLoadStats());
127 }
128 } else if (roe.hasServiceResult()) {
129 responseValue = roe.getServiceResult();
130 } else {
131
132 throw new IllegalStateException("No result & no exception roe=" + roe +
133 " for region " + actions.getRegion());
134 }
135 results.add(regionName, roe.getIndex(), responseValue);
136 }
137 }
138
139 return results;
140 }
141
142
143
144
145
146
147
148 public static ResultOrException.Builder buildActionResult(final Throwable t) {
149 ResultOrException.Builder builder = ResultOrException.newBuilder();
150 if (t != null) builder.setException(buildException(t));
151 return builder;
152 }
153
154
155
156
157
158
159
160
161 public static ResultOrException.Builder buildActionResult(final ClientProtos.Result r,
162 ClientProtos.RegionLoadStats stats) {
163 ResultOrException.Builder builder = ResultOrException.newBuilder();
164 if (r != null) builder.setResult(r);
165 if (stats != null) builder.setLoadStats(stats);
166 return builder;
167 }
168
169
170
171
172
173 public static NameBytesPair buildException(final Throwable t) {
174 NameBytesPair.Builder parameterBuilder = NameBytesPair.newBuilder();
175 parameterBuilder.setName(t.getClass().getName());
176 parameterBuilder.setValue(
177 ByteString.copyFromUtf8(StringUtils.stringifyException(t)));
178 return parameterBuilder.build();
179 }
180
181
182
183
184 public static GetUserPermissionsResponse buildGetUserPermissionsResponse(
185 final List<UserPermission> permissions) {
186 GetUserPermissionsResponse.Builder builder = GetUserPermissionsResponse.newBuilder();
187 for (UserPermission perm : permissions) {
188 builder.addUserPermission(ProtobufUtil.toUserPermission(perm));
189 }
190 return builder.build();
191 }
192
193
194
195
196
197
198
199
200
201
202 public static byte[][] getRegions(final RollWALWriterResponse proto) {
203 if (proto == null || proto.getRegionToFlushCount() == 0) return null;
204 List<byte[]> regions = new ArrayList<byte[]>();
205 for (ByteString region: proto.getRegionToFlushList()) {
206 regions.add(region.toByteArray());
207 }
208 return (byte[][])regions.toArray();
209 }
210
211
212
213
214
215
216
217 public static List<HRegionInfo> getRegionInfos(final GetOnlineRegionResponse proto) {
218 if (proto == null || proto.getRegionInfoCount() == 0) return null;
219 return ProtobufUtil.getRegionInfos(proto);
220 }
221
222
223
224
225
226
227
228 public static RegionOpeningState getRegionOpeningState
229 (final OpenRegionResponse proto) {
230 if (proto == null || proto.getOpeningStateCount() != 1) return null;
231 return RegionOpeningState.valueOf(
232 proto.getOpeningState(0).name());
233 }
234
235
236
237
238
239
240
241 public static List<RegionOpeningState> getRegionOpeningStateList(
242 final OpenRegionResponse proto) {
243 if (proto == null) return null;
244 List<RegionOpeningState> regionOpeningStates = new ArrayList<RegionOpeningState>();
245 for (int i = 0; i < proto.getOpeningStateCount(); i++) {
246 regionOpeningStates.add(RegionOpeningState.valueOf(
247 proto.getOpeningState(i).name()));
248 }
249 return regionOpeningStates;
250 }
251
252
253
254
255
256
257
258 public static boolean isClosed
259 (final CloseRegionResponse proto) {
260 if (proto == null || !proto.hasClosed()) return false;
261 return proto.getClosed();
262 }
263
264
265
266
267
268
269
270
271 public static GetServerInfoResponse buildGetServerInfoResponse(
272 final ServerName serverName, final int webuiPort) {
273 GetServerInfoResponse.Builder builder = GetServerInfoResponse.newBuilder();
274 ServerInfo.Builder serverInfoBuilder = ServerInfo.newBuilder();
275 serverInfoBuilder.setServerName(ProtobufUtil.toServerName(serverName));
276 if (webuiPort >= 0) {
277 serverInfoBuilder.setWebuiPort(webuiPort);
278 }
279 builder.setServerInfo(serverInfoBuilder.build());
280 return builder.build();
281 }
282
283
284
285
286
287
288
289 public static GetOnlineRegionResponse buildGetOnlineRegionResponse(
290 final List<HRegionInfo> regions) {
291 GetOnlineRegionResponse.Builder builder = GetOnlineRegionResponse.newBuilder();
292 for (HRegionInfo region: regions) {
293 builder.addRegionInfo(HRegionInfo.convert(region));
294 }
295 return builder.build();
296 }
297
298
299
300
301
302 public static RunCatalogScanResponse buildRunCatalogScanResponse(int numCleaned) {
303 return RunCatalogScanResponse.newBuilder().setScanResult(numCleaned).build();
304 }
305
306
307
308
309
310 public static EnableCatalogJanitorResponse buildEnableCatalogJanitorResponse(boolean prevValue) {
311 return EnableCatalogJanitorResponse.newBuilder().setPrevValue(prevValue).build();
312 }
313
314
315
316
317
318
319
320 public static GetLastFlushedSequenceIdResponse buildGetLastFlushedSequenceIdResponse(
321 long seqId) {
322 return GetLastFlushedSequenceIdResponse.newBuilder().setLastFlushedSequenceId(seqId).build();
323 }
324
325
326
327
328
329
330
331 public static void setControllerException(RpcController controller, IOException ioe) {
332 if (controller != null) {
333 if (controller instanceof ServerRpcController) {
334 ((ServerRpcController)controller).setFailedOn(ioe);
335 } else {
336 controller.setFailed(StringUtils.stringifyException(ioe));
337 }
338 }
339 }
340
341
342
343
344
345
346
347 public static Result[] getResults(CellScanner cellScanner, ScanResponse response)
348 throws IOException {
349 if (response == null) return null;
350
351
352 int noOfResults = cellScanner != null?
353 response.getCellsPerResultCount(): response.getResultsCount();
354 Result[] results = new Result[noOfResults];
355 for (int i = 0; i < noOfResults; i++) {
356 if (cellScanner != null) {
357
358
359 int noOfCells = response.getCellsPerResult(i);
360 List<Cell> cells = new ArrayList<Cell>(noOfCells);
361 for (int j = 0; j < noOfCells; j++) {
362 try {
363 if (cellScanner.advance() == false) {
364
365
366
367 String msg = "Results sent from server=" + noOfResults + ". But only got " + i
368 + " results completely at client. Resetting the scanner to scan again.";
369 LOG.error(msg);
370 throw new DoNotRetryIOException(msg);
371 }
372 } catch (IOException ioe) {
373
374
375
376 LOG.error("Exception while reading cells from result."
377 + "Resetting the scanner to scan again.", ioe);
378 throw new DoNotRetryIOException("Resetting the scanner.", ioe);
379 }
380 cells.add(cellScanner.current());
381 }
382 results[i] = Result.create(cells);
383 } else {
384
385 results[i] = ProtobufUtil.toResult(response.getResults(i));
386 }
387 }
388 return results;
389 }
390 }