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