@Test public void testSnapshotStateAfterMerge() throws Exception { int numRows = DEFAULT_NUM_ROWS; // 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, SnapshotType.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.mergeRegionsAsync( regions.get(1).getEncodedNameAsBytes(), regions.get(2).getEncodedNameAsBytes(), true); admin.mergeRegionsAsync( regions.get(4).getEncodedNameAsBytes(), regions.get(5).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); verifyRowCount(UTIL, TABLE_NAME, numRows); verifyRowCount(UTIL, cloneBeforeMergeName, numRows); verifyRowCount(UTIL, cloneAfterMergeName, numRows); // test that we can delete the snapshot UTIL.deleteTable(cloneAfterMergeName); UTIL.deleteTable(cloneBeforeMergeName); }