You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by hu...@apache.org on 2021/03/24 16:01:54 UTC

[hbase] branch master updated: HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromFile (#3081)

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

huaxiangsun 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 1e3fe3c  HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromFile (#3081)
1e3fe3c is described below

commit 1e3fe3ceac323925d895d5e24b323bd056fc4b8e
Author: huaxiangsun <hu...@apache.org>
AuthorDate: Wed Mar 24 09:01:17 2021 -0700

    HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromFile (#3081)
    
    The issue is that FileInputStream is created with try-with-resources, so its close() is called right after the try sentence.
    FileInputStream is a finalize class, when this object is garbage collected, its close() is called again.
    To avoid this double-free resources, add guard against it.
    
    Signed-off-by: stack <st...@apache.org>
---
 .../hadoop/hbase/io/hfile/bucket/BucketCache.java     | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
index a84d812..0187f5e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
@@ -1112,14 +1112,27 @@ public class BucketCache implements BlockCache, HeapSize {
    */
   private FileInputStream deleteFileOnClose(final File file) throws IOException {
     return new FileInputStream(file) {
+      private File myFile;
+      private FileInputStream init(File file) {
+        myFile = file;
+        return this;
+      }
       @Override
       public void close() throws IOException {
+        // close() will be called during try-with-resources and it will be
+        // called by finalizer thread during GC. To avoid double-free resource,
+        // set myFile to null after the first call.
+        if (myFile == null) {
+          return;
+        }
+
         super.close();
-        if (!file.delete()) {
-          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());
+        if (!myFile.delete()) {
+          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());
         }
+        myFile = null;
       }
-    };
+    }.init(file);
   }
 
   private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)