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