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