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.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.UserPermissionsResponse;
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.ActionResult;
43 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ResultCellMeta;
44 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse;
45 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.NameBytesPair;
46 import org.apache.hadoop.hbase.protobuf.generated.MasterAdminProtos.CatalogScanResponse;
47 import org.apache.hadoop.hbase.protobuf.generated.MasterAdminProtos.EnableCatalogJanitorResponse;
48 import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdResponse;
49 import org.apache.hadoop.hbase.regionserver.RegionOpeningState;
50 import org.apache.hadoop.hbase.security.access.UserPermission;
51 import org.apache.hadoop.util.StringUtils;
52
53 import com.google.protobuf.ByteString;
54 import com.google.protobuf.RpcController;
55
56
57
58
59
60 @InterfaceAudience.Private
61 public final class ResponseConverter {
62 public static final Log LOG = LogFactory.getLog(ResponseConverter.class);
63
64 private ResponseConverter() {
65 }
66
67
68
69
70
71
72
73
74
75
76
77 public static List<Object> getResults(final ClientProtos.MultiResponse proto,
78 final CellScanner cells)
79 throws IOException {
80 List<Object> results = new ArrayList<Object>();
81 List<ActionResult> resultList = proto.getResultList();
82 for (int i = 0, n = resultList.size(); i < n; i++) {
83 ActionResult result = resultList.get(i);
84 if (result.hasException()) {
85 results.add(ProtobufUtil.toException(result.getException()));
86 } else if (result.hasValue()) {
87 ClientProtos.Result value = result.getValue();
88 results.add(ProtobufUtil.toResult(value, cells));
89 } else {
90 results.add(new Result());
91 }
92 }
93 return results;
94 }
95
96
97
98
99
100
101
102 public static ActionResult buildActionResult(final Throwable t) {
103 ActionResult.Builder builder = ActionResult.newBuilder();
104 NameBytesPair.Builder parameterBuilder = NameBytesPair.newBuilder();
105 parameterBuilder.setName(t.getClass().getName());
106 parameterBuilder.setValue(
107 ByteString.copyFromUtf8(StringUtils.stringifyException(t)));
108 builder.setException(parameterBuilder.build());
109 return builder.build();
110 }
111
112
113
114
115 public static UserPermissionsResponse buildUserPermissionsResponse(
116 final List<UserPermission> permissions) {
117 UserPermissionsResponse.Builder builder = UserPermissionsResponse.newBuilder();
118 for (UserPermission perm : permissions) {
119 builder.addUserPermission(ProtobufUtil.toUserPermission(perm));
120 }
121 return builder.build();
122 }
123
124
125
126
127
128
129
130
131
132
133 public static byte[][] getRegions(final RollWALWriterResponse proto) {
134 if (proto == null || proto.getRegionToFlushCount() == 0) return null;
135 List<byte[]> regions = new ArrayList<byte[]>();
136 for (ByteString region: proto.getRegionToFlushList()) {
137 regions.add(region.toByteArray());
138 }
139 return (byte[][])regions.toArray();
140 }
141
142
143
144
145
146
147
148 public static List<HRegionInfo> getRegionInfos(final GetOnlineRegionResponse proto) {
149 if (proto == null || proto.getRegionInfoCount() == 0) return null;
150 return ProtobufUtil.getRegionInfos(proto);
151 }
152
153
154
155
156
157
158
159 public static RegionOpeningState getRegionOpeningState
160 (final OpenRegionResponse proto) {
161 if (proto == null || proto.getOpeningStateCount() != 1) return null;
162 return RegionOpeningState.valueOf(
163 proto.getOpeningState(0).name());
164 }
165
166
167
168
169
170
171
172 public static List<RegionOpeningState> getRegionOpeningStateList(
173 final OpenRegionResponse proto) {
174 if (proto == null) return null;
175 List<RegionOpeningState> regionOpeningStates = new ArrayList<RegionOpeningState>();
176 for (int i = 0; i < proto.getOpeningStateCount(); i++) {
177 regionOpeningStates.add(RegionOpeningState.valueOf(
178 proto.getOpeningState(i).name()));
179 }
180 return regionOpeningStates;
181 }
182
183
184
185
186
187
188
189 public static boolean isClosed
190 (final CloseRegionResponse proto) {
191 if (proto == null || !proto.hasClosed()) return false;
192 return proto.getClosed();
193 }
194
195
196
197
198
199
200
201
202 public static GetServerInfoResponse buildGetServerInfoResponse(
203 final ServerName serverName, final int webuiPort) {
204 GetServerInfoResponse.Builder builder = GetServerInfoResponse.newBuilder();
205 ServerInfo.Builder serverInfoBuilder = ServerInfo.newBuilder();
206 serverInfoBuilder.setServerName(ProtobufUtil.toServerName(serverName));
207 if (webuiPort >= 0) {
208 serverInfoBuilder.setWebuiPort(webuiPort);
209 }
210 builder.setServerInfo(serverInfoBuilder.build());
211 return builder.build();
212 }
213
214
215
216
217
218
219
220 public static GetOnlineRegionResponse buildGetOnlineRegionResponse(
221 final List<HRegionInfo> regions) {
222 GetOnlineRegionResponse.Builder builder = GetOnlineRegionResponse.newBuilder();
223 for (HRegionInfo region: regions) {
224 builder.addRegionInfo(HRegionInfo.convert(region));
225 }
226 return builder.build();
227 }
228
229
230
231
232
233 public static CatalogScanResponse buildCatalogScanResponse(int numCleaned) {
234 return CatalogScanResponse.newBuilder().setScanResult(numCleaned).build();
235 }
236
237
238
239
240
241 public static EnableCatalogJanitorResponse buildEnableCatalogJanitorResponse(boolean prevValue) {
242 return EnableCatalogJanitorResponse.newBuilder().setPrevValue(prevValue).build();
243 }
244
245
246
247
248
249
250
251 public static GetLastFlushedSequenceIdResponse buildGetLastFlushedSequenceIdResponse(
252 long seqId) {
253 return GetLastFlushedSequenceIdResponse.newBuilder().setLastFlushedSequenceId(seqId).build();
254 }
255
256
257
258
259
260
261
262 public static void setControllerException(RpcController controller, IOException ioe) {
263 if (controller != null) {
264 if (controller instanceof ServerRpcController) {
265 ((ServerRpcController)controller).setFailedOn(ioe);
266 } else {
267 controller.setFailed(StringUtils.stringifyException(ioe));
268 }
269 }
270 }
271
272
273
274
275
276
277
278 public static Result[] getResults(CellScanner cellScanner, ScanResponse response)
279 throws IOException {
280 if (response == null || cellScanner == null) return null;
281 ResultCellMeta resultCellMeta = response.getResultCellMeta();
282 if (resultCellMeta == null) return null;
283 int noOfResults = resultCellMeta.getCellsLengthCount();
284 Result[] results = new Result[noOfResults];
285 for (int i = 0; i < noOfResults; i++) {
286 int noOfCells = resultCellMeta.getCellsLength(i);
287 List<Cell> cells = new ArrayList<Cell>(noOfCells);
288 for (int j = 0; j < noOfCells; j++) {
289 try {
290 if (cellScanner.advance() == false) {
291
292
293
294 String msg = "Results sent from server=" + noOfResults + ". But only got " + i
295 + " results completely at client. Resetting the scanner to scan again.";
296 LOG.error(msg);
297 throw new DoNotRetryIOException(msg);
298 }
299 } catch (IOException ioe) {
300
301
302
303 LOG.error("Exception while reading cells from result."
304 + "Resetting the scanner to scan again.", ioe);
305 throw new DoNotRetryIOException("Resetting the scanner.", ioe);
306 }
307 cells.add(cellScanner.current());
308 }
309 results[i] = new Result(cells);
310 }
311 return results;
312 }
313 }