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