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