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");