Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java (revision 10840a51e851d3ea50749a9527310142a967dab3) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java (revision ) @@ -147,6 +147,11 @@ protected static List getRegionsFromMeta(final MasterProcedureEnv env, final TableName tableName) throws IOException { + return getRegionsFromMeta(env, tableName, false); + } + + protected static List getRegionsFromMeta(final MasterProcedureEnv env, + final TableName tableName, final boolean excludeOfflinedSplitParents) throws IOException { return ProcedureSyncWait.waitFor(env, "regions of table=" + tableName + " from meta", new ProcedureSyncWait.Predicate>() { @Override @@ -154,7 +159,7 @@ if (TableName.META_TABLE_NAME.equals(tableName)) { return new MetaTableLocator().getMetaRegions(env.getMasterServices().getZooKeeper()); } - return MetaTableAccessor.getTableRegions(env.getMasterServices().getConnection(),tableName); + return MetaTableAccessor.getTableRegions(env.getMasterServices().getConnection(),tableName, excludeOfflinedSplitParents); } }); } Index: hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java (revision 10840a51e851d3ea50749a9527310142a967dab3) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java (revision ) @@ -194,4 +194,33 @@ UTIL.getConnection(), tableName, 50, splitKeys, families); assertEquals(50, UTIL.countRows(tableName)); } + + @Test(timeout=60000) + public void testTruncateWithPreserveAfterSplit() throws Exception { + final String[] families = new String[] { "f1", "f2" }; + final byte[][] splitKeys = new byte[][] { Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c") }; + TableName tableName = TableName.valueOf("testTruncateWithPreserveAfterSplit"); + HRegionInfo[] regions = MasterProcedureTestingUtility + .createTable(getMasterProcedureExecutor(), tableName, splitKeys, + families); + // load enough data so the table can split + MasterProcedureTestingUtility + .loadData(UTIL.getConnection(), tableName, 5000, splitKeys, families); + assertEquals(5000, UTIL.countRows(tableName)); + UTIL.getHBaseAdmin().split(tableName); + UTIL.waitUntilAllRegionsAssigned(tableName); + //wait until split really happens + while (UTIL.getHBaseAdmin().getTableRegions(tableName).size() <= regions.length) { + Thread.sleep(50); + } + // disable the table + UTIL.getHBaseAdmin().disableTable(tableName); + // truncate the table + final ProcedureExecutor procExec = getMasterProcedureExecutor(); + long procId = ProcedureTestingUtility.submitAndWait(procExec, + new TruncateTableProcedure(procExec.getEnvironment(), tableName, true)); + ProcedureTestingUtility.assertProcNotFailed(procExec, procId); + + UTIL.waitUntilAllRegionsAssigned(tableName); + } } Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java (revision 10840a51e851d3ea50749a9527310142a967dab3) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java (revision ) @@ -85,7 +85,7 @@ // TODO: Move out... in the acquireLock() LOG.debug("waiting for '" + getTableName() + "' regions in transition"); - regions = ProcedureSyncWait.getRegionsFromMeta(env, getTableName()); + regions = ProcedureSyncWait.getRegionsFromMeta(env, getTableName(), true); assert regions != null && !regions.isEmpty() : "unexpected 0 regions"; ProcedureSyncWait.waitRegionInTransition(env, regions); @@ -103,15 +103,17 @@ break; case TRUNCATE_TABLE_CLEAR_FS_LAYOUT: DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true); + setNextState(TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT); + break; + case TRUNCATE_TABLE_CREATE_FS_LAYOUT: if (!preserveSplits) { // if we are not preserving splits, generate a new single region + //recreateRegionInfo in TRUNCATE_TABLE_CREATE_FS_LAYOUT phase, since if create fs layout fails + //we need to refresh the region encoded name to prevent dir name conflict regions = Arrays.asList(ModifyRegionUtils.createHRegionInfos(hTableDescriptor, null)); } else { regions = recreateRegionInfo(regions); } - setNextState(TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT); - break; - case TRUNCATE_TABLE_CREATE_FS_LAYOUT: regions = CreateTableProcedure.createFsLayout(env, hTableDescriptor, regions); CreateTableProcedure.updateTableDescCache(env, getTableName()); setNextState(TruncateTableState.TRUNCATE_TABLE_ADD_TO_META); \ No newline at end of file