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