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