You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by to...@apache.org on 2016/12/21 02:53:38 UTC

hbase git commit: HBASE-17107: FN info should be cleaned up on region/table cleanup

Repository: hbase
Updated Branches:
  refs/heads/master f8474c8d4 -> 3599716df


HBASE-17107: FN info should be cleaned up on region/table cleanup

Signed-off-by: Francis Liu <to...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/3599716d
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/3599716d
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/3599716d

Branch: refs/heads/master
Commit: 3599716dffe33690a8f5446a2c22ef930d220402
Parents: f8474c8
Author: Thiruvel Thirumoolan <th...@gmail.com>
Authored: Thu Dec 8 18:57:01 2016 -0800
Committer: Francis Liu <to...@apache.org>
Committed: Tue Dec 20 18:52:49 2016 -0800

----------------------------------------------------------------------
 .../hbase/favored/FavoredNodesManager.java      |  2 +-
 .../hadoop/hbase/master/CatalogJanitor.java     | 10 ++++
 .../master/procedure/DeleteTableProcedure.java  |  7 +++
 .../hbase/client/TestTableFavoredNodes.java     | 61 +++++++++++++++++++-
 4 files changed, 77 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/3599716d/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
index cfb9bef..b055509 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
@@ -165,7 +165,7 @@ public class FavoredNodesManager {
     teritiaryRSToRegionMap.put(serverToUse, regionList);
   }
 
-  private synchronized void deleteFavoredNodesForRegions(Collection<HRegionInfo> regionInfoList) {
+  public synchronized void deleteFavoredNodesForRegions(Collection<HRegionInfo> regionInfoList) {
     for (HRegionInfo hri : regionInfoList) {
       List<ServerName> favNodes = getFavoredNodes(hri);
       if (favNodes != null) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/3599716d/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java
index e748c3b..d2863e3 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java
@@ -27,6 +27,7 @@ import java.util.TreeMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import com.google.common.collect.Lists;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileSystem;
@@ -42,6 +43,7 @@ import org.apache.hadoop.hbase.backup.HFileArchiver;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.favored.FavoredNodesManager;
 import org.apache.hadoop.hbase.regionserver.HRegionFileSystem;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.FSUtils;
@@ -215,6 +217,10 @@ public class CatalogJanitor extends ScheduledChore {
       MetaTableAccessor.deleteMergeQualifiers(services.getConnection(), mergedRegion);
       services.getServerManager().removeRegion(regionA);
       services.getServerManager().removeRegion(regionB);
+      FavoredNodesManager fnm = this.services.getFavoredNodesManager();
+      if (fnm != null) {
+        fnm.deleteFavoredNodesForRegions(Lists.newArrayList(regionA, regionB));
+      }
       return true;
     }
     return false;
@@ -360,6 +366,10 @@ public class CatalogJanitor extends ScheduledChore {
       HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, parent);
       MetaTableAccessor.deleteRegion(this.connection, parent);
       services.getServerManager().removeRegion(parent);
+      FavoredNodesManager fnm = this.services.getFavoredNodesManager();
+      if (fnm != null) {
+        fnm.deleteFavoredNodesForRegions(Lists.newArrayList(parent));
+      }
       result = true;
     }
     return result;

http://git-wip-us.apache.org/repos/asf/hbase/blob/3599716d/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java
----------------------------------------------------------------------
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 ffe8631..06b666b 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
@@ -43,6 +43,7 @@ import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.exceptions.HBaseException;
+import org.apache.hadoop.hbase.favored.FavoredNodesManager;
 import org.apache.hadoop.hbase.master.AssignmentManager;
 import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterFileSystem;
@@ -365,6 +366,12 @@ public class DeleteTableProcedure
 
     // clean region references from the server manager
     env.getMasterServices().getServerManager().removeRegions(regions);
+
+    // Clear Favored Nodes for this table
+    FavoredNodesManager fnm = env.getMasterServices().getFavoredNodesManager();
+    if (fnm != null) {
+      fnm.deleteFavoredNodesForRegions(regions);
+    }
   }
 
   protected static void deleteAssignmentState(final MasterProcedureEnv env,

http://git-wip-us.apache.org/repos/asf/hbase/blob/3599716d/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
index 184d80e..957e04a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
@@ -23,6 +23,7 @@ import static org.apache.hadoop.hbase.favored.FavoredNodesPlan.Position.TERTIARY
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -99,6 +100,7 @@ public class TestTableFavoredNodes {
     fnm = TEST_UTIL.getMiniHBaseCluster().getMaster().getFavoredNodesManager();
     admin = TEST_UTIL.getAdmin();
     admin.setBalancerRunning(false, true);
+    admin.enableCatalogJanitor(false);
     regionStates =
       TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates();
   }
@@ -116,6 +118,36 @@ public class TestTableFavoredNodes {
     // All regions should have favored nodes
     checkIfFavoredNodeInformationIsCorrect(tableName);
 
+    List<HRegionInfo> regions = admin.getTableRegions(tableName);
+
+    TEST_UTIL.deleteTable(tableName);
+
+    checkNoFNForDeletedTable(regions);
+  }
+
+  /*
+   * Checks if favored node information is removed on table truncation.
+   */
+  @Test
+  public void testTruncateTable() throws Exception {
+
+    TableName tableName = TableName.valueOf("truncateTable");
+    TEST_UTIL.createTable(tableName, Bytes.toBytes("f"), splitKeys);
+    TEST_UTIL.waitUntilAllRegionsAssigned(tableName);
+
+    // All regions should have favored nodes
+    checkIfFavoredNodeInformationIsCorrect(tableName);
+
+    List<HRegionInfo> regions = admin.getTableRegions(tableName);
+    TEST_UTIL.truncateTable(tableName, true);
+
+    checkNoFNForDeletedTable(regions);
+    checkIfFavoredNodeInformationIsCorrect(tableName);
+
+    regions = admin.getTableRegions(tableName);
+    TEST_UTIL.truncateTable(tableName, false);
+    checkNoFNForDeletedTable(regions);
+
     TEST_UTIL.deleteTable(tableName);
   }
 
@@ -156,16 +188,25 @@ public class TestTableFavoredNodes {
     checkIfDaughterInherits2FN(parentFN, daughter2FN);
 
     assertEquals("Daughter's PRIMARY FN should be PRIMARY of parent",
-      parentFN.get(PRIMARY.ordinal()), daughter1FN.get(PRIMARY.ordinal()));
+        parentFN.get(PRIMARY.ordinal()), daughter1FN.get(PRIMARY.ordinal()));
     assertEquals("Daughter's SECONDARY FN should be SECONDARY of parent",
-      parentFN.get(SECONDARY.ordinal()), daughter1FN.get(SECONDARY.ordinal()));
+        parentFN.get(SECONDARY.ordinal()), daughter1FN.get(SECONDARY.ordinal()));
 
     assertEquals("Daughter's PRIMARY FN should be PRIMARY of parent",
         parentFN.get(PRIMARY.ordinal()), daughter2FN.get(PRIMARY.ordinal()));
     assertEquals("Daughter's SECONDARY FN should be TERTIARY of parent",
         parentFN.get(TERTIARY.ordinal()), daughter2FN.get(SECONDARY.ordinal()));
 
+    // Major compact table and run catalog janitor. Parent's FN should be removed
+    TEST_UTIL.getMiniHBaseCluster().compact(tableName, true);
+    assertEquals("Parent region should have been cleaned", 1, admin.runCatalogScan());
+    assertNull("Parent FN should be null", fnm.getFavoredNodes(parent));
+
+    List<HRegionInfo> regions = admin.getTableRegions(tableName);
+
     TEST_UTIL.deleteTable(tableName);
+
+    checkNoFNForDeletedTable(regions);
   }
 
   /*
@@ -204,7 +245,23 @@ public class TestTableFavoredNodes {
     assertArrayEquals("Merged region doesn't match regionA's FN",
         regionAFN.toArray(), mergedFN.toArray());
 
+    // Major compact table and run catalog janitor. Parent FN should be removed
+    TEST_UTIL.getMiniHBaseCluster().compact(tableName, true);
+    assertEquals("Merge parents should have been cleaned", 1, admin.runCatalogScan());
+    assertNull("Parent FN should be null", fnm.getFavoredNodes(regionA));
+    assertNull("Parent FN should be null", fnm.getFavoredNodes(regionB));
+
+    List<HRegionInfo> regions = admin.getTableRegions(tableName);
+
     TEST_UTIL.deleteTable(tableName);
+
+    checkNoFNForDeletedTable(regions);
+  }
+
+  private void checkNoFNForDeletedTable(List<HRegionInfo> regions) {
+    for (HRegionInfo region : regions) {
+      assertNull("FN not null for deleted table's region: " + region, fnm.getFavoredNodes(region));
+    }
   }
 
   /*