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