Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-21582

If call HBaseAdmin#snapshotAsync but forget call isSnapshotFinished, then SnapshotHFileCleaner will skip to run every time

    XMLWordPrintableJSON

Details

    • Reviewed

    Description

      This is because we remove the SnapshotSentinel from snapshotHandlers in SnapshotManager#cleanupSentinels. Only when the following 3 case, the cleanupSentinels will be called:
      1. SnapshotManager#isSnapshotDone;
      2. SnapshotManager#takeSnapshot;
      3. SnapshotManager#restoreOrCloneSnapshot

      So if no isSnapshotDone called, or no further snapshot taking, or snapshot restore/clone. the SnapshotSentinel will always be keep in snapshotHandlers.

      But after HBASE-21387, Only when no snapshot taking, the SnapshotHFileCleaner will check the unref files and clean.

      I found this bug, because in our XiaoMi branch-2, we implement the soft delete feature, which means if someone delete a table, then master will create a snapshot firstly, after that, the table deletion begain. the implementation is quite simple, we use the snapshotManager to create a snapshot.

      diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
      index 8f42e4a..6da6a64 100644
      --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
      +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
      @@ -2385,12 +2385,6 @@ public class HMaster extends HRegionServer implements MasterServices {
             protected void run() throws IOException {
               getMaster().getMasterCoprocessorHost().preDeleteTable(tableName);
       
      +        if (snapshotBeforeDelete) {
      +          LOG.info("Take snaposhot for " + tableName + " before deleting");
      +          snapshotManager
      +              .takeSnapshot(SnapshotDescriptionUtils.getSnapshotNameForDeletedTable(tableName));
      +        }
      +
               LOG.info(getClientIdAuditPrefix() + " delete " + tableName);
       
               // TODO: We can handle/merge duplicate request
      

      In the master, I found the endless log after delete a table:

      org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache: Not checking unreferenced files since snapshot is running, it will skip to clean the HFiles this time
      

      This is because the snapshotHandlers never be cleaned after call the snapshotManager#takeSnapshot. I think the asynSnapshot may has the same problem.

      Attachments

        1. HBASE-21582.branch-1.v3.patch
          14 kB
          Zheng Hu
        2. HBASE-21582.v1.patch
          15 kB
          Zheng Hu
        3. HBASE-21582.v2.patch
          15 kB
          Zheng Hu
        4. HBASE-21582.v3.patch
          15 kB
          Zheng Hu

        Issue Links

          Activity

            People

              openinx Zheng Hu
              openinx Zheng Hu
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: