1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.master;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.net.InetSocketAddress;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Random;
27 import java.util.TreeMap;
28 import java.util.concurrent.ConcurrentSkipListMap;
29
30 import com.google.protobuf.Message;
31 import org.apache.hadoop.conf.Configuration;
32 import org.apache.hadoop.fs.FileSystem;
33 import org.apache.hadoop.hbase.CellScannable;
34 import org.apache.hadoop.hbase.CellUtil;
35 import org.apache.hadoop.hbase.TableName;
36 import org.apache.hadoop.hbase.HRegionInfo;
37 import org.apache.hadoop.hbase.ServerName;
38 import org.apache.hadoop.hbase.ZooKeeperConnectionException;
39 import org.apache.hadoop.hbase.catalog.CatalogTracker;
40 import org.apache.hadoop.hbase.client.Get;
41 import org.apache.hadoop.hbase.client.Result;
42 import org.apache.hadoop.hbase.client.Scan;
43 import org.apache.hadoop.hbase.executor.ExecutorService;
44 import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController;
45 import org.apache.hadoop.hbase.ipc.RpcServerInterface;
46 import org.apache.hadoop.hbase.master.TableLockManager.NullTableLockManager;
47 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
48 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos;
49 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionRequest;
50 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionResponse;
51 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionRequest;
52 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionResponse;
53 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionRequest;
54 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionResponse;
55 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
56 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
57 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoRequest;
58 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse;
59 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoRequest;
60 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoResponse;
61 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileRequest;
62 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileResponse;
63 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsRequest;
64 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsResponse;
65 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionRequest;
66 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionResponse;
67 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryRequest;
68 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;
69 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterRequest;
70 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterResponse;
71 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionRequest;
72 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionResponse;
73 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.StopServerRequest;
74 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.StopServerResponse;
75 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest;
76 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse;
77 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
78 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.BulkLoadHFileRequest;
79 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.BulkLoadHFileResponse;
80 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;
81 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetResponse;
82 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;
83 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateRequest;
84 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateResponse;
85 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
86 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse;
87 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;
88 import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionTransition.TransitionCode;
89 import org.apache.hadoop.hbase.regionserver.CompactionRequestor;
90 import org.apache.hadoop.hbase.regionserver.FlushRequester;
91 import org.apache.hadoop.hbase.regionserver.HRegion;
92 import org.apache.hadoop.hbase.regionserver.Leases;
93 import org.apache.hadoop.hbase.regionserver.RegionServerAccounting;
94 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
95 import org.apache.hadoop.hbase.regionserver.ServerNonceManager;
96 import org.apache.hadoop.hbase.regionserver.wal.HLog;
97 import org.apache.hadoop.hbase.util.Bytes;
98 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
99 import org.apache.zookeeper.KeeperException;
100
101 import com.google.protobuf.RpcController;
102 import com.google.protobuf.ServiceException;
103
104
105
106
107
108
109
110
111
112 class MockRegionServer
113 implements AdminProtos.AdminService.BlockingInterface,
114 ClientProtos.ClientService.BlockingInterface, RegionServerServices {
115 private final ServerName sn;
116 private final ZooKeeperWatcher zkw;
117 private final Configuration conf;
118 private final Random random = new Random();
119
120
121
122
123
124
125
126 private final Map<byte [], Map<byte [], Result>> gets =
127 new TreeMap<byte [], Map<byte [], Result>>(Bytes.BYTES_COMPARATOR);
128
129
130
131
132 private final Map<byte [], Result []> nexts =
133 new TreeMap<byte [], Result []>(Bytes.BYTES_COMPARATOR);
134
135
136
137
138 class RegionNameAndIndex {
139 private final byte[] regionName;
140 private int index = 0;
141
142 RegionNameAndIndex(final byte[] regionName) {
143 this.regionName = regionName;
144 }
145
146 byte[] getRegionName() {
147 return this.regionName;
148 }
149
150 int getThenIncrement() {
151 int currentIndex = this.index;
152 this.index++;
153 return currentIndex;
154 }
155 }
156
157
158
159
160 private final Map<Long, RegionNameAndIndex> scannersAndOffsets =
161 new HashMap<Long, RegionNameAndIndex>();
162
163
164
165
166
167
168 MockRegionServer(final Configuration conf, final ServerName sn)
169 throws ZooKeeperConnectionException, IOException {
170 this.sn = sn;
171 this.conf = conf;
172 this.zkw = new ZooKeeperWatcher(conf, sn.toString(), this, true);
173 }
174
175
176
177
178
179
180
181 void setGetResult(final byte [] regionName, final byte [] row, final Result r) {
182 Map<byte [], Result> value = this.gets.get(regionName);
183 if (value == null) {
184
185
186 value = new TreeMap<byte [], Result>(Bytes.BYTES_COMPARATOR);
187 this.gets.put(regionName, value);
188 }
189 value.put(row, r);
190 }
191
192
193
194
195
196
197 void setNextResults(final byte [] regionName, final Result [] rs) {
198 this.nexts.put(regionName, rs);
199 }
200
201 @Override
202 public boolean isStopped() {
203
204 return false;
205 }
206
207 @Override
208 public void abort(String why, Throwable e) {
209 throw new RuntimeException(this.sn + ": " + why, e);
210 }
211
212 @Override
213 public boolean isAborted() {
214 return false;
215 }
216
217 public long openScanner(byte[] regionName, Scan scan) throws IOException {
218 long scannerId = this.random.nextLong();
219 this.scannersAndOffsets.put(scannerId, new RegionNameAndIndex(regionName));
220 return scannerId;
221 }
222
223 public Result next(long scannerId) throws IOException {
224 RegionNameAndIndex rnai = this.scannersAndOffsets.get(scannerId);
225 int index = rnai.getThenIncrement();
226 Result [] results = this.nexts.get(rnai.getRegionName());
227 if (results == null) return null;
228 return index < results.length? results[index]: null;
229 }
230
231 public Result [] next(long scannerId, int numberOfRows) throws IOException {
232
233 Result r = next(scannerId);
234 return r == null? null: new Result [] {r};
235 }
236
237 public void close(final long scannerId) throws IOException {
238 this.scannersAndOffsets.remove(scannerId);
239 }
240
241 @Override
242 public void stop(String why) {
243 this.zkw.close();
244 }
245
246 @Override
247 public void addToOnlineRegions(HRegion r) {
248
249 }
250
251 @Override
252 public boolean removeFromOnlineRegions(HRegion r, ServerName destination) {
253
254 return false;
255 }
256
257 @Override
258 public HRegion getFromOnlineRegions(String encodedRegionName) {
259
260 return null;
261 }
262
263 @Override
264 public Configuration getConfiguration() {
265 return this.conf;
266 }
267
268 @Override
269 public ZooKeeperWatcher getZooKeeper() {
270 return this.zkw;
271 }
272
273 @Override
274 public CatalogTracker getCatalogTracker() {
275
276 return null;
277 }
278
279 @Override
280 public ServerName getServerName() {
281 return this.sn;
282 }
283
284 @Override
285 public boolean isStopping() {
286 return false;
287 }
288
289 @Override
290 public CompactionRequestor getCompactionRequester() {
291
292 return null;
293 }
294
295 @Override
296 public FlushRequester getFlushRequester() {
297
298 return null;
299 }
300
301 @Override
302 public RegionServerAccounting getRegionServerAccounting() {
303
304 return null;
305 }
306
307 public TableLockManager getTableLockManager() {
308 return new NullTableLockManager();
309 }
310
311 @Override
312 public void postOpenDeployTasks(HRegion r, CatalogTracker ct)
313 throws KeeperException, IOException {
314
315 }
316
317 @Override
318 public RpcServerInterface getRpcServer() {
319
320 return null;
321 }
322
323 @Override
324 public ConcurrentSkipListMap<byte[], Boolean> getRegionsInTransitionInRS() {
325
326 return null;
327 }
328
329 @Override
330 public FileSystem getFileSystem() {
331
332 return null;
333 }
334
335 @Override
336 public GetResponse get(RpcController controller, GetRequest request)
337 throws ServiceException {
338 byte[] regionName = request.getRegion().getValue().toByteArray();
339 Map<byte [], Result> m = this.gets.get(regionName);
340 GetResponse.Builder builder = GetResponse.newBuilder();
341 if (m != null) {
342 byte[] row = request.getGet().getRow().toByteArray();
343 builder.setResult(ProtobufUtil.toResult(m.get(row)));
344 }
345 return builder.build();
346 }
347
348
349
350
351 @Override
352 public MutateResponse mutate(RpcController controller, MutateRequest request)
353 throws ServiceException {
354
355 return null;
356 }
357
358 @Override
359 public ScanResponse scan(RpcController controller, ScanRequest request)
360 throws ServiceException {
361 ScanResponse.Builder builder = ScanResponse.newBuilder();
362 try {
363 if (request.hasScan()) {
364 byte[] regionName = request.getRegion().getValue().toByteArray();
365 builder.setScannerId(openScanner(regionName, null));
366 builder.setMoreResults(true);
367 }
368 else {
369 long scannerId = request.getScannerId();
370 Result result = next(scannerId);
371 if (result != null) {
372 builder.addCellsPerResult(result.size());
373 List<CellScannable> results = new ArrayList<CellScannable>(1);
374 results.add(result);
375 ((PayloadCarryingRpcController) controller).setCellScanner(CellUtil
376 .createCellScanner(results));
377 builder.setMoreResults(true);
378 }
379 else {
380 builder.setMoreResults(false);
381 close(scannerId);
382 }
383 }
384 } catch (IOException ie) {
385 throw new ServiceException(ie);
386 }
387 return builder.build();
388 }
389
390 @Override
391 public BulkLoadHFileResponse bulkLoadHFile(RpcController controller,
392 BulkLoadHFileRequest request) throws ServiceException {
393
394 return null;
395 }
396
397 @Override
398 public ClientProtos.CoprocessorServiceResponse execService(RpcController controller,
399 ClientProtos.CoprocessorServiceRequest request) throws ServiceException {
400 return null;
401 }
402
403 @Override
404 public org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiResponse multi(
405 RpcController controller, MultiRequest request) throws ServiceException {
406
407 return null;
408 }
409
410 @Override
411 public GetRegionInfoResponse getRegionInfo(RpcController controller,
412 GetRegionInfoRequest request) throws ServiceException {
413 GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();
414 builder.setRegionInfo(HRegionInfo.convert(HRegionInfo.FIRST_META_REGIONINFO));
415 return builder.build();
416 }
417
418 @Override
419 public GetStoreFileResponse getStoreFile(RpcController controller,
420 GetStoreFileRequest request) throws ServiceException {
421
422 return null;
423 }
424
425 @Override
426 public GetOnlineRegionResponse getOnlineRegion(RpcController controller,
427 GetOnlineRegionRequest request) throws ServiceException {
428
429 return null;
430 }
431
432 @Override
433 public OpenRegionResponse openRegion(RpcController controller,
434 OpenRegionRequest request) throws ServiceException {
435
436 return null;
437 }
438
439 @Override
440 public CloseRegionResponse closeRegion(RpcController controller,
441 CloseRegionRequest request) throws ServiceException {
442
443 return null;
444 }
445
446 @Override
447 public FlushRegionResponse flushRegion(RpcController controller,
448 FlushRegionRequest request) throws ServiceException {
449
450 return null;
451 }
452
453 @Override
454 public SplitRegionResponse splitRegion(RpcController controller,
455 SplitRegionRequest request) throws ServiceException {
456
457 return null;
458 }
459
460 @Override
461 public MergeRegionsResponse mergeRegions(RpcController controller,
462 MergeRegionsRequest request) throws ServiceException {
463
464 return null;
465 }
466
467 @Override
468 public CompactRegionResponse compactRegion(RpcController controller,
469 CompactRegionRequest request) throws ServiceException {
470
471 return null;
472 }
473
474 @Override
475 public ReplicateWALEntryResponse replicateWALEntry(RpcController controller,
476 ReplicateWALEntryRequest request) throws ServiceException {
477
478 return null;
479 }
480
481 @Override
482 public RollWALWriterResponse rollWALWriter(RpcController controller,
483 RollWALWriterRequest request) throws ServiceException {
484
485 return null;
486 }
487
488 @Override
489 public GetServerInfoResponse getServerInfo(RpcController controller,
490 GetServerInfoRequest request) throws ServiceException {
491
492 return null;
493 }
494
495 @Override
496 public StopServerResponse stopServer(RpcController controller,
497 StopServerRequest request) throws ServiceException {
498
499 return null;
500 }
501
502 @Override
503 public List<HRegion> getOnlineRegions(TableName tableName) throws IOException {
504
505 return null;
506 }
507
508 @Override
509 public Leases getLeases() {
510
511 return null;
512 }
513
514 @Override
515 public HLog getWAL(HRegionInfo regionInfo) throws IOException {
516
517 return null;
518 }
519
520 @Override
521 public ExecutorService getExecutorService() {
522 return null;
523 }
524
525 @Override
526 public void updateRegionFavoredNodesMapping(String encodedRegionName,
527 List<org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.ServerName> favoredNodes) {
528 }
529
530 @Override
531 public InetSocketAddress[] getFavoredNodesForRegion(String encodedRegionName) {
532 return null;
533 }
534
535 @Override
536 public ReplicateWALEntryResponse
537 replay(RpcController controller, ReplicateWALEntryRequest request)
538 throws ServiceException {
539
540 return null;
541 }
542
543 @Override
544 public Map<String, HRegion> getRecoveringRegions() {
545
546 return null;
547 }
548
549 @Override
550 public int getPriority(RPCProtos.RequestHeader header, Message param) {
551 return 0;
552 }
553
554 @Override
555 public UpdateFavoredNodesResponse updateFavoredNodes(RpcController controller,
556 UpdateFavoredNodesRequest request) throws ServiceException {
557 return null;
558 }
559
560 @Override
561 public ServerNonceManager getNonceManager() {
562 return null;
563 }
564
565 @Override
566 public boolean reportRegionTransition(TransitionCode code, HRegionInfo... hris) {
567 return false;
568 }
569
570 @Override
571 public boolean reportRegionTransition(TransitionCode code, long openSeqNum,
572 HRegionInfo... hris) {
573 return false;
574 }
575 }