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