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 21:41:31 UTC
[hbase] branch branch-2.3 updated: HBASE-25691 Test failure:
TestVerifyBucketCacheFile.testRetrieveFromFile (#3089)
This is an automated email from the ASF dual-hosted git repository.
huaxiangsun pushed a commit to branch branch-2.3
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.3 by this push:
new 8710772 HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromFile (#3089)
8710772 is described below
commit 871077241b24a01b6cfcaec81e7981525792dacf
Author: huaxiangsun <hu...@apache.org>
AuthorDate: Wed Mar 24 14:41:11 2021 -0700
HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromFile (#3089)
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 fca1ffa..8e5f558 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
@@ -1118,14 +1118,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)