View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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  * A mock RegionServer implementation.
118  * Use this when you can't bend Mockito to your liking (e.g. return null result
119  * when 'scanning' until master timesout and then return a coherent meta row
120  * result thereafter.  Have some facility for faking gets and scans.  See
121  * setGetResult(byte[], byte[], Result) for how to fill the backing data
122  * store that the get pulls from.
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    * Map of regions to map of rows and {@link Results}.  Used as data source when
134    * {@link MockRegionServer#get(byte[], Get)} is called. Because we have a byte
135    * key, need to use TreeMap and provide a Comparator.  Use
136    * {@link #setGetResult(byte[], byte[], Result)} filling this map.
137    */
138   private final Map<byte [], Map<byte [], Result>> gets =
139     new TreeMap<byte [], Map<byte [], Result>>(Bytes.BYTES_COMPARATOR);
140 
141   /**
142    * Map of regions to results to return when scanning.
143    */
144   private final Map<byte [], Result []> nexts =
145     new TreeMap<byte [], Result []>(Bytes.BYTES_COMPARATOR);
146 
147   /**
148    * Data structure that holds regionname and index used scanning.
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    * Outstanding scanners and their offset into <code>nexts</code>
171    */
172   private final Map<Long, RegionNameAndIndex> scannersAndOffsets =
173     new HashMap<Long, RegionNameAndIndex>();
174 
175   /**
176    * @param sn Name of this mock regionserver
177    * @throws IOException
178    * @throws org.apache.hadoop.hbase.ZooKeeperConnectionException
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    * Use this method filling the backing data source used by {@link #get(byte[], Get)}
189    * @param regionName
190    * @param row
191    * @param r
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       // If no value already, create one.  Needs to be treemap because we are
197       // using byte array as key.   Not thread safe.
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    * Use this method to set what a scanner will reply as we next through
206    * @param regionName
207    * @param rs
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     // TODO Auto-generated method stub
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     // Just return one result whatever they ask for.
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     // TODO Auto-generated method stub
261   }
262 
263   @Override
264   public boolean removeFromOnlineRegions(Region r, ServerName destination) {
265     // TODO Auto-generated method stub
266     return false;
267   }
268 
269   @Override
270   public HRegion getFromOnlineRegions(String encodedRegionName) {
271     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
313     return null;
314   }
315 
316   @Override
317   public FlushRequester getFlushRequester() {
318     // TODO Auto-generated method stub
319     return null;
320   }
321 
322   @Override
323   public RegionServerAccounting getRegionServerAccounting() {
324     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
340   }
341 
342   @Override
343   public void postOpenDeployTasks(PostOpenDeployContext context) throws KeeperException,
344       IOException {
345     // TODO Auto-generated method stub
346   }
347 
348   @Override
349   public RpcServerInterface getRpcServer() {
350     // TODO Auto-generated method stub
351     return null;
352   }
353 
354   @Override
355   public ConcurrentSkipListMap<byte[], Boolean> getRegionsInTransitionInRS() {
356     // TODO Auto-generated method stub
357     return null;
358   }
359 
360   @Override
361   public FileSystem getFileSystem() {
362     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
453     return null;
454   }
455 
456   @Override
457   public GetOnlineRegionResponse getOnlineRegion(RpcController controller,
458       GetOnlineRegionRequest request) throws ServiceException {
459     // TODO Auto-generated method stub
460     return null;
461   }
462 
463   @Override
464   public OpenRegionResponse openRegion(RpcController controller,
465       OpenRegionRequest request) throws ServiceException {
466     // TODO Auto-generated method stub
467     return null;
468   }
469 
470   @Override
471   public WarmupRegionResponse warmupRegion(RpcController controller,
472       WarmupRegionRequest request) throws ServiceException {
473     //TODO Auto-generated method stub
474     return null;
475   }
476   @Override
477   public CloseRegionResponse closeRegion(RpcController controller,
478       CloseRegionRequest request) throws ServiceException {
479     // TODO Auto-generated method stub
480     return null;
481   }
482 
483   @Override
484   public FlushRegionResponse flushRegion(RpcController controller,
485       FlushRegionRequest request) throws ServiceException {
486     // TODO Auto-generated method stub
487     return null;
488   }
489 
490   @Override
491   public SplitRegionResponse splitRegion(RpcController controller,
492       SplitRegionRequest request) throws ServiceException {
493     // TODO Auto-generated method stub
494     return null;
495   }
496 
497   @Override
498   public MergeRegionsResponse mergeRegions(RpcController controller,
499       MergeRegionsRequest request) throws ServiceException {
500     // TODO Auto-generated method stub
501     return null;
502   }
503 
504   @Override
505   public CompactRegionResponse compactRegion(RpcController controller,
506       CompactRegionRequest request) throws ServiceException {
507     // TODO Auto-generated method stub
508     return null;
509   }
510 
511   @Override
512   public ReplicateWALEntryResponse replicateWALEntry(RpcController controller,
513       ReplicateWALEntryRequest request) throws ServiceException {
514     // TODO Auto-generated method stub
515     return null;
516   }
517 
518   @Override
519   public RollWALWriterResponse rollWALWriter(RpcController controller,
520       RollWALWriterRequest request) throws ServiceException {
521     // TODO Auto-generated method stub
522     return null;
523   }
524 
525   @Override
526   public GetServerInfoResponse getServerInfo(RpcController controller,
527       GetServerInfoRequest request) throws ServiceException {
528     // TODO Auto-generated method stub
529     return null;
530   }
531 
532   @Override
533   public StopServerResponse stopServer(RpcController controller,
534       StopServerRequest request) throws ServiceException {
535     // TODO Auto-generated method stub
536     return null;
537   }
538 
539   @Override
540   public List<Region> getOnlineRegions(TableName tableName) throws IOException {
541     // TODO Auto-generated method stub
542     return null;
543   }
544   
545   @Override
546   public Set<TableName> getOnlineTables() {
547     return null;
548   }
549 
550   @Override
551   public Leases getLeases() {
552     // TODO Auto-generated method stub
553     return null;
554   }
555 
556   @Override
557   public WAL getWAL(HRegionInfo regionInfo) throws IOException {
558     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
587     return null;
588   }
589 
590   @Override
591   public Map<String, Region> getRecoveringRegions() {
592     // TODO Auto-generated method stub
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     // TODO Auto-generated method stub
626     return false;
627   }
628 
629   @Override
630   public CoprocessorServiceResponse execRegionServerService(RpcController controller,
631       CoprocessorServiceRequest request) throws ServiceException {
632     // TODO Auto-generated method stub
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 }