hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mberto...@apache.org
Subject [1/2] hbase git commit: HBASE-14466 Remove duplicated code from MOB snapshot tests
Date Wed, 23 Sep 2015 20:34:15 GMT
Repository: hbase
Updated Branches:
  refs/heads/master 5aab961a7 -> 5e26ae043


http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java
index d891c20..a2c4d3c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java
@@ -148,143 +148,12 @@ public class MobSnapshotTestingUtils {
   // ==========================================================================
   // Snapshot Mock
   // ==========================================================================
-  public static class SnapshotMock {
-    private final static String TEST_FAMILY = "cf";
-    public final static int TEST_NUM_REGIONS = 4;
-
-    private final Configuration conf;
-    private final FileSystem fs;
-    private final Path rootDir;
-
-    static class RegionData {
-      public HRegionInfo hri;
-      public Path tableDir;
-      public Path[] files;
-
-      public RegionData(final Path tableDir, final HRegionInfo hri,
-          final int nfiles) {
-        this.tableDir = tableDir;
-        this.hri = hri;
-        this.files = new Path[nfiles];
-      }
-    }
-
-    public static class SnapshotBuilder {
-      private final RegionData[] tableRegions;
-      private final SnapshotDescription desc;
-      private final HTableDescriptor htd;
-      private final Configuration conf;
-      private final FileSystem fs;
-      private final Path rootDir;
-      private Path snapshotDir;
-      private int snapshotted = 0;
-
-      public SnapshotBuilder(final Configuration conf, final FileSystem fs,
-          final Path rootDir, final HTableDescriptor htd,
-          final SnapshotDescription desc, final RegionData[] tableRegions)
-          throws IOException {
-        this.fs = fs;
-        this.conf = conf;
-        this.rootDir = rootDir;
-        this.htd = htd;
-        this.desc = desc;
-        this.tableRegions = tableRegions;
-        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc,
-            rootDir);
-        new FSTableDescriptors(conf).createTableDescriptorForTableDirectory(
-            snapshotDir, new TableDescriptor(htd), false);
-      }
-
-      public HTableDescriptor getTableDescriptor() {
-        return this.htd;
-      }
-
-      public SnapshotDescription getSnapshotDescription() {
-        return this.desc;
-      }
-
-      public Path getSnapshotsDir() {
-        return this.snapshotDir;
-      }
-
-      public Path[] addRegion() throws IOException {
-        return addRegion(desc);
-      }
-
-      public Path[] addRegionV1() throws IOException {
-        return addRegion(desc.toBuilder()
-            .setVersion(SnapshotManifestV1.DESCRIPTOR_VERSION).build());
-      }
-
-      public Path[] addRegionV2() throws IOException {
-        return addRegion(desc.toBuilder()
-            .setVersion(SnapshotManifestV2.DESCRIPTOR_VERSION).build());
-      }
-
-      private Path[] addRegion(final SnapshotDescription desc)
-          throws IOException {
-        if (this.snapshotted == tableRegions.length) {
-          throw new UnsupportedOperationException(
-              "No more regions in the table");
-        }
-
-        RegionData regionData = tableRegions[this.snapshotted++];
-        ForeignExceptionDispatcher monitor = new ForeignExceptionDispatcher(
-            desc.getName());
-        SnapshotManifest manifest = SnapshotManifest.create(conf, fs,
-            snapshotDir, desc, monitor);
-        manifest.addRegion(regionData.tableDir, regionData.hri);
-        return regionData.files;
-      }
-
-      public Path commit() throws IOException {
-        ForeignExceptionDispatcher monitor = new ForeignExceptionDispatcher(
-            desc.getName());
-        SnapshotManifest manifest = SnapshotManifest.create(conf, fs,
-            snapshotDir, desc, monitor);
-        manifest.addTableDescriptor(htd);
-        manifest.consolidate();
-        SnapshotDescriptionUtils.completeSnapshot(desc, rootDir, snapshotDir,
-            fs);
-        snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(desc,
-            rootDir);
-        return snapshotDir;
-      }
-    }
-
-    public SnapshotMock(final Configuration conf, final FileSystem fs,
-        final Path rootDir) {
-      this.fs = fs;
-      this.conf = conf;
-      this.rootDir = rootDir;
-    }
-
-    public SnapshotBuilder createSnapshotV1(final String snapshotName)
-        throws IOException {
-      return createSnapshot(snapshotName, SnapshotManifestV1.DESCRIPTOR_VERSION);
-    }
-
-    public SnapshotBuilder createSnapshotV2(final String snapshotName)
-        throws IOException {
-      return createSnapshot(snapshotName, SnapshotManifestV2.DESCRIPTOR_VERSION);
-    }
-
-    private SnapshotBuilder createSnapshot(final String snapshotName,
-        final int version) throws IOException {
-      HTableDescriptor htd = createHtd(snapshotName);
-
-      RegionData[] regions = createTable(htd, TEST_NUM_REGIONS);
-
-      SnapshotDescription desc = SnapshotDescription.newBuilder()
-          .setTable(htd.getNameAsString()).setName(snapshotName)
-          .setVersion(version).build();
-
-      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc,
-          rootDir);
-      SnapshotDescriptionUtils.writeSnapshotInfo(desc, workingDir, fs);
-      return new SnapshotBuilder(conf, fs, rootDir, htd, desc, regions);
+  public static class SnapshotMock extends SnapshotTestingUtils.SnapshotMock {
+    public SnapshotMock(final Configuration conf, final FileSystem fs, final Path rootDir) {
+      super(conf, fs, rootDir);
     }
 
+    @Override
     public HTableDescriptor createHtd(final String tableName) {
       HTableDescriptor htd = new HTableDescriptor(tableName);
       HColumnDescriptor hcd = new HColumnDescriptor(TEST_FAMILY);
@@ -293,55 +162,5 @@ public class MobSnapshotTestingUtils {
       htd.addFamily(hcd);
       return htd;
     }
-
-    private RegionData[] createTable(final HTableDescriptor htd,
-        final int nregions) throws IOException {
-      Path tableDir = FSUtils.getTableDir(rootDir, htd.getTableName());
-      new FSTableDescriptors(conf).createTableDescriptorForTableDirectory(
-          tableDir, new TableDescriptor(htd), false);
-
-      assertTrue(nregions % 2 == 0);
-      RegionData[] regions = new RegionData[nregions];
-      for (int i = 0; i < regions.length; i += 2) {
-        byte[] startKey = Bytes.toBytes(0 + i * 2);
-        byte[] endKey = Bytes.toBytes(1 + i * 2);
-
-        // First region, simple with one plain hfile.
-        HRegionInfo hri = new HRegionInfo(htd.getTableName(), startKey, endKey);
-        HRegionFileSystem rfs = HRegionFileSystem.createRegionOnFileSystem(
-            conf, fs, tableDir, hri);
-        regions[i] = new RegionData(tableDir, hri, 3);
-        for (int j = 0; j < regions[i].files.length; ++j) {
-          Path storeFile = createStoreFile(rfs.createTempName());
-          regions[i].files[j] = rfs.commitStoreFile(TEST_FAMILY, storeFile);
-        }
-
-        // Second region, used to test the split case.
-        // This region contains a reference to the hfile in the first region.
-        startKey = Bytes.toBytes(2 + i * 2);
-        endKey = Bytes.toBytes(3 + i * 2);
-        hri = new HRegionInfo(htd.getTableName());
-        rfs = HRegionFileSystem.createRegionOnFileSystem(conf, fs, tableDir,
-            hri);
-        regions[i + 1] = new RegionData(tableDir, hri, regions[i].files.length);
-        for (int j = 0; j < regions[i].files.length; ++j) {
-          String refName = regions[i].files[j].getName() + '.'
-              + regions[i].hri.getEncodedName();
-          Path refFile = createStoreFile(new Path(rootDir, refName));
-          regions[i + 1].files[j] = rfs.commitStoreFile(TEST_FAMILY, refFile);
-        }
-      }
-      return regions;
-    }
-
-    private Path createStoreFile(final Path storeFile) throws IOException {
-      FSDataOutputStream out = fs.create(storeFile);
-      try {
-        out.write(Bytes.toBytes(storeFile.toString()));
-      } finally {
-        out.close();
-      }
-      return storeFile;
-    }
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
index 9caf905..5e8e7d2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
@@ -448,7 +448,7 @@ public class SnapshotTestingUtils {
   //  Snapshot Mock
   // ==========================================================================
   public static class SnapshotMock {
-    private final static String TEST_FAMILY = "cf";
+    protected final static String TEST_FAMILY = "cf";
     public final static int TEST_NUM_REGIONS = 4;
 
     private final Configuration conf;

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java
index 9b8bd56..69f1fdb 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java
@@ -68,12 +68,12 @@ public class TestExportSnapshot {
 
   protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
-  private final static byte[] FAMILY = Bytes.toBytes("cf");
+  protected final static byte[] FAMILY = Bytes.toBytes("cf");
 
+  protected TableName tableName;
   private byte[] emptySnapshotName;
   private byte[] snapshotName;
   private int tableNumFiles;
-  private TableName tableName;
   private Admin admin;
 
   public static void setUpBaseConf(Configuration conf) {
@@ -111,7 +111,7 @@ public class TestExportSnapshot {
     emptySnapshotName = Bytes.toBytes("emptySnaptb0-" + tid);
 
     // create Table
-    SnapshotTestingUtils.createTable(TEST_UTIL, tableName, FAMILY);
+    createTable();
 
     // Take an empty snapshot
     admin.snapshot(emptySnapshotName, tableName);
@@ -124,6 +124,10 @@ public class TestExportSnapshot {
     admin.snapshot(snapshotName, tableName);
   }
 
+  protected void createTable() throws Exception {
+    SnapshotTestingUtils.createTable(TEST_UTIL, tableName, FAMILY);
+  }
+
   @After
   public void tearDown() throws Exception {
     TEST_UTIL.deleteTable(tableName);
@@ -356,6 +360,10 @@ public class TestExportSnapshot {
     assertEquals(listFiles(fs1, root1, root1), listFiles(fs2, root2, root2));
   }
 
+  protected boolean bypassRegion(HRegionInfo regionInfo) {
+    return false;
+  }
+
   /*
    * Verify if the files exists
    */
@@ -370,6 +378,9 @@ public class TestExportSnapshot {
         @Override
         public void storeFile(final HRegionInfo regionInfo, final String family,
             final SnapshotRegionManifest.StoreFile storeFile) throws IOException {
+          if (bypassRegion(regionInfo))
+            return;
+
           String hfile = storeFile.getName();
           snapshotFiles.add(hfile);
           if (storeFile.hasReference()) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java
index b45d676..fca9f16 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java
@@ -67,28 +67,20 @@ import org.junit.experimental.categories.Category;
 @Category({RegionServerTests.class, LargeTests.class})
 public class TestFlushSnapshotFromClient {
   private static final Log LOG = LogFactory.getLog(TestFlushSnapshotFromClient.class);
-  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
-  private static final int NUM_RS = 2;
-  private static final byte[] TEST_FAM = Bytes.toBytes("fam");
-  private static final TableName TABLE_NAME = TableName.valueOf("test");
-  private final int DEFAULT_NUM_ROWS = 100;
 
-  /**
-   * Setup the config for the cluster
-   * @throws Exception on failure
-   */
+  protected static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
+  protected static final int NUM_RS = 2;
+  protected static final byte[] TEST_FAM = Bytes.toBytes("fam");
+  protected static final TableName TABLE_NAME = TableName.valueOf("test");
+  protected final int DEFAULT_NUM_ROWS = 100;
+
   @BeforeClass
   public static void setupCluster() throws Exception {
-    // Uncomment the following lines if more verbosity is needed for
-    // debugging (see HBASE-12285 for details).
-    //((Log4JLogger)RpcServer.LOG).getLogger().setLevel(Level.ALL);
-    //((Log4JLogger)AbstractRpcClient.LOG).getLogger().setLevel(Level.ALL);
-    //((Log4JLogger)ScannerCallable.LOG).getLogger().setLevel(Level.ALL);
     setupConf(UTIL.getConfiguration());
     UTIL.startMiniCluster(NUM_RS);
   }
 
-  private static void setupConf(Configuration conf) {
+  protected static void setupConf(Configuration conf) {
     // disable the ui
     conf.setInt("hbase.regionsever.info.port", -1);
     // change the flush size to a small amount, regulating number of store files
@@ -107,6 +99,10 @@ public class TestFlushSnapshotFromClient {
 
   @Before
   public void setup() throws Exception {
+    createTable();
+  }
+
+  protected void createTable() throws Exception {
     SnapshotTestingUtils.createTable(UTIL, TABLE_NAME, TEST_FAM);
   }
 
@@ -344,9 +340,9 @@ public class TestFlushSnapshotFromClient {
     admin.cloneSnapshot(snapshotBeforeMergeName, cloneAfterMergeName);
     SnapshotTestingUtils.waitForTableToBeOnline(UTIL, cloneAfterMergeName);
 
-    SnapshotTestingUtils.verifyRowCount(UTIL, TABLE_NAME, numRows);
-    SnapshotTestingUtils.verifyRowCount(UTIL, cloneBeforeMergeName, numRows);
-    SnapshotTestingUtils.verifyRowCount(UTIL, cloneAfterMergeName, numRows);
+    verifyRowCount(UTIL, TABLE_NAME, numRows);
+    verifyRowCount(UTIL, cloneBeforeMergeName, numRows);
+    verifyRowCount(UTIL, cloneAfterMergeName, numRows);
 
     // test that we can delete the snapshot
     UTIL.deleteTable(cloneAfterMergeName);
@@ -390,8 +386,8 @@ public class TestFlushSnapshotFromClient {
     admin.cloneSnapshot(snapshotName, cloneName);
     SnapshotTestingUtils.waitForTableToBeOnline(UTIL, cloneName);
 
-    SnapshotTestingUtils.verifyRowCount(UTIL, TABLE_NAME, numRows);
-    SnapshotTestingUtils.verifyRowCount(UTIL, cloneName, numRows);
+    verifyRowCount(UTIL, TABLE_NAME, numRows);
+    verifyRowCount(UTIL, cloneName, numRows);
 
     // test that we can delete the snapshot
     UTIL.deleteTable(cloneName);
@@ -539,4 +535,14 @@ public class TestFlushSnapshotFromClient {
     }
     SnapshotTestingUtils.waitForTableToBeOnline(UTIL, TABLE_NAME);
   }
+
+
+  protected void verifyRowCount(final HBaseTestingUtility util, final TableName tableName,
+      long expectedRows) throws IOException {
+    SnapshotTestingUtils.verifyRowCount(util, tableName, expectedRows);
+  }
+
+  protected int countRows(final Table table, final byte[]... families) throws IOException {
+    return UTIL.countRows(table, families);
+  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.java
index b7628f17..5535d5e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.java
@@ -18,69 +18,30 @@
 
 package org.apache.hadoop.hbase.snapshot;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 import java.io.IOException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
 import org.apache.hadoop.hbase.mob.MobConstants;
 import org.apache.hadoop.hbase.mob.MobUtils;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
-import org.apache.hadoop.hbase.protobuf.generated.SnapshotProtos.SnapshotFileInfo;
-import org.apache.hadoop.hbase.protobuf.generated.SnapshotProtos.SnapshotRegionManifest;
-import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils.SnapshotMock;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.Pair;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 /**
  * Test Export Snapshot Tool
  */
 @Category(MediumTests.class)
-public class TestMobExportSnapshot {
+public class TestMobExportSnapshot extends TestExportSnapshot {
   private final Log LOG = LogFactory.getLog(getClass());
 
-  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
-
-  private final static byte[] FAMILY = Bytes.toBytes("cf");
-
-  private byte[] emptySnapshotName;
-  private byte[] snapshotName;
-  private int tableNumFiles;
-  private TableName tableName;
-  private Admin admin;
-
   public static void setUpBaseConf(Configuration conf) {
-    conf.setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
-    conf.setInt("hbase.regionserver.msginterval", 100);
-    conf.setInt("hbase.client.pause", 250);
-    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6);
-    conf.setBoolean("hbase.master.enabletable.roundrobin", true);
-    conf.setInt("mapreduce.map.maxattempts", 10);
+    TestExportSnapshot.setUpBaseConf(conf);
     conf.setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
   }
 
@@ -91,342 +52,13 @@ public class TestMobExportSnapshot {
     TEST_UTIL.startMiniMapReduceCluster();
   }
 
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-    TEST_UTIL.shutdownMiniMapReduceCluster();
-    TEST_UTIL.shutdownMiniCluster();
-  }
-
-  /**
-   * Create a table and take a snapshot of the table used by the export test.
-   */
-  @Before
-  public void setUp() throws Exception {
-    this.admin = TEST_UTIL.getHBaseAdmin();
-
-    long tid = System.currentTimeMillis();
-    tableName = TableName.valueOf("testtb-" + tid);
-    snapshotName = Bytes.toBytes("snaptb0-" + tid);
-    emptySnapshotName = Bytes.toBytes("emptySnaptb0-" + tid);
-
-    // create Table
+  @Override
+  protected void createTable() throws Exception {
     MobSnapshotTestingUtils.createMobTable(TEST_UTIL, tableName, 1, FAMILY);
-
-    // Take an empty snapshot
-    admin.snapshot(emptySnapshotName, tableName);
-
-    // Add some rows
-    SnapshotTestingUtils.loadData(TEST_UTIL, tableName, 50, FAMILY);
-    tableNumFiles = admin.getTableRegions(tableName).size();
-
-    // take a snapshot
-    admin.snapshot(snapshotName, tableName);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    TEST_UTIL.deleteTable(tableName);
-    SnapshotTestingUtils.deleteAllSnapshots(TEST_UTIL.getHBaseAdmin());
-    SnapshotTestingUtils.deleteArchiveDirectory(TEST_UTIL);
-  }
-
-  /**
-   * Verfy the result of getBalanceSplits() method.
-   * The result are groups of files, used as input list for the "export" mappers.
-   * All the groups should have similar amount of data.
-   *
-   * The input list is a pair of file path and length.
-   * The getBalanceSplits() function sort it by length,
-   * and assign to each group a file, going back and forth through the groups.
-   */
-  @Test
-  public void testBalanceSplit() throws Exception {
-    // Create a list of files
-    List<Pair<SnapshotFileInfo, Long>> files = new ArrayList<Pair<SnapshotFileInfo, Long>>();
-    for (long i = 0; i <= 20; i++) {
-      SnapshotFileInfo fileInfo = SnapshotFileInfo.newBuilder()
-        .setType(SnapshotFileInfo.Type.HFILE)
-        .setHfile("file-" + i)
-        .build();
-      files.add(new Pair<SnapshotFileInfo, Long>(fileInfo, i));
-    }
-
-    // Create 5 groups (total size 210)
-    //    group 0: 20, 11, 10,  1 (total size: 42)
-    //    group 1: 19, 12,  9,  2 (total size: 42)
-    //    group 2: 18, 13,  8,  3 (total size: 42)
-    //    group 3: 17, 12,  7,  4 (total size: 42)
-    //    group 4: 16, 11,  6,  5 (total size: 42)
-    List<List<Pair<SnapshotFileInfo, Long>>> splits = ExportSnapshot.getBalancedSplits(files, 5);
-    assertEquals(5, splits.size());
-
-    String[] split0 = new String[] {"file-20", "file-11", "file-10", "file-1", "file-0"};
-    verifyBalanceSplit(splits.get(0), split0, 42);
-    String[] split1 = new String[] {"file-19", "file-12", "file-9",  "file-2"};
-    verifyBalanceSplit(splits.get(1), split1, 42);
-    String[] split2 = new String[] {"file-18", "file-13", "file-8",  "file-3"};
-    verifyBalanceSplit(splits.get(2), split2, 42);
-    String[] split3 = new String[] {"file-17", "file-14", "file-7",  "file-4"};
-    verifyBalanceSplit(splits.get(3), split3, 42);
-    String[] split4 = new String[] {"file-16", "file-15", "file-6",  "file-5"};
-    verifyBalanceSplit(splits.get(4), split4, 42);
-  }
-
-  private void verifyBalanceSplit(final List<Pair<SnapshotFileInfo, Long>> split,
-      final String[] expected, final long expectedSize) {
-    assertEquals(expected.length, split.size());
-    long totalSize = 0;
-    for (int i = 0; i < expected.length; ++i) {
-      Pair<SnapshotFileInfo, Long> fileInfo = split.get(i);
-      assertEquals(expected[i], fileInfo.getFirst().getHfile());
-      totalSize += fileInfo.getSecond();
-    }
-    assertEquals(expectedSize, totalSize);
-  }
-
-  /**
-   * Verify if exported snapshot and copied files matches the original one.
-   */
-  @Test
-  public void testExportFileSystemState() throws Exception {
-    testExportFileSystemState(tableName, snapshotName, snapshotName, tableNumFiles);
-  }
-
-  @Test
-  public void testExportFileSystemStateWithSkipTmp() throws Exception {
-    TEST_UTIL.getConfiguration().setBoolean(ExportSnapshot.CONF_SKIP_TMP, true);
-    testExportFileSystemState(tableName, snapshotName, snapshotName, tableNumFiles);
-  }
-
-  @Test
-  public void testEmptyExportFileSystemState() throws Exception {
-    testExportFileSystemState(tableName, emptySnapshotName, emptySnapshotName, 0);
-  }
-
-  @Test
-  public void testConsecutiveExports() throws Exception {
-    Path copyDir = getLocalDestinationDir();
-    testExportFileSystemState(tableName, snapshotName, snapshotName, tableNumFiles, copyDir, false);
-    testExportFileSystemState(tableName, snapshotName, snapshotName, tableNumFiles, copyDir, true);
-    removeExportDir(copyDir);
-  }
-
-  @Test
-  public void testExportWithTargetName() throws Exception {
-    final byte[] targetName = Bytes.toBytes("testExportWithTargetName");
-    testExportFileSystemState(tableName, snapshotName, targetName, tableNumFiles);
-  }
-
-  /**
-   * Mock a snapshot with files in the archive dir,
-   * two regions, and one reference file.
-   */
-  @Test
-  public void testSnapshotWithRefsExportFileSystemState() throws Exception {
-    Configuration conf = TEST_UTIL.getConfiguration();
-
-    Path rootDir = TEST_UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    FileSystem fs = TEST_UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();
-
-    SnapshotMock snapshotMock = new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
-    SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2("tableWithRefsV1");
-    testSnapshotWithRefsExportFileSystemState(builder);
-
-    snapshotMock = new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
-    builder = snapshotMock.createSnapshotV2("tableWithRefsV2");
-    testSnapshotWithRefsExportFileSystemState(builder);
-  }
-
-  /**
-   * Generates a couple of regions for the specified SnapshotMock,
-   * and then it will run the export and verification.
-   */
-  private void testSnapshotWithRefsExportFileSystemState(SnapshotMock.SnapshotBuilder builder)
-      throws Exception {
-    Path[] r1Files = builder.addRegion();
-    Path[] r2Files = builder.addRegion();
-    builder.commit();
-    int snapshotFilesCount = r1Files.length + r2Files.length;
-
-    byte[] snapshotName = Bytes.toBytes(builder.getSnapshotDescription().getName());
-    TableName tableName = builder.getTableDescriptor().getTableName();
-    testExportFileSystemState(tableName, snapshotName, snapshotName, snapshotFilesCount);
-  }
-
-  private void testExportFileSystemState(final TableName tableName, final byte[] snapshotName,
-      final byte[] targetName, int filesExpected) throws Exception {
-    Path copyDir = getHdfsDestinationDir();
-    testExportFileSystemState(tableName, snapshotName, targetName, filesExpected, copyDir, false);
-    removeExportDir(copyDir);
-  }
-
-  /**
-   * Test ExportSnapshot
-   */
-  private void testExportFileSystemState(final TableName tableName, final byte[] snapshotName,
-      final byte[] targetName, int filesExpected, Path copyDir, boolean overwrite)
-      throws Exception {
-    URI hdfsUri = FileSystem.get(TEST_UTIL.getConfiguration()).getUri();
-    FileSystem fs = FileSystem.get(copyDir.toUri(), new Configuration());
-    copyDir = copyDir.makeQualified(fs);
-
-    List<String> opts = new ArrayList<String>();
-    opts.add("-snapshot");
-    opts.add(Bytes.toString(snapshotName));
-    opts.add("-copy-to");
-    opts.add(copyDir.toString());
-    if (targetName != snapshotName) {
-      opts.add("-target");
-      opts.add(Bytes.toString(targetName));
-    }
-    if (overwrite) opts.add("-overwrite");
-
-    // Export Snapshot
-    int res = ExportSnapshot.innerMain(TEST_UTIL.getConfiguration(),
-        opts.toArray(new String[opts.size()]));
-    assertEquals(0, res);
-
-    // Verify File-System state
-    FileStatus[] rootFiles = fs.listStatus(copyDir);
-    assertEquals(filesExpected > 0 ? 2 : 1, rootFiles.length);
-    for (FileStatus fileStatus: rootFiles) {
-      String name = fileStatus.getPath().getName();
-      assertTrue(fileStatus.isDirectory());
-      assertTrue(name.equals(HConstants.SNAPSHOT_DIR_NAME) ||
-                 name.equals(HConstants.HFILE_ARCHIVE_DIRECTORY));
-    }
-
-    // compare the snapshot metadata and verify the hfiles
-    final FileSystem hdfs = FileSystem.get(hdfsUri, TEST_UTIL.getConfiguration());
-    final Path snapshotDir = new Path(HConstants.SNAPSHOT_DIR_NAME, Bytes.toString(snapshotName));
-    final Path targetDir = new Path(HConstants.SNAPSHOT_DIR_NAME, Bytes.toString(targetName));
-    verifySnapshotDir(hdfs, new Path(TEST_UTIL.getDefaultRootDirPath(), snapshotDir),
-        fs, new Path(copyDir, targetDir));
-    Set<String> snapshotFiles = verifySnapshot(fs, copyDir, tableName, Bytes.toString(targetName));
-    assertEquals(filesExpected, snapshotFiles.size());
-  }
-
-  /**
-   * Check that ExportSnapshot will return a failure if something fails.
-   */
-  @Test
-  public void testExportFailure() throws Exception {
-    assertEquals(1, runExportAndInjectFailures(snapshotName, false));
-  }
-
-  /**
-   * Check that ExportSnapshot will succede if something fails but the retry succede.
-   */
-  @Test
-  public void testExportRetry() throws Exception {
-    assertEquals(0, runExportAndInjectFailures(snapshotName, true));
-  }
-
-  /*
-   * Execute the ExportSnapshot job injecting failures
-   */
-  private int runExportAndInjectFailures(final byte[] snapshotName, boolean retry)
-      throws Exception {
-    Path copyDir = getLocalDestinationDir();
-    URI hdfsUri = FileSystem.get(TEST_UTIL.getConfiguration()).getUri();
-    FileSystem fs = FileSystem.get(copyDir.toUri(), new Configuration());
-    copyDir = copyDir.makeQualified(fs);
-
-    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());
-    conf.setBoolean(ExportSnapshot.CONF_TEST_FAILURE, true);
-    conf.setBoolean(ExportSnapshot.CONF_TEST_RETRY, retry);
-
-    // Export Snapshot
-    Path sourceDir = TEST_UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    int res = ExportSnapshot.innerMain(conf, new String[] {
-      "-snapshot", Bytes.toString(snapshotName),
-      "-copy-from", sourceDir.toString(),
-      "-copy-to", copyDir.toString()
-    });
-    return res;
-  }
-
-  /*
-   * verify if the snapshot folder on file-system 1 match the one on file-system 2
-   */
-  private void verifySnapshotDir(final FileSystem fs1, final Path root1,
-      final FileSystem fs2, final Path root2) throws IOException {
-    assertEquals(listFiles(fs1, root1, root1), listFiles(fs2, root2, root2));
-  }
-
-  /*
-   * Verify if the files exists
-   */
-  private Set<String> verifySnapshot(final FileSystem fs, final Path rootDir,
-      final TableName tableName, final String snapshotName) throws IOException {
-    final Path exportedSnapshot = new Path(rootDir,
-      new Path(HConstants.SNAPSHOT_DIR_NAME, snapshotName));
-    final Set<String> snapshotFiles = new HashSet<String>();
-    final Path exportedArchive = new Path(rootDir, HConstants.HFILE_ARCHIVE_DIRECTORY);
-    SnapshotReferenceUtil.visitReferencedFiles(TEST_UTIL.getConfiguration(), fs, exportedSnapshot,
-          new SnapshotReferenceUtil.SnapshotVisitor() {
-        @Override
-        public void storeFile(final HRegionInfo regionInfo, final String family,
-            final SnapshotRegionManifest.StoreFile storeFile) throws IOException {
-          if(MobUtils.isMobRegionInfo(regionInfo))
-            return;
-          String hfile = storeFile.getName();
-          snapshotFiles.add(hfile);
-          if (storeFile.hasReference()) {
-            // Nothing to do here, we have already the reference embedded
-          } else {
-            verifyNonEmptyFile(new Path(exportedArchive,
-              new Path(FSUtils.getTableDir(new Path("./"), tableName),
-                  new Path(regionInfo.getEncodedName(), new Path(family, hfile)))));
-          }
-        }
-
-        private void verifyNonEmptyFile(final Path path) throws IOException {
-          assertTrue(path + " should exists", fs.exists(path));
-          assertTrue(path + " should not be empty", fs.getFileStatus(path).getLen() > 0);
-        }
-    });
-
-    // Verify Snapshot description
-    SnapshotDescription desc = SnapshotDescriptionUtils.readSnapshotInfo(fs, exportedSnapshot);
-    assertTrue(desc.getName().equals(snapshotName));
-    assertTrue(desc.getTable().equals(tableName.getNameAsString()));
-    return snapshotFiles;
-  }
-
-  private Set<String> listFiles(final FileSystem fs, final Path root, final Path dir)
-      throws IOException {
-    Set<String> files = new HashSet<String>();
-    int rootPrefix = root.toString().length();
-    FileStatus[] list = FSUtils.listStatus(fs, dir);
-    if (list != null) {
-      for (FileStatus fstat: list) {
-        LOG.debug(fstat.getPath());
-        if (fstat.isDirectory()) {
-          files.addAll(listFiles(fs, root, fstat.getPath()));
-        } else {
-          files.add(fstat.getPath().toString().substring(rootPrefix));
-        }
-      }
-    }
-    return files;
-  }
-
-  private Path getHdfsDestinationDir() {
-    Path rootDir = TEST_UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    Path path = new Path(new Path(rootDir, "export-test"), "export-" + System.currentTimeMillis());
-    LOG.info("HDFS export destination path: " + path);
-    return path;
-  }
-
-  private Path getLocalDestinationDir() {
-    Path path = TEST_UTIL.getDataTestDir("local-export-" + System.currentTimeMillis());
-    LOG.info("Local export destination path: " + path);
-    return path;
   }
 
-  private void removeExportDir(final Path path) throws IOException {
-    FileSystem fs = FileSystem.get(path.toUri(), new Configuration());
-    fs.delete(path, true);
+  @Override
+  protected boolean bypassRegion(HRegionInfo regionInfo) {
+    return MobUtils.isMobRegionInfo(regionInfo);
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.java
index a8e88b1..eefb180 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.java
@@ -17,44 +17,19 @@
  */
 package org.apache.hadoop.hbase.snapshot;
 
-import static org.junit.Assert.*;
-
 import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.commons.logging.impl.Log4JLogger;
 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.HConstants;
-import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableNotFoundException;
-import org.apache.hadoop.hbase.client.*;
-import org.apache.hadoop.hbase.ipc.RpcServer;
-import org.apache.hadoop.hbase.master.HMaster;
-import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
+import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.mob.MobConstants;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
-import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.log4j.Level;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 /**
@@ -66,482 +41,33 @@ import org.junit.experimental.categories.Category;
  * because there will be a few more flavors of snapshots that need to run these tests.
  */
 @Category({ClientTests.class, LargeTests.class})
-public class TestMobFlushSnapshotFromClient {
+public class TestMobFlushSnapshotFromClient extends TestFlushSnapshotFromClient {
   private static final Log LOG = LogFactory.getLog(TestFlushSnapshotFromClient.class);
-  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
-  private static final int NUM_RS = 2;
-  private static final String STRING_TABLE_NAME = "test";
-  private static final byte[] TEST_FAM = Bytes.toBytes("fam");
-  private static final TableName TABLE_NAME =
-      TableName.valueOf(STRING_TABLE_NAME);
-  private final int DEFAULT_NUM_ROWS = 100;
 
-  /**
-   * Setup the config for the cluster
-   * @throws Exception on failure
-   */
   @BeforeClass
   public static void setupCluster() throws Exception {
-    ((Log4JLogger)RpcServer.LOG).getLogger().setLevel(Level.ALL);
-    ((Log4JLogger)ScannerCallable.LOG).getLogger().setLevel(Level.ALL);
     setupConf(UTIL.getConfiguration());
-    UTIL.startMiniCluster(NUM_RS);
+    UTIL.startMiniCluster(3);
   }
 
-  private static void setupConf(Configuration conf) {
-    // disable the ui
-    conf.setInt("hbase.regionsever.info.port", -1);
-    // change the flush size to a small amount, regulating number of store files
-    conf.setInt("hbase.hregion.memstore.flush.size", 25000);
-    // so make sure we get a compaction when doing a load, but keep around some
-    // files in the store
-    conf.setInt("hbase.hstore.compaction.min", 10);
-    conf.setInt("hbase.hstore.compactionThreshold", 10);
-    // block writes if we get to 12 store files
-    conf.setInt("hbase.hstore.blockingStoreFiles", 12);
-    // Enable snapshot
-    conf.setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
-    conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,
-      ConstantSizeRegionSplitPolicy.class.getName());
-    conf.setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
+  protected static void setupConf(Configuration conf) {
+    TestFlushSnapshotFromClient.setupConf(conf);
+    UTIL.getConfiguration().setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
   }
 
-  @Before
-  public void setup() throws Exception {
+  @Override
+  protected void createTable() throws Exception {
     MobSnapshotTestingUtils.createMobTable(UTIL, TABLE_NAME, 1, TEST_FAM);
   }
 
-  @After
-  public void tearDown() throws Exception {
-    UTIL.deleteTable(TABLE_NAME);
-
-    SnapshotTestingUtils.deleteAllSnapshots(UTIL.getHBaseAdmin());
-    SnapshotTestingUtils.deleteArchiveDirectory(UTIL);
-  }
-
-  @AfterClass
-  public static void cleanupTest() throws Exception {
-    try {
-      UTIL.shutdownMiniCluster();
-    } catch (Exception e) {
-      LOG.warn("failure shutting down cluster", e);
-    }
-  }
-
-  /**
-   * Test simple flush snapshotting a table that is online
-   * @throws Exception
-   */
-  @Test (timeout=300000)
-  public void testFlushTableSnapshot() throws Exception {
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-
-    // put some stuff in the table
-    Table table = ConnectionFactory.createConnection(UTIL.getConfiguration()).getTable(TABLE_NAME);
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, DEFAULT_NUM_ROWS, TEST_FAM);
-
-    LOG.debug("FS state before snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    // take a snapshot of the enabled table
-    String snapshotString = "offlineTableSnapshot";
-    byte[] snapshot = Bytes.toBytes(snapshotString);
-    admin.snapshot(snapshotString, TABLE_NAME, SnapshotDescription.Type.FLUSH);
-    LOG.debug("Snapshot completed.");
-
-    // make sure we have the snapshot
-    List<SnapshotDescription> snapshots = SnapshotTestingUtils.assertOneSnapshotThatMatches(admin,
-      snapshot, TABLE_NAME);
-
-    // make sure its a valid snapshot
-    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();
-    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    LOG.debug("FS state after snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    SnapshotTestingUtils.confirmSnapshotValid(snapshots.get(0), TABLE_NAME, TEST_FAM, rootDir,
-        admin, fs);
-  }
-
-   /**
-   * Test snapshotting a table that is online without flushing
-   * @throws Exception
-   */
-  @Test(timeout=30000)
-  public void testSkipFlushTableSnapshot() throws Exception {
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-
-    // put some stuff in the table
-    Table table = ConnectionFactory.createConnection(UTIL.getConfiguration()).getTable(TABLE_NAME);
-    UTIL.loadTable(table, TEST_FAM);
-
-    LOG.debug("FS state before snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    // take a snapshot of the enabled table
-    String snapshotString = "skipFlushTableSnapshot";
-    byte[] snapshot = Bytes.toBytes(snapshotString);
-    admin.snapshot(snapshotString, TABLE_NAME, SnapshotDescription.Type.SKIPFLUSH);
-    LOG.debug("Snapshot completed.");
-
-    // make sure we have the snapshot
-    List<SnapshotDescription> snapshots = SnapshotTestingUtils.assertOneSnapshotThatMatches(admin,
-        snapshot, TABLE_NAME);
-
-    // make sure its a valid snapshot
-    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();
-    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    LOG.debug("FS state after snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    SnapshotTestingUtils.confirmSnapshotValid(snapshots.get(0), TABLE_NAME, TEST_FAM, rootDir,
-        admin, fs);
-
-    admin.deleteSnapshot(snapshot);
-    snapshots = admin.listSnapshots();
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-  }
-
-
-  /**
-   * Test simple flush snapshotting a table that is online
-   * @throws Exception
-   */
-  @Test (timeout=300000)
-  public void testFlushTableSnapshotWithProcedure() throws Exception {
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-
-    // put some stuff in the table
-    Table table = ConnectionFactory.createConnection(UTIL.getConfiguration()).getTable(TABLE_NAME);
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, DEFAULT_NUM_ROWS, TEST_FAM);
-
-    LOG.debug("FS state before snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    // take a snapshot of the enabled table
-    String snapshotString = "offlineTableSnapshot";
-    byte[] snapshot = Bytes.toBytes(snapshotString);
-    Map<String, String> props = new HashMap<String, String>();
-    props.put("table", TABLE_NAME.getNameAsString());
-    admin.execProcedure(SnapshotManager.ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION,
-        snapshotString, props);
-
-
-    LOG.debug("Snapshot completed.");
-
-    // make sure we have the snapshot
-    List<SnapshotDescription> snapshots = SnapshotTestingUtils.assertOneSnapshotThatMatches(admin,
-      snapshot, TABLE_NAME);
-
-    // make sure its a valid snapshot
-    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();
-    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    LOG.debug("FS state after snapshot:");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-        FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-
-    SnapshotTestingUtils.confirmSnapshotValid(snapshots.get(0), TABLE_NAME, TEST_FAM, rootDir,
-        admin, fs);
-  }
-
-  @Test (timeout=300000)
-  public void testSnapshotFailsOnNonExistantTable() throws Exception {
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-    TableName tableName = TableName.valueOf("_not_a_table");
-
-    // make sure the table doesn't exist
-    boolean fail = false;
-    do {
-    try {
-      admin.getTableDescriptor(tableName);
-      fail = true;
-      LOG.error("Table:" + tableName + " already exists, checking a new name");
-      tableName = TableName.valueOf(tableName+"!");
-    } catch (TableNotFoundException e) {
-      fail = false;
-      }
-    } while (fail);
-
-    // snapshot the non-existant table
-    try {
-      admin.snapshot("fail", tableName, SnapshotDescription.Type.FLUSH);
-      fail("Snapshot succeeded even though there is not table.");
-    } catch (SnapshotCreationException e) {
-      LOG.info("Correctly failed to snapshot a non-existant table:" + e.getMessage());
-    }
-  }
-
-  @Test(timeout = 300000)
-  public void testAsyncFlushSnapshot() throws Exception {
-    Admin admin = UTIL.getHBaseAdmin();
-    SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("asyncSnapshot")
-        .setTable(TABLE_NAME.getNameAsString())
-        .setType(SnapshotDescription.Type.FLUSH)
-        .build();
-
-    // take the snapshot async
-    admin.takeSnapshotAsync(snapshot);
-
-    // constantly loop, looking for the snapshot to complete
-    HMaster master = UTIL.getMiniHBaseCluster().getMaster();
-    SnapshotTestingUtils.waitForSnapshotToComplete(master, snapshot, 200);
-    LOG.info(" === Async Snapshot Completed ===");
-    FSUtils.logFileSystemState(UTIL.getTestFileSystem(),
-      FSUtils.getRootDir(UTIL.getConfiguration()), LOG);
-    // make sure we get the snapshot
-    SnapshotTestingUtils.assertOneSnapshotThatMatches(admin, snapshot);
-  }
-
-  @Test (timeout=300000)
-  public void testSnapshotStateAfterMerge() throws Exception {
-    int numRows = DEFAULT_NUM_ROWS;
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-    // load the table so we have some data
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, numRows, TEST_FAM);
-
-    // Take a snapshot
-    String snapshotBeforeMergeName = "snapshotBeforeMerge";
-    admin.snapshot(snapshotBeforeMergeName, TABLE_NAME, SnapshotDescription.Type.FLUSH);
-
-    // Clone the table
-    TableName cloneBeforeMergeName = TableName.valueOf("cloneBeforeMerge");
-    admin.cloneSnapshot(snapshotBeforeMergeName, cloneBeforeMergeName);
-    SnapshotTestingUtils.waitForTableToBeOnline(UTIL, cloneBeforeMergeName);
-
-    // Merge two regions
-    List<HRegionInfo> regions = admin.getTableRegions(TABLE_NAME);
-    Collections.sort(regions, new Comparator<HRegionInfo>() {
-      public int compare(HRegionInfo r1, HRegionInfo r2) {
-        return Bytes.compareTo(r1.getStartKey(), r2.getStartKey());
-      }
-    });
-
-    int numRegions = admin.getTableRegions(TABLE_NAME).size();
-    int numRegionsAfterMerge = numRegions - 2;
-    admin.mergeRegions(regions.get(1).getEncodedNameAsBytes(),
-        regions.get(2).getEncodedNameAsBytes(), true);
-    admin.mergeRegions(regions.get(5).getEncodedNameAsBytes(),
-        regions.get(6).getEncodedNameAsBytes(), true);
-
-    // Verify that there's one region less
-    waitRegionsAfterMerge(numRegionsAfterMerge);
-    assertEquals(numRegionsAfterMerge, admin.getTableRegions(TABLE_NAME).size());
-
-    // Clone the table
-    TableName cloneAfterMergeName = TableName.valueOf("cloneAfterMerge");
-    admin.cloneSnapshot(snapshotBeforeMergeName, cloneAfterMergeName);
-    SnapshotTestingUtils.waitForTableToBeOnline(UTIL, cloneAfterMergeName);
-
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, TABLE_NAME, numRows);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, cloneBeforeMergeName, numRows);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, cloneAfterMergeName, numRows);
-
-    // test that we can delete the snapshot
-    UTIL.deleteTable(cloneAfterMergeName);
-    UTIL.deleteTable(cloneBeforeMergeName);
-  }
-
-  @Test (timeout=300000)
-  public void testTakeSnapshotAfterMerge() throws Exception {
-    int numRows = DEFAULT_NUM_ROWS;
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-    // load the table so we have some data
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, numRows, TEST_FAM);
-
-    // Merge two regions
-    List<HRegionInfo> regions = admin.getTableRegions(TABLE_NAME);
-    Collections.sort(regions, new Comparator<HRegionInfo>() {
-      public int compare(HRegionInfo r1, HRegionInfo r2) {
-        return Bytes.compareTo(r1.getStartKey(), r2.getStartKey());
-      }
-    });
-
-    int numRegions = admin.getTableRegions(TABLE_NAME).size();
-    int numRegionsAfterMerge = numRegions - 2;
-    admin.mergeRegions(regions.get(1).getEncodedNameAsBytes(),
-        regions.get(2).getEncodedNameAsBytes(), true);
-    admin.mergeRegions(regions.get(5).getEncodedNameAsBytes(),
-        regions.get(6).getEncodedNameAsBytes(), true);
-
-    waitRegionsAfterMerge(numRegionsAfterMerge);
-    assertEquals(numRegionsAfterMerge, admin.getTableRegions(TABLE_NAME).size());
-
-    // Take a snapshot
-    String snapshotName = "snapshotAfterMerge";
-    SnapshotTestingUtils.snapshot(admin, snapshotName, TABLE_NAME.getNameAsString(),
-      SnapshotDescription.Type.FLUSH, 3);
-
-    // Clone the table
-    TableName cloneName = TableName.valueOf("cloneMerge");
-    admin.cloneSnapshot(snapshotName, cloneName);
-    SnapshotTestingUtils.waitForTableToBeOnline(UTIL, cloneName);
-
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, TABLE_NAME, numRows);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, cloneName, numRows);
-
-    // test that we can delete the snapshot
-    UTIL.deleteTable(cloneName);
-  }
-
-  /**
-   * Basic end-to-end test of simple-flush-based snapshots
-   */
-  @Test (timeout=300000)
-  public void testFlushCreateListDestroy() throws Exception {
-    LOG.debug("------- Starting Snapshot test -------------");
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-    // load the table so we have some data
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, DEFAULT_NUM_ROWS, TEST_FAM);
-
-    String snapshotName = "flushSnapshotCreateListDestroy";
-    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();
-    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();
-    SnapshotTestingUtils.createSnapshotAndValidate(admin, TABLE_NAME, Bytes.toString(TEST_FAM),
-      snapshotName, rootDir, fs, true);
-  }
-
-  /**
-   * Demonstrate that we reject snapshot requests if there is a snapshot already running on the
-   * same table currently running and that concurrent snapshots on different tables can both
-   * succeed concurrently.
-   */
-  @Test(timeout=300000)
-  public void testConcurrentSnapshottingAttempts() throws IOException, InterruptedException {
-    final String STRING_TABLE2_NAME = STRING_TABLE_NAME + "2";
-    final TableName TABLE2_NAME =
-        TableName.valueOf(STRING_TABLE2_NAME);
-
-    int ssNum = 20;
-    Admin admin = UTIL.getHBaseAdmin();
-    // make sure we don't fail on listing snapshots
-    SnapshotTestingUtils.assertNoSnapshots(admin);
-    // create second testing table
-    SnapshotTestingUtils.createTable(UTIL, TABLE2_NAME, TEST_FAM);
-    // load the table so we have some data
-    SnapshotTestingUtils.loadData(UTIL, TABLE_NAME, DEFAULT_NUM_ROWS, TEST_FAM);
-    SnapshotTestingUtils.loadData(UTIL, TABLE2_NAME, DEFAULT_NUM_ROWS, TEST_FAM);
-
-    final CountDownLatch toBeSubmitted = new CountDownLatch(ssNum);
-    // We'll have one of these per thread
-    class SSRunnable implements Runnable {
-      SnapshotDescription ss;
-      SSRunnable(SnapshotDescription ss) {
-        this.ss = ss;
-      }
-
-      @Override
-      public void run() {
-        try {
-          Admin admin = UTIL.getHBaseAdmin();
-          LOG.info("Submitting snapshot request: " + ClientSnapshotDescriptionUtils.toString(ss));
-          admin.takeSnapshotAsync(ss);
-        } catch (Exception e) {
-          LOG.info("Exception during snapshot request: " + ClientSnapshotDescriptionUtils.toString(
-              ss)
-              + ".  This is ok, we expect some", e);
-        }
-        LOG.info("Submitted snapshot request: " + ClientSnapshotDescriptionUtils.toString(ss));
-        toBeSubmitted.countDown();
-      }
-    };
-
-    // build descriptions
-    SnapshotDescription[] descs = new SnapshotDescription[ssNum];
-    for (int i = 0; i < ssNum; i++) {
-      SnapshotDescription.Builder builder = SnapshotDescription.newBuilder();
-      builder.setTable(((i % 2) == 0 ? TABLE_NAME : TABLE2_NAME).getNameAsString());
-      builder.setName("ss"+i);
-      builder.setType(SnapshotDescription.Type.FLUSH);
-      descs[i] = builder.build();
-    }
-
-    // kick each off its own thread
-    for (int i=0 ; i < ssNum; i++) {
-      new Thread(new SSRunnable(descs[i])).start();
-    }
-
-    // wait until all have been submitted
-    toBeSubmitted.await();
-
-    // loop until all are done.
-    while (true) {
-      int doneCount = 0;
-      for (SnapshotDescription ss : descs) {
-        try {
-          if (admin.isSnapshotFinished(ss)) {
-            doneCount++;
-          }
-        } catch (Exception e) {
-          LOG.warn("Got an exception when checking for snapshot " + ss.getName(), e);
-          doneCount++;
-        }
-      }
-      if (doneCount == descs.length) {
-        break;
-      }
-      Thread.sleep(100);
-    }
-
-    // dump for debugging
-    logFSTree(FSUtils.getRootDir(UTIL.getConfiguration()));
-
-    List<SnapshotDescription> taken = admin.listSnapshots();
-    int takenSize = taken.size();
-    LOG.info("Taken " + takenSize + " snapshots:  " + taken);
-    assertTrue("We expect at least 1 request to be rejected because of we concurrently" +
-        " issued many requests", takenSize < ssNum && takenSize > 0);
-
-    // Verify that there's at least one snapshot per table
-    int t1SnapshotsCount = 0;
-    int t2SnapshotsCount = 0;
-    for (SnapshotDescription ss : taken) {
-      if (TableName.valueOf(ss.getTable()).equals(TABLE_NAME)) {
-        t1SnapshotsCount++;
-      } else if (TableName.valueOf(ss.getTable()).equals(TABLE2_NAME)) {
-        t2SnapshotsCount++;
-      }
-    }
-    assertTrue("We expect at least 1 snapshot of table1 ", t1SnapshotsCount > 0);
-    assertTrue("We expect at least 1 snapshot of table2 ", t2SnapshotsCount > 0);
-
-    UTIL.deleteTable(TABLE2_NAME);
-  }
-
-  private void logFSTree(Path root) throws IOException {
-    FSUtils.logFileSystemState(UTIL.getDFSCluster().getFileSystem(), root, LOG);
+  @Override
+  protected void verifyRowCount(final HBaseTestingUtility util, final TableName tableName,
+      long expectedRows) throws IOException {
+    MobSnapshotTestingUtils.verifyMobRowCount(util, tableName, expectedRows);
   }
 
-  private void waitRegionsAfterMerge(final long numRegionsAfterMerge)
-      throws IOException, InterruptedException {
-    Admin admin = UTIL.getHBaseAdmin();
-    // Verify that there's one region less
-    long startTime = System.currentTimeMillis();
-    while (admin.getTableRegions(TABLE_NAME).size() != numRegionsAfterMerge) {
-      // This may be flaky... if after 15sec the merge is not complete give up
-      // it will fail in the assertEquals(numRegionsAfterMerge).
-      if ((System.currentTimeMillis() - startTime) > 15000)
-        break;
-      Thread.sleep(100);
-    }
-    SnapshotTestingUtils.waitForTableToBeOnline(UTIL, TABLE_NAME);
+  @Override
+  protected int countRows(final Table table, final byte[]... families) throws IOException {
+    return MobSnapshotTestingUtils.countMobRows(table, families);
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.java
index cb58b17..6893346 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.java
@@ -21,26 +21,15 @@ import java.io.IOException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
 import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.master.MasterFileSystem;
-import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
 import org.apache.hadoop.hbase.mob.MobConstants;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
-import org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 /**
@@ -50,162 +39,33 @@ import org.junit.experimental.categories.Category;
  * this because there will be a few more flavors of snapshots that need to run these tests.
  */
 @Category({ClientTests.class,LargeTests.class})
-public class TestMobRestoreFlushSnapshotFromClient {
+public class TestMobRestoreFlushSnapshotFromClient extends TestRestoreFlushSnapshotFromClient {
   final Log LOG = LogFactory.getLog(getClass());
 
-  private final static HBaseTestingUtility UTIL = new HBaseTestingUtility();
-
-  private final byte[] FAMILY = Bytes.toBytes("cf");
-
-  private byte[] snapshotName0;
-  private byte[] snapshotName1;
-  private byte[] snapshotName2;
-  private int snapshot0Rows;
-  private int snapshot1Rows;
-  private TableName tableName;
-  private Admin admin;
-
   @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
-    UTIL.getConfiguration().setBoolean("hbase.online.schema.update.enable", true);
-    UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100);
-    UTIL.getConfiguration().setInt("hbase.client.pause", 250);
-    UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6);
-    UTIL.getConfiguration().setBoolean(
-        "hbase.master.enabletable.roundrobin", true);
-
-    // Enable snapshot
-    UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
-    UTIL.getConfiguration().setLong(RegionServerSnapshotManager.SNAPSHOT_TIMEOUT_MILLIS_KEY,
-      RegionServerSnapshotManager.SNAPSHOT_TIMEOUT_MILLIS_DEFAULT * 2);
-
-    UTIL.getConfiguration().setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
-
+  public static void setupCluster() throws Exception {
+    setupConf(UTIL.getConfiguration());
     UTIL.startMiniCluster(3);
   }
 
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-    UTIL.shutdownMiniCluster();
+  protected static void setupConf(Configuration conf) {
+    TestRestoreFlushSnapshotFromClient.setupConf(conf);
+    UTIL.getConfiguration().setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
   }
 
-  /**
-   * Initialize the tests with a table filled with some data
-   * and two snapshots (snapshotName0, snapshotName1) of different states.
-   * The tableName, snapshotNames and the number of rows in the snapshot are initialized.
-   */
-  @Before
-  public void setup() throws Exception {
-    this.admin = UTIL.getHBaseAdmin();
-
-    long tid = System.currentTimeMillis();
-    tableName = TableName.valueOf("testtb-" + tid);
-    snapshotName0 = Bytes.toBytes("snaptb0-" + tid);
-    snapshotName1 = Bytes.toBytes("snaptb1-" + tid);
-    snapshotName2 = Bytes.toBytes("snaptb2-" + tid);
-
-    // create Table
+  @Override
+  protected void createTable() throws Exception {
     MobSnapshotTestingUtils.createMobTable(UTIL, tableName, 1, FAMILY);
-
-    Table table = ConnectionFactory.createConnection(UTIL.getConfiguration()).getTable(tableName);
-    SnapshotTestingUtils.loadData(UTIL, tableName, 500, FAMILY);
-    snapshot0Rows = MobSnapshotTestingUtils.countMobRows(table);
-    LOG.info("=== before snapshot with 500 rows");
-    logFSTree();
-
-    // take a snapshot
-    admin.snapshot(Bytes.toString(snapshotName0), tableName,
-        SnapshotDescription.Type.FLUSH);
-
-    LOG.info("=== after snapshot with 500 rows");
-    logFSTree();
-
-    // insert more data
-    SnapshotTestingUtils.loadData(UTIL, tableName, 500, FAMILY);
-    snapshot1Rows = MobSnapshotTestingUtils.countMobRows(table);
-    LOG.info("=== before snapshot with 1000 rows");
-    logFSTree();
-
-    // take a snapshot of the updated table
-    admin.snapshot(Bytes.toString(snapshotName1), tableName,
-        SnapshotDescription.Type.FLUSH);
-    LOG.info("=== after snapshot with 1000 rows");
-    logFSTree();
-    table.close();
   }
 
-  @After
-  public void tearDown() throws Exception {
-    SnapshotTestingUtils.deleteAllSnapshots(UTIL.getHBaseAdmin());
-    SnapshotTestingUtils.deleteArchiveDirectory(UTIL);
-  }
-
-  @Test
-  public void testTakeFlushSnapshot() throws IOException {
-    // taking happens in setup.
-  }
-
-  @Test
-  public void testRestoreSnapshot() throws IOException {
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, tableName, snapshot1Rows);
-
-    // Restore from snapshot-0
-    admin.disableTable(tableName);
-    admin.restoreSnapshot(snapshotName0);
-    logFSTree();
-    admin.enableTable(tableName);
-    LOG.info("=== after restore with 500 row snapshot");
-    logFSTree();
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, tableName, snapshot0Rows);
-
-    // Restore from snapshot-1
-    admin.disableTable(tableName);
-    admin.restoreSnapshot(snapshotName1);
-    admin.enableTable(tableName);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, tableName, snapshot1Rows);
-  }
-
-  @Test(expected=SnapshotDoesNotExistException.class)
-  public void testCloneNonExistentSnapshot() throws IOException, InterruptedException {
-    String snapshotName = "random-snapshot-" + System.currentTimeMillis();
-    TableName tableName = TableName.valueOf("random-table-" + System.currentTimeMillis());
-    admin.cloneSnapshot(snapshotName, tableName);
-  }
-
-  @Test
-  public void testCloneSnapshot() throws IOException, InterruptedException {
-    TableName clonedTableName = TableName.valueOf("clonedtb-" + System.currentTimeMillis());
-    testCloneSnapshot(clonedTableName, snapshotName0, snapshot0Rows);
-    testCloneSnapshot(clonedTableName, snapshotName1, snapshot1Rows);
-  }
-
-  private void testCloneSnapshot(final TableName tableName, final byte[] snapshotName,
-      int snapshotRows) throws IOException, InterruptedException {
-    // create a new table from snapshot
-    admin.cloneSnapshot(snapshotName, tableName);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, tableName, snapshotRows);
-
-    UTIL.deleteTable(tableName);
-  }
-
-  @Test
-  public void testRestoreSnapshotOfCloned() throws IOException, InterruptedException {
-    TableName clonedTableName = TableName.valueOf("clonedtb-" + System.currentTimeMillis());
-    admin.cloneSnapshot(snapshotName0, clonedTableName);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, clonedTableName, snapshot0Rows);
-    admin.snapshot(Bytes.toString(snapshotName2), clonedTableName, SnapshotDescription.Type.FLUSH);
-    UTIL.deleteTable(clonedTableName);
-
-    admin.cloneSnapshot(snapshotName2, clonedTableName);
-    MobSnapshotTestingUtils.verifyMobRowCount(UTIL, clonedTableName, snapshot0Rows);
-    UTIL.deleteTable(clonedTableName);
+  @Override
+  protected void verifyRowCount(final HBaseTestingUtility util, final TableName tableName,
+      long expectedRows) throws IOException {
+    MobSnapshotTestingUtils.verifyMobRowCount(util, tableName, expectedRows);
   }
 
-  // ==========================================================================
-  //  Helpers
-  // ==========================================================================
-  private void logFSTree() throws IOException {
-    MasterFileSystem mfs = UTIL.getMiniHBaseCluster().getMaster().getMasterFileSystem();
-    FSUtils.logFileSystemState(mfs.getFileSystem(), mfs.getRootDir(), LOG);
+  @Override
+  protected int countRows(final Table table, final byte[]... families) throws IOException {
+    return MobSnapshotTestingUtils.countMobRows(table, families);
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.java
index c5ec3ad..9934513 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.java
@@ -17,31 +17,14 @@
  */
 package org.apache.hadoop.hbase.snapshot;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 import java.io.IOException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 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.HTableDescriptor;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;
-import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.mob.MobConstants;
-import org.apache.hadoop.hbase.monitoring.MonitoredTask;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
-import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
 import org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils.SnapshotMock;
-import org.apache.hadoop.hbase.util.FSTableDescriptors;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.Mockito;
 
@@ -49,112 +32,16 @@ import org.mockito.Mockito;
  * Test the restore/clone operation from a file-system point of view.
  */
 @Category(SmallTests.class)
-public class TestMobRestoreSnapshotHelper {
+public class TestMobRestoreSnapshotHelper extends TestRestoreSnapshotHelper {
   final Log LOG = LogFactory.getLog(getClass());
 
-  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
-
-  private Configuration conf;
-  private FileSystem fs;
-  private Path rootDir;
-
-  @Before
-  public void setup() throws Exception {
-    rootDir = TEST_UTIL.getDataTestDir("testRestore");
-    fs = TEST_UTIL.getTestFileSystem();
-    TEST_UTIL.getConfiguration().setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
-    conf = TEST_UTIL.getConfiguration();
-    FSUtils.setRootDir(conf, rootDir);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    fs.delete(TEST_UTIL.getDataTestDir(), true);
-  }
-
-  @Test
-  public void testRestore() throws IOException {
-    // Test Rolling-Upgrade like Snapshot.
-    // half machines writing using v1 and the others using v2 format.
-    SnapshotMock snapshotMock = new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
-    SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2("snapshot");
-    builder.addRegionV1();
-    builder.addRegionV2();
-    builder.addRegionV2();
-    builder.addRegionV1();
-    Path snapshotDir = builder.commit();
-    HTableDescriptor htd = builder.getTableDescriptor();
-    SnapshotDescription desc = builder.getSnapshotDescription();
-
-    // Test clone a snapshot
-    HTableDescriptor htdClone = snapshotMock.createHtd("testtb-clone");
-    testRestore(snapshotDir, desc, htdClone);
-    verifyRestore(rootDir, htd, htdClone);
-
-    // Test clone a clone ("link to link")
-    SnapshotDescription cloneDesc = SnapshotDescription.newBuilder()
-        .setName("cloneSnapshot")
-        .setTable("testtb-clone")
-        .build();
-    Path cloneDir = FSUtils.getTableDir(rootDir, htdClone.getTableName());
-    HTableDescriptor htdClone2 = snapshotMock.createHtd("testtb-clone2");
-    testRestore(cloneDir, cloneDesc, htdClone2);
-    verifyRestore(rootDir, htd, htdClone2);
-  }
-
-  private void verifyRestore(final Path rootDir, final HTableDescriptor sourceHtd,
-      final HTableDescriptor htdClone) throws IOException {
-    String[] files = SnapshotTestingUtils.listHFileNames(fs,
-      FSUtils.getTableDir(rootDir, htdClone.getTableName()));
-    assertEquals(12, files.length);
-    for (int i = 0; i < files.length; i += 2) {
-      String linkFile = files[i];
-      String refFile = files[i+1];
-      assertTrue(linkFile + " should be a HFileLink", HFileLink.isHFileLink(linkFile));
-      assertTrue(refFile + " should be a Referene", StoreFileInfo.isReference(refFile));
-      assertEquals(sourceHtd.getTableName(), HFileLink.getReferencedTableName(linkFile));
-      Path refPath = getReferredToFile(refFile);
-      LOG.debug("get reference name for file " + refFile + " = " + refPath);
-      assertTrue(refPath.getName() + " should be a HFileLink",
-        HFileLink.isHFileLink(refPath.getName()));
-      assertEquals(linkFile, refPath.getName());
-    }
-  }
-
-  /**
-   * Execute the restore operation
-   * @param snapshotDir The snapshot directory to use as "restore source"
-   * @param sd The snapshot descriptor
-   * @param htdClone The HTableDescriptor of the table to restore/clone.
-   */
-  public void testRestore(final Path snapshotDir, final SnapshotDescription sd,
-      final HTableDescriptor htdClone) throws IOException {
-    LOG.debug("pre-restore table=" + htdClone.getTableName() + " snapshot=" + snapshotDir);
-    FSUtils.logFileSystemState(fs, rootDir, LOG);
-
-    new FSTableDescriptors(conf).createTableDescriptor(htdClone);
-    RestoreSnapshotHelper helper = getRestoreHelper(rootDir, snapshotDir, sd, htdClone);
-    helper.restoreHdfsRegions();
-
-    LOG.debug("post-restore table=" + htdClone.getTableName() + " snapshot=" + snapshotDir);
-    FSUtils.logFileSystemState(fs, rootDir, LOG);
-  }
-
-  /**
-   * Initialize the restore helper, based on the snapshot and table information provided.
-   */
-  private RestoreSnapshotHelper getRestoreHelper(final Path rootDir, final Path snapshotDir,
-      final SnapshotDescription sd, final HTableDescriptor htdClone) throws IOException {
-    ForeignExceptionDispatcher monitor = Mockito.mock(ForeignExceptionDispatcher.class);
-    MonitoredTask status = Mockito.mock(MonitoredTask.class);
-
-    SnapshotManifest manifest = SnapshotManifest.open(conf, fs, snapshotDir, sd);
-    return new RestoreSnapshotHelper(conf, fs, manifest,
-      htdClone, rootDir, monitor, status);
+  @Override
+  protected void setupConf(Configuration conf) {
+    conf.setInt(MobConstants.MOB_FILE_CACHE_SIZE_KEY, 0);
   }
 
-  private Path getReferredToFile(final String referenceName) {
-    Path fakeBasePath = new Path(new Path("table", "region"), "cf");
-    return StoreFileInfo.getReferredToFile(new Path(fakeBasePath, referenceName));
+  @Override
+  protected SnapshotMock createSnapshotMock() throws IOException {
+    return new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.java
index 219e694..99ece6c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
@@ -51,20 +52,25 @@ import org.junit.experimental.categories.Category;
 public class TestRestoreFlushSnapshotFromClient {
   private static final Log LOG = LogFactory.getLog(TestRestoreFlushSnapshotFromClient.class);
 
-  private final static HBaseTestingUtility UTIL = new HBaseTestingUtility();
+  protected final static HBaseTestingUtility UTIL = new HBaseTestingUtility();
 
-  private final byte[] FAMILY = Bytes.toBytes("cf");
+  protected final byte[] FAMILY = Bytes.toBytes("cf");
 
-  private byte[] snapshotName0;
-  private byte[] snapshotName1;
-  private byte[] snapshotName2;
-  private int snapshot0Rows;
-  private int snapshot1Rows;
-  private TableName tableName;
-  private Admin admin;
+  protected byte[] snapshotName0;
+  protected byte[] snapshotName1;
+  protected byte[] snapshotName2;
+  protected int snapshot0Rows;
+  protected int snapshot1Rows;
+  protected TableName tableName;
+  protected Admin admin;
 
   @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
+  public static void setupCluster() throws Exception {
+    setupConf(UTIL.getConfiguration());
+    UTIL.startMiniCluster(3);
+  }
+
+  protected static void setupConf(Configuration conf) {
     UTIL.getConfiguration().setBoolean("hbase.online.schema.update.enable", true);
     UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100);
     UTIL.getConfiguration().setInt("hbase.client.pause", 250);
@@ -76,8 +82,6 @@ public class TestRestoreFlushSnapshotFromClient {
     UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
     UTIL.getConfiguration().setLong(RegionServerSnapshotManager.SNAPSHOT_TIMEOUT_MILLIS_KEY,
       RegionServerSnapshotManager.SNAPSHOT_TIMEOUT_MILLIS_DEFAULT * 2);
-
-    UTIL.startMiniCluster(3);
   }
 
   @AfterClass
@@ -85,6 +89,10 @@ public class TestRestoreFlushSnapshotFromClient {
     UTIL.shutdownMiniCluster();
   }
 
+  protected void createTable() throws Exception {
+    SnapshotTestingUtils.createTable(UTIL, tableName, FAMILY);
+  }
+
   /**
    * Initialize the tests with a table filled with some data
    * and two snapshots (snapshotName0, snapshotName1) of different states.
@@ -101,10 +109,10 @@ public class TestRestoreFlushSnapshotFromClient {
     snapshotName2 = Bytes.toBytes("snaptb2-" + tid);
 
     // create Table and disable it
-    SnapshotTestingUtils.createTable(UTIL, tableName, FAMILY);
+    createTable();
     SnapshotTestingUtils.loadData(UTIL, tableName, 500, FAMILY);
     Table table = UTIL.getConnection().getTable(tableName);
-    snapshot0Rows = UTIL.countRows(table);
+    snapshot0Rows = countRows(table);
     LOG.info("=== before snapshot with 500 rows");
     logFSTree();
 
@@ -117,7 +125,7 @@ public class TestRestoreFlushSnapshotFromClient {
 
     // insert more data
     SnapshotTestingUtils.loadData(UTIL, tableName, 500, FAMILY);
-    snapshot1Rows = UTIL.countRows(table);
+    snapshot1Rows = countRows(table);
     LOG.info("=== before snapshot with 1000 rows");
     logFSTree();
 
@@ -142,7 +150,7 @@ public class TestRestoreFlushSnapshotFromClient {
 
   @Test
   public void testRestoreSnapshot() throws IOException {
-    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);
+    verifyRowCount(UTIL, tableName, snapshot1Rows);
 
     // Restore from snapshot-0
     admin.disableTable(tableName);
@@ -151,13 +159,13 @@ public class TestRestoreFlushSnapshotFromClient {
     admin.enableTable(tableName);
     LOG.info("=== after restore with 500 row snapshot");
     logFSTree();
-    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot0Rows);
+    verifyRowCount(UTIL, tableName, snapshot0Rows);
 
     // Restore from snapshot-1
     admin.disableTable(tableName);
     admin.restoreSnapshot(snapshotName1);
     admin.enableTable(tableName);
-    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);
+    verifyRowCount(UTIL, tableName, snapshot1Rows);
   }
 
   @Test(expected=SnapshotDoesNotExistException.class)
@@ -178,7 +186,7 @@ public class TestRestoreFlushSnapshotFromClient {
       int snapshotRows) throws IOException, InterruptedException {
     // create a new table from snapshot
     admin.cloneSnapshot(snapshotName, tableName);
-    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshotRows);
+    verifyRowCount(UTIL, tableName, snapshotRows);
 
     UTIL.deleteTable(tableName);
   }
@@ -187,12 +195,12 @@ public class TestRestoreFlushSnapshotFromClient {
   public void testRestoreSnapshotOfCloned() throws IOException, InterruptedException {
     TableName clonedTableName = TableName.valueOf("clonedtb-" + System.currentTimeMillis());
     admin.cloneSnapshot(snapshotName0, clonedTableName);
-    SnapshotTestingUtils.verifyRowCount(UTIL, clonedTableName, snapshot0Rows);
+    verifyRowCount(UTIL, clonedTableName, snapshot0Rows);
     admin.snapshot(Bytes.toString(snapshotName2), clonedTableName, SnapshotDescription.Type.FLUSH);
     UTIL.deleteTable(clonedTableName);
 
     admin.cloneSnapshot(snapshotName2, clonedTableName);
-    SnapshotTestingUtils.verifyRowCount(UTIL, clonedTableName, snapshot0Rows);
+    verifyRowCount(UTIL, clonedTableName, snapshot0Rows);
     UTIL.deleteTable(clonedTableName);
   }
 
@@ -203,4 +211,13 @@ public class TestRestoreFlushSnapshotFromClient {
     MasterFileSystem mfs = UTIL.getMiniHBaseCluster().getMaster().getMasterFileSystem();
     FSUtils.logFileSystemState(mfs.getFileSystem(), mfs.getRootDir(), LOG);
   }
+
+  protected void verifyRowCount(final HBaseTestingUtility util, final TableName tableName,
+      long expectedRows) throws IOException {
+    SnapshotTestingUtils.verifyRowCount(util, tableName, expectedRows);
+  }
+
+  protected int countRows(final Table table, final byte[]... families) throws IOException {
+    return UTIL.countRows(table, families);
+  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e26ae04/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java
index 3fac2fd..365d56c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java
@@ -53,13 +53,16 @@ import org.mockito.Mockito;
 public class TestRestoreSnapshotHelper {
   private static final Log LOG = LogFactory.getLog(TestRestoreSnapshotHelper.class);
 
-  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
-  private final static String TEST_HFILE = "abc";
+  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
+  protected final static String TEST_HFILE = "abc";
 
-  private Configuration conf;
-  private Path archiveDir;
-  private FileSystem fs;
-  private Path rootDir;
+  protected Configuration conf;
+  protected Path archiveDir;
+  protected FileSystem fs;
+  protected Path rootDir;
+
+  protected void setupConf(Configuration conf) {
+  }
 
   @Before
   public void setup() throws Exception {
@@ -67,6 +70,7 @@ public class TestRestoreSnapshotHelper {
     archiveDir = new Path(rootDir, HConstants.HFILE_ARCHIVE_DIRECTORY);
     fs = TEST_UTIL.getTestFileSystem();
     conf = TEST_UTIL.getConfiguration();
+    setupConf(conf);
     FSUtils.setRootDir(conf, rootDir);
   }
 
@@ -75,11 +79,15 @@ public class TestRestoreSnapshotHelper {
     fs.delete(TEST_UTIL.getDataTestDir(), true);
   }
 
+  protected SnapshotMock createSnapshotMock() throws IOException {
+    return new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
+  }
+
   @Test
   public void testRestore() throws IOException {
     // Test Rolling-Upgrade like Snapshot.
     // half machines writing using v1 and the others using v2 format.
-    SnapshotMock snapshotMock = new SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);
+    SnapshotMock snapshotMock = createSnapshotMock();
     SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2("snapshot");
     builder.addRegionV1();
     builder.addRegionV2();
@@ -129,7 +137,7 @@ public class TestRestoreSnapshotHelper {
    * @param sd The snapshot descriptor
    * @param htdClone The HTableDescriptor of the table to restore/clone.
    */
-  public void testRestore(final Path snapshotDir, final SnapshotDescription sd,
+  private void testRestore(final Path snapshotDir, final SnapshotDescription sd,
       final HTableDescriptor htdClone) throws IOException {
     LOG.debug("pre-restore table=" + htdClone.getTableName() + " snapshot=" + snapshotDir);
     FSUtils.logFileSystemState(fs, rootDir, LOG);


Mime
View raw message