/* * Copyright © 2015 Cask Data, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package co.cask.cdap.data.hbase; import com.google.common.base.Function; import com.google.common.base.Throwables; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.MiniHBaseCluster; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * {@link HBaseTestBase} implementation supporting HBase 1.1. */ public class HBase11Test extends HBaseTestBase { private static final Logger LOG = LoggerFactory.getLogger(HBase11Test.class); protected HBaseTestingUtility testUtil = new HBaseTestingUtility(); @Override public Configuration getConfiguration() { return testUtil.getConfiguration(); } @Override public int getZKClientPort() { return testUtil.getZkCluster().getClientPort(); } @Override public void doStartHBase() throws Exception { testUtil.startMiniCluster(); } @Override public void stopHBase() throws Exception { testUtil.shutdownMiniCluster(); } @Override public MiniHBaseCluster getHBaseCluster() { return testUtil.getHBaseCluster(); } @Override public HRegion createHRegion(byte[] tableName, byte[] startKey, byte[] stopKey, String callingMethod, Configuration conf, byte[]... families) throws IOException { if (conf == null) { conf = new Configuration(); } HTableDescriptor htd = new HTableDescriptor(tableName); for (byte [] family : families) { htd.addFamily(new HColumnDescriptor(family)); } HRegionInfo info = new HRegionInfo(htd.getTableName(), startKey, stopKey, false); Path path = new Path(conf.get(HConstants.HBASE_DIR), callingMethod); FileSystem fs = FileSystem.get(conf); if (fs.exists(path)) { if (!fs.delete(path, true)) { throw new IOException("Failed delete of " + path); } } return HRegion.createHRegion(info, path, conf, htd); } @Override public <T> Map<byte[], T> forEachRegion(byte[] tableName, Function<HRegion, T> function) { MiniHBaseCluster hbaseCluster = getHBaseCluster(); Map<byte[], T> results = new TreeMap<>(Bytes.BYTES_COMPARATOR); // make sure consumer config cache is updated for (JVMClusterUtil.RegionServerThread t : hbaseCluster.getRegionServerThreads()) { List<Region> serverRegions = t.getRegionServer().getOnlineRegions(TableName.valueOf(tableName)); for (Region region : serverRegions) { results.put(region.getRegionInfo().getRegionName(), function.apply((HRegion) region)); } } return results; } @Override public void waitUntilTableAvailable(byte[] tableName, long timeoutInMillis) throws IOException, InterruptedException { testUtil.waitTableAvailable(tableName, timeoutInMillis); testUtil.waitUntilAllRegionsAssigned(TableName.valueOf(tableName), timeoutInMillis); } @Override public Runnable createFlushRegion(final HRegion region) { return new Runnable() { @Override public void run() { try { region.flushcache(true, false); } catch (IOException e) { throw Throwables.propagate(e); } } }; } @Override public Runnable createCompactRegion(final HRegion region, final boolean majorCompact) { return new Runnable() { @Override public void run() { try { region.compact(majorCompact); } catch (IOException e) { throw Throwables.propagate(e); } } }; } }