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