RFR: 8317678: Fix up hashCode() for ZipFile.Source.Key [v5]
Sean Coffey
coffeys at openjdk.org
Tue Oct 17 08:56:28 UTC 2023
On Tue, 17 Oct 2023 08:50:15 GMT, Sean Coffey <coffeys at openjdk.org> wrote:
>> Fix up java.util.zip.ZipFile$Source hashCode() impl so that duplicate Source objects aren't created for the same zip file.
>
> Sean Coffey has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:
>
> - update pae exception handling, correct test case typo and improve comments
> - Merge branch 'master' into 8317678-Zip-Source
> - minor test edits and comment updates
> - insert back lastmodified check. enhance testcase. more review comments
> - incorporate review comments
> - Initial changes
thanks for the reviews and comments to date. I've pushed new changes which should address them.
Good catch on the ZIPENTRY_NAME typo @jaikiran
I've run some tests also and it looks like the fileKey() returns the same object/reference - even if symbolic links are used.
you raise an interesting point about `getCanonicalFile()` performance though. I've updated an existing benchmark[1] to check and performance for fileystems that don't support fileKey() (windows) has regressed[2]. Performance is much better on systems that support fileKey() (unix) -- I'll look at it further but perhaps I'll only target the optimizations for the filesystems that support filekey() for now.
[1]
diff --git a/test/micro/org/openjdk/bench/java/util/zip/ZipFileOpen.java b/test/micro/org/openjdk/bench/java/util/zip/ZipFileOpen.java
index ffbbc3d245f..34449c14e32 100644
--- a/test/micro/org/openjdk/bench/java/util/zip/ZipFileOpen.java
+++ b/test/micro/org/openjdk/bench/java/util/zip/ZipFileOpen.java
@@ -29,6 +29,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -50,6 +51,7 @@ public class ZipFileOpen {
private int size;
public File zipFile;
+ public File relativePathFile;
@Setup(Level.Trial)
public void beforeRun() throws IOException {
@@ -74,6 +76,8 @@ public void beforeRun() throws IOException {
}
}
zipFile = tempFile;
+ relativePathFile = Path.of(System.getProperty("user.dir"))
+ .relativize(zipFile.toPath()).toFile();
}
@Benchmark
@@ -90,4 +94,13 @@ public ZipFile openCloseZipFile() throws Exception {
zf.close();
return zf;
}
+
+ @Benchmark
+ public void openCloseZipFilex2() throws Exception {
+ // Ensure that we only create ZipFile.Source.Key entry per unique zip file
+ ZipFile zf = new ZipFile(zipFile);
+ ZipFile zf2 = new ZipFile(relativePathFile);
+ zf.close();
+ zf2.close();
+ }
}
[2]
jdk-tip-no-patch: (Windows)
Benchmark (size) Mode Cnt Score Error Units
ZipFileOpen.openCloseZipFile 512 avgt 15 319543.232 ± 46112.481 ns/op
ZipFileOpen.openCloseZipFile 1024 avgt 15 463719.381 ± 139409.316 ns/op
ZipFileOpen.openCloseZipFilex2 512 avgt 15 750838.029 ± 190726.572 ns/op
ZipFileOpen.openCloseZipFilex2 1024 avgt 15 875174.035 ± 140971.036 ns/op
jdk-with-new-patch
Benchmark (size) Mode Cnt Score Error Units
ZipFileOpen.openCloseZipFile 512 avgt 15 603053.335 ± 50514.066 ns/op
ZipFileOpen.openCloseZipFile 1024 avgt 15 710960.542 ± 46343.033 ns/op
ZipFileOpen.openCloseZipFilex2 512 avgt 15 1258566.172 ± 216230.090 ns/op
ZipFileOpen.openCloseZipFilex2 1024 avgt 15 1260380.961 ± 164216.628 ns/op
[3]
without patch: (Linux)
Benchmark (size) Mode Cnt Score Error Units
ZipFileOpen.openCloseZipFile 512 avgt 15 75378.890 ? 642.370 ns/op
ZipFileOpen.openCloseZipFile 1024 avgt 15 150814.293 ? 29801.424 ns/op
ZipFileOpen.openCloseZipFilex2 512 avgt 15 168104.286 ? 41505.778 ns/op
ZipFileOpen.openCloseZipFilex2 1024 avgt 15 299282.488 ? 44496.777 ns/op
Finished running test 'micro:java.util.zip.ZipFileOpen'
with patch:
Benchmark (size) Mode Cnt Score Error Units
ZipFileOpen.openCloseZipFile 512 avgt 15 75400.408 ? 408.981 ns/op
ZipFileOpen.openCloseZipFile 1024 avgt 15 146213.650 ? 15509.167 ns/op
ZipFileOpen.openCloseZipFilex2 512 avgt 15 83194.552 ? 16361.844 ns/op
ZipFileOpen.openCloseZipFilex2 1024 avgt 15 153956.028 ? 30550.595 ns/op
-------------
PR Comment: https://git.openjdk.org/jdk/pull/16115#issuecomment-1765969450
More information about the core-libs-dev
mailing list