You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by me...@apache.org on 2021/12/23 10:52:30 UTC

[hbase] branch branch-2 updated: HBASE-26615 Snapshot referenced data files are deleted when delete a table with merge regions (#3976)

This is an automated email from the ASF dual-hosted git repository.

meiyi pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 7fcf8e8  HBASE-26615 Snapshot referenced data files are deleted when delete a table with merge regions (#3976)
7fcf8e8 is described below

commit 7fcf8e84a505515f429785c2093b265278e5012e
Author: meiyi <my...@gmail.com>
AuthorDate: Thu Dec 23 18:51:28 2021 +0800

    HBASE-26615 Snapshot referenced data files are deleted when delete a table with merge regions (#3976)
    
    Signed-off-by: GeorryHuang <hu...@apache.org>
---
 .../master/procedure/DeleteTableProcedure.java     | 16 +++++++--
 .../hbase/client/TestTableSnapshotScanner.java     | 42 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 3 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 80dddc7..8322383 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
@@ -56,6 +56,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.DeleteTableState;
+import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils;
 
 @InterfaceAudience.Private
 public class DeleteTableProcedure
@@ -317,9 +318,18 @@ public class DeleteTableProcedure
 
     // Archive regions from FS (temp directory)
     if (archive) {
-      List<Path> regionDirList = regions.stream().filter(RegionReplicaUtil::isDefaultReplica)
-        .map(region -> FSUtils.getRegionDirFromTableDir(tempTableDir, region))
-        .collect(Collectors.toList());
+      List<Path> regionDirList = new ArrayList<>();
+      for (RegionInfo region : regions) {
+        if (RegionReplicaUtil.isDefaultReplica(region)) {
+          regionDirList.add(FSUtils.getRegionDirFromTableDir(tempTableDir, region));
+          List<RegionInfo> mergeRegions = MetaTableAccessor
+              .getMergeRegions(env.getMasterServices().getConnection(), region.getRegionName());
+          if (!CollectionUtils.isEmpty(mergeRegions)) {
+            mergeRegions.stream()
+                .forEach(r -> regionDirList.add(FSUtils.getRegionDirFromTableDir(tempTableDir, r)));
+          }
+        }
+      }
       HFileArchiver.archiveRegions(env.getMasterConfiguration(), fs, mfs.getRootDir(), tempTableDir,
         regionDirList);
       if (!regionDirList.isEmpty()) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
index 57db698..c51df96 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
@@ -470,6 +470,48 @@ public class TestTableSnapshotScanner {
     }
   }
 
+  @Test
+  public void testDeleteTableWithMergedRegions() throws Exception {
+    setupCluster();
+    final TableName tableName = TableName.valueOf(this.name.getMethodName());
+    String snapshotName = tableName.getNameAsString() + "_snapshot";
+    Configuration conf = UTIL.getConfiguration();
+    try (Admin admin = UTIL.getConnection().getAdmin()) {
+      // disable compaction
+      admin.compactionSwitch(false,
+        admin.getRegionServers().stream().map(s -> s.getServerName()).collect(Collectors.toList()));
+      // create table
+      Table table = UTIL.createTable(tableName, FAMILIES, 1, bbb, yyy, 3);
+      List<RegionInfo> regions = admin.getRegions(tableName);
+      Assert.assertEquals(3, regions.size());
+      // write some data
+      UTIL.loadTable(table, FAMILIES);
+      // merge region
+      admin.mergeRegionsAsync(new byte[][] { regions.get(0).getEncodedNameAsBytes(),
+          regions.get(1).getEncodedNameAsBytes() },
+        false).get();
+      regions = admin.getRegions(tableName);
+      Assert.assertEquals(2, regions.size());
+      // snapshot
+      admin.snapshot(snapshotName, tableName);
+      // verify snapshot
+      try (TableSnapshotScanner scanner =
+          new TableSnapshotScanner(conf, UTIL.getDataTestDirOnTestFS(snapshotName), snapshotName,
+              new Scan().withStartRow(bbb).withStopRow(yyy))) {
+        verifyScanner(scanner, bbb, yyy);
+      }
+      // drop table
+      admin.disableTable(tableName);
+      admin.deleteTable(tableName);
+      // verify snapshot
+      try (TableSnapshotScanner scanner =
+          new TableSnapshotScanner(conf, UTIL.getDataTestDirOnTestFS(snapshotName), snapshotName,
+              new Scan().withStartRow(bbb).withStopRow(yyy))) {
+        verifyScanner(scanner, bbb, yyy);
+      }
+    }
+  }
+
   private void traverseAndSetFileTime(Path path, long time) throws IOException {
     fs.setTimes(path, time, -1);
     if (fs.isDirectory(path)) {