Skip to content

Commit

Permalink
HBASE-25691 Test failure: TestVerifyBucketCacheFile.testRetrieveFromF…
Browse files Browse the repository at this point in the history
…ile (#3087)

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 <stack@apache.org>
  • Loading branch information
huaxiangsun authored Mar 24, 2021
1 parent c8c043a commit 80529af
Showing 1 changed file with 16 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1101,14 +1101,27 @@ private void retrieveFromFile(int[] bucketSizes) throws IOException {
*/
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)
Expand Down

0 comments on commit 80529af

Please sign in to comment.