001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.client; 019 020import static org.junit.Assert.assertEquals; 021 022import java.io.IOException; 023import java.util.List; 024import org.apache.hadoop.hbase.TableName; 025import org.apache.hadoop.hbase.master.RegionState; 026import org.apache.hadoop.hbase.master.assignment.RegionStates; 027import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils; 028import org.apache.hadoop.hbase.util.Bytes; 029import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; 030import org.junit.Test; 031 032public class CloneSnapshotFromClientAfterSplittingRegionTestBase 033 extends CloneSnapshotFromClientTestBase { 034 035 private void splitRegion(final RegionInfo regionInfo) throws IOException { 036 byte[][] splitPoints = Bytes.split(regionInfo.getStartKey(), regionInfo.getEndKey(), 1); 037 admin.split(regionInfo.getTable(), splitPoints[1]); 038 } 039 040 @Test 041 public void testCloneSnapshotAfterSplittingRegion() throws IOException, InterruptedException { 042 // Turn off the CatalogJanitor 043 admin.catalogJanitorSwitch(false); 044 045 try { 046 List<RegionInfo> regionInfos = admin.getRegions(tableName); 047 RegionReplicaUtil.removeNonDefaultRegions(regionInfos); 048 049 // Split the first region 050 splitRegion(regionInfos.get(0)); 051 052 // Take a snapshot 053 admin.snapshot(snapshotName2, tableName); 054 055 // Clone the snapshot to another table 056 TableName clonedTableName = 057 TableName.valueOf(getValidMethodName() + "-" + EnvironmentEdgeManager.currentTime()); 058 admin.cloneSnapshot(snapshotName2, clonedTableName); 059 SnapshotTestingUtils.waitForTableToBeOnline(TEST_UTIL, clonedTableName); 060 061 verifyRowCount(TEST_UTIL, clonedTableName, snapshot1Rows); 062 063 RegionStates regionStates = 064 TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates(); 065 066 // The region count of the cloned table should be the same as the one of the original table 067 int openRegionCountOfOriginalTable = 068 regionStates.getRegionByStateOfTable(tableName).get(RegionState.State.OPEN).size(); 069 int openRegionCountOfClonedTable = 070 regionStates.getRegionByStateOfTable(clonedTableName).get(RegionState.State.OPEN).size(); 071 assertEquals(openRegionCountOfOriginalTable, openRegionCountOfClonedTable); 072 073 int splitRegionCountOfOriginalTable = 074 regionStates.getRegionByStateOfTable(tableName).get(RegionState.State.SPLIT).size(); 075 int splitRegionCountOfClonedTable = 076 regionStates.getRegionByStateOfTable(clonedTableName).get(RegionState.State.SPLIT).size(); 077 assertEquals(splitRegionCountOfOriginalTable, splitRegionCountOfClonedTable); 078 079 TEST_UTIL.deleteTable(clonedTableName); 080 } finally { 081 admin.catalogJanitorSwitch(true); 082 } 083 } 084 085 @Test 086 public void testCloneSnapshotBeforeSplittingRegionAndDroppingTable() 087 throws IOException, InterruptedException { 088 // Turn off the CatalogJanitor 089 admin.catalogJanitorSwitch(false); 090 091 try { 092 // Take a snapshot 093 admin.snapshot(snapshotName2, tableName); 094 095 // Clone the snapshot to another table 096 TableName clonedTableName = 097 TableName.valueOf(getValidMethodName() + "-" + EnvironmentEdgeManager.currentTime()); 098 admin.cloneSnapshot(snapshotName2, clonedTableName); 099 SnapshotTestingUtils.waitForTableToBeOnline(TEST_UTIL, clonedTableName); 100 101 // Split the first region of the original table 102 List<RegionInfo> regionInfos = admin.getRegions(tableName); 103 RegionReplicaUtil.removeNonDefaultRegions(regionInfos); 104 splitRegion(regionInfos.get(0)); 105 106 // Drop the original table 107 admin.disableTable(tableName); 108 admin.deleteTable(tableName); 109 110 // Disable and enable the cloned table. This should be successful 111 admin.disableTable(clonedTableName); 112 admin.enableTable(clonedTableName); 113 SnapshotTestingUtils.waitForTableToBeOnline(TEST_UTIL, clonedTableName); 114 115 verifyRowCount(TEST_UTIL, clonedTableName, snapshot1Rows); 116 } finally { 117 admin.catalogJanitorSwitch(true); 118 } 119 } 120}