You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by wc...@apache.org on 2019/08/07 13:57:55 UTC
[hbase] branch master updated: HBASE-22417
DeleteTableProcedure.deleteFromMeta method should remove table from
Master's table descriptors cache
This is an automated email from the ASF dual-hosted git repository.
wchevreuil pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new a9773ec HBASE-22417 DeleteTableProcedure.deleteFromMeta method should remove table from Master's table descriptors cache
a9773ec is described below
commit a9773ec5e8e530c2e96d6b8884c09cfd4632aafb
Author: Wellington Chevreuil <wc...@apache.org>
AuthorDate: Wed Aug 7 12:05:56 2019 +0100
HBASE-22417 DeleteTableProcedure.deleteFromMeta method should remove table from Master's table descriptors cache
Signed-off-by: stack <st...@apache.org>
---
.../hbase/master/procedure/DeleteTableProcedure.java | 17 +++++++----------
.../hbase/master/procedure/TruncateTableProcedure.java | 18 +++++++++++-------
.../master/procedure/TestDeleteTableProcedure.java | 18 ++++++++++++++++++
3 files changed, 36 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 b50f4ba..c792316 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);
@@ -393,6 +388,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 52da607..7381e12 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
@@ -98,13 +98,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 +118,13 @@ public class TruncateTableProcedure
} else {
regions = recreateRegionInfo(regions);
}
+ setNextState(TruncateTableState.TRUNCATE_TABLE_REMOVE_FROM_META);
+ break;
+ case TRUNCATE_TABLE_REMOVE_FROM_META:
+ List<RegionInfo> originalRegions = env.getAssignmentManager()
+ .getRegionStates().getRegionsOfTable(getTableName());
+ DeleteTableProcedure.deleteFromMeta(env, getTableName(), originalRegions);
+ 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 8815966..fa83a93 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,9 +19,12 @@ 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;
+import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.fs.FileSystem;
@@ -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<RegionInfo> 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");