From 4f7ea64d44073a539bab0d409b87dbfd8eb0a285 Mon Sep 17 00:00:00 2001 From: Wellington Chevreuil Date: Tue, 14 May 2019 17:13:36 +0100 Subject: [PATCH] [HBASE-22417] DeleteTableProcedure.deleteFromMeta method should remove table from Master's table descriptors cache Change-Id: I5733983311966928fde92a9a731e42ccd0106e4c --- .../procedure/DeleteTableProcedure.java | 31 +++++++++---------- .../procedure/TruncateTableProcedure.java | 17 +++++----- .../procedure/TestDeleteTableProcedure.java | 18 +++++++++++ 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java index 4325d19569..02e5e2c798 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java @@ -104,29 +104,24 @@ public class DeleteTableProcedure // Call coprocessors preDelete(env); - setNextState(DeleteTableState.DELETE_TABLE_REMOVE_FROM_META); + setNextState(DeleteTableState.DELETE_TABLE_CLEAR_FS_LAYOUT); break; + case DELETE_TABLE_CLEAR_FS_LAYOUT: + LOG.debug("Deleting regions from filesystem for {}", this); + DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true); + setNextState(DeleteTableState.DELETE_TABLE_REMOVE_FROM_META); + break; case DELETE_TABLE_REMOVE_FROM_META: LOG.debug("Deleting regions from META for {}", this); DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions); - setNextState(DeleteTableState.DELETE_TABLE_CLEAR_FS_LAYOUT); - break; - case DELETE_TABLE_CLEAR_FS_LAYOUT: - LOG.debug("Deleting regions from filesystem for {}", this); - DeleteTableProcedure.deleteFromFs(env, getTableName(), regions, true); - setNextState(DeleteTableState.DELETE_TABLE_UPDATE_DESC_CACHE); - regions = null; - break; - case DELETE_TABLE_UPDATE_DESC_CACHE: - LOG.debug("Deleting descriptor for {}", this); - DeleteTableProcedure.deleteTableDescriptorCache(env, getTableName()); setNextState(DeleteTableState.DELETE_TABLE_UNASSIGN_REGIONS); + regions = null; break; - case DELETE_TABLE_UNASSIGN_REGIONS: - LOG.debug("Deleting assignment state for {}", this); - DeleteTableProcedure.deleteAssignmentState(env, getTableName()); - setNextState(DeleteTableState.DELETE_TABLE_POST_OPERATION); - break; + case DELETE_TABLE_UNASSIGN_REGIONS: + LOG.debug("Deleting assignment state for {}", this); + DeleteTableProcedure.deleteAssignmentState(env, getTableName()); + setNextState(DeleteTableState.DELETE_TABLE_POST_OPERATION); + break; case DELETE_TABLE_POST_OPERATION: postDelete(env); LOG.debug("Finished {}", this); @@ -389,6 +384,8 @@ public class DeleteTableProcedure if (fnm != null) { fnm.deleteFavoredNodesForRegions(regions); } + + deleteTableDescriptorCache(env, tableName); } protected static void deleteAssignmentState(final MasterProcedureEnv env, 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 52da607ef8..407917209d 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 @@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionInfoBuilder; import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.client.TableDescriptor; +import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.master.MasterCoprocessorHost; import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; import org.apache.hadoop.hbase.util.ModifyRegionUtils; @@ -98,13 +99,10 @@ public class TruncateTableProcedure // Call coprocessors preTruncate(env); - setNextState(TruncateTableState.TRUNCATE_TABLE_REMOVE_FROM_META); - break; - case TRUNCATE_TABLE_REMOVE_FROM_META: - tableDescriptor = env.getMasterServices().getTableDescriptors() - .get(tableName); - DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions); - DeleteTableProcedure.deleteAssignmentState(env, getTableName()); + //We need to cache table descriptor in the initial stage, so that it's saved within + //the procedure stage and can get recovered if the procedure crashes between + //TRUNCATE_TABLE_REMOVE_FROM_META and TRUNCATE_TABLE_CREATE_FS_LAYOUT + tableDescriptor = env.getMasterServices().getTableDescriptors().get(tableName); setNextState(TruncateTableState.TRUNCATE_TABLE_CLEAR_FS_LAYOUT); break; case TRUNCATE_TABLE_CLEAR_FS_LAYOUT: @@ -121,6 +119,11 @@ public class TruncateTableProcedure } else { regions = recreateRegionInfo(regions); } + setNextState(TruncateTableState.TRUNCATE_TABLE_REMOVE_FROM_META); + break; + case TRUNCATE_TABLE_REMOVE_FROM_META: + DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions); + DeleteTableProcedure.deleteAssignmentState(env, getTableName()); setNextState(TruncateTableState.TRUNCATE_TABLE_CREATE_FS_LAYOUT); break; case TRUNCATE_TABLE_CREATE_FS_LAYOUT: diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDeleteTableProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDeleteTableProcedure.java index 88159662bf..cd9e12b03e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDeleteTableProcedure.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestDeleteTableProcedure.java @@ -19,6 +19,8 @@ package org.apache.hadoop.hbase.master.procedure; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -51,6 +53,7 @@ import org.junit.rules.TestName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; @Category({MasterTests.class, MediumTests.class}) public class TestDeleteTableProcedure extends TestTableDDLProcedureBase { @@ -133,6 +136,21 @@ public class TestDeleteTableProcedure extends TestTableDDLProcedureBase { testSimpleDelete(tableName, splitKeys); } + @Test + public void testDeleteFromMeta() throws Exception { + final TableName tableName = TableName.valueOf(name.getMethodName()); + RegionInfo[] regions = MasterProcedureTestingUtility.createTable( + getMasterProcedureExecutor(), tableName, null, "f1", "f2"); + List regionsList = new ArrayList<>(); + UTIL.getAdmin().disableTable(tableName); + MasterProcedureEnv procedureEnv = getMasterProcedureExecutor().getEnvironment(); + assertNotNull("Table should be on TableDescriptors cache.", + procedureEnv.getMasterServices().getTableDescriptors().get(tableName)); + DeleteTableProcedure.deleteFromMeta(procedureEnv, tableName, regionsList); + assertNull("Table shouldn't be on TableDescriptors anymore.", + procedureEnv.getMasterServices().getTableDescriptors().get(tableName)); + } + private void testSimpleDelete(final TableName tableName, byte[][] splitKeys) throws Exception { RegionInfo[] regions = MasterProcedureTestingUtility.createTable( getMasterProcedureExecutor(), tableName, splitKeys, "f1", "f2"); -- 2.17.2 (Apple Git-113)