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