Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 6D1A6200BE2 for ; Thu, 15 Dec 2016 22:45:23 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 6BAA3160B15; Thu, 15 Dec 2016 21:45:23 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 81229160B13 for ; Thu, 15 Dec 2016 22:45:22 +0100 (CET) Received: (qmail 44074 invoked by uid 500); 15 Dec 2016 21:45:21 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 44065 invoked by uid 99); 15 Dec 2016 21:45:21 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 15 Dec 2016 21:45:21 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7F6C0E040F; Thu, 15 Dec 2016 21:45:21 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: tedyu@apache.org To: commits@hbase.apache.org Message-Id: <091681907d7b49dbae26e9089661c67f@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: hbase git commit: HBASE-17319 Truncate table with preserve after split may cause truncation to fail (Allan Yang) Date: Thu, 15 Dec 2016 21:45:21 +0000 (UTC) archived-at: Thu, 15 Dec 2016 21:45:23 -0000 Repository: hbase Updated Branches: refs/heads/branch-1 ffe70158c -> f3a306979 HBASE-17319 Truncate table with preserve after split may cause truncation to fail (Allan Yang) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f3a30697 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f3a30697 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f3a30697 Branch: refs/heads/branch-1 Commit: f3a30697966afd3adac698b83be14b830eaad942 Parents: ffe7015 Author: tedyu Authored: Thu Dec 15 13:45:11 2016 -0800 Committer: tedyu Committed: Thu Dec 15 13:45:11 2016 -0800 ---------------------------------------------------------------------- .../master/procedure/ProcedureSyncWait.java | 23 +++++++++------ .../procedure/TruncateTableProcedure.java | 10 ++++--- .../procedure/TestTruncateTableProcedure.java | 31 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/f3a30697/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java index 5c03a4a..d0dea0a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java @@ -149,17 +149,22 @@ public final class ProcedureSyncWait { 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 - public List evaluate() throws IOException { - if (TableName.META_TABLE_NAME.equals(tableName)) { - return new MetaTableLocator().getMetaRegions(env.getMasterServices().getZooKeeper()); - } - return MetaTableAccessor.getTableRegions(env.getMasterServices().getZooKeeper(), - env.getMasterServices().getConnection(), tableName); - } - }); + @Override + public List evaluate() throws IOException { + if (TableName.META_TABLE_NAME.equals(tableName)) { + return new MetaTableLocator().getMetaRegions(env.getMasterServices().getZooKeeper()); + } + return MetaTableAccessor.getTableRegions(env.getMasterServices().getZooKeeper(), + env.getMasterServices().getConnection(), tableName, excludeOfflinedSplitParents); + } + }); } protected static void waitRegionInTransition(final MasterProcedureEnv env, http://git-wip-us.apache.org/repos/asf/hbase/blob/f3a30697/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java index 9dccef6..735e94f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java @@ -85,7 +85,7 @@ public class TruncateTableProcedure // 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); @@ -102,15 +102,17 @@ public class TruncateTableProcedure 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); http://git-wip-us.apache.org/repos/asf/hbase/blob/f3a30697/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java index 941dd2f..7a3df0f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.java @@ -250,4 +250,35 @@ public class TestTruncateTableProcedure { private ProcedureExecutor getMasterProcedureExecutor() { return UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor(); } + + @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); + + } }