[ 
https://issues.apache.org/jira/browse/HBASE-21582?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Zheng Hu updated HBASE-21582:
-----------------------------
    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. 

{code}
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
{code}

In the master,  I found the endless log after delete a table: 
{code}
org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache: Not checking 
unreferenced files since snapshot is running, it will skip to clean the HFiles 
this time
{code}

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



  was:
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. 

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. 

{code}
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
{code}

In the master,  I found the endless log after delete a table: 
{code}
org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache: Not checking 
unreferenced files since snapshot is running, it will skip to clean the HFiles 
this time
{code}

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




> If call HBaseAdmin#snapshotAsync but forget call isSnapshotFinished, then 
> SnapshotHFileCleaner will skip to run every time
> --------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-21582
>                 URL: https://issues.apache.org/jira/browse/HBASE-21582
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Zheng Hu
>            Assignee: Zheng Hu
>            Priority: Major
>
> 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. 
> {code}
> 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
> {code}
> In the master,  I found the endless log after delete a table: 
> {code}
> org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache: Not checking 
> unreferenced files since snapshot is running, it will skip to clean the 
> HFiles this time
> {code}
> This is because the snapshotHandlers never be cleaned after call the  
> snapshotManager#takeSnapshot.  I think the asynSnapshot may has the same 
> problem. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to