From f4c33b72c5a40c02aec493dae3bbf3c08bd6f66e Mon Sep 17 00:00:00 2001 From: Wellington Chevreuil Date: Thu, 4 Jul 2019 15:16:45 +0100 Subject: [PATCH] HBASE-22417 DeleteTableProcedure.deleteFromMeta method should remove table from Master's table descriptors cache --- .../master/procedure/DeleteTableProcedure.java | 17 +++++++---------- .../procedure/TruncateTableProcedure.java | 17 ++++++++++------- .../procedure/TestDeleteTableProcedure.java | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 17 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 a8e3a334b3..d4031fc5c6 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,23 +104,18 @@ public class DeleteTableProcedure // Call coprocessors preDelete(env); - 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; + setNextState(DeleteTableState.DELETE_TABLE_REMOVE_FROM_META); break; - case DELETE_TABLE_UPDATE_DESC_CACHE: - LOG.debug("Deleting descriptor for {}", this); - DeleteTableProcedure.deleteTableDescriptorCache(env, getTableName()); + case DELETE_TABLE_REMOVE_FROM_META: + LOG.debug("Deleting regions from META for {}", this); + DeleteTableProcedure.deleteFromMeta(env, getTableName(), regions); setNextState(DeleteTableState.DELETE_TABLE_UNASSIGN_REGIONS); + regions = null; break; case DELETE_TABLE_UNASSIGN_REGIONS: LOG.debug("Deleting assignment state for {}", this); @@ -395,6 +390,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)