RFR: 8275509: ModuleDescriptor.hashCode isn't reproducible across builds [v12]

Jaikiran Pai jpai at openjdk.java.net
Fri Nov 5 03:48:17 UTC 2021


On Thu, 4 Nov 2021 05:16:42 GMT, Jaikiran Pai <jpai at openjdk.org> wrote:

>> Can I please get a review for this change which fixes the issue reported in https://bugs.openjdk.java.net/browse/JDK-8275509?
>> 
>> The `ModuleDescriptor.hashCode()` method uses the hash code of its various components to compute the final hash code. While doing so it ends up calling hashCode() on (collection of) various `enum` types. Since the hashCode() of enum types is generated from a call to `java.lang.Object.hashCode()`, their value isn't guaranteed to stay the same across multiple JVM runs.
>> 
>> The commit here proposes to use the ordinal of the enum as the hash code. As Alan notes in the mailing list discussion, any changes to the ordinal of the enum (either due to addition of new value, removal of a value or just reordering existing values, all of which I think will be rare in these specific enum types) isn't expected to produce the same hash code across those changed runtimes and that should be okay. 
>> 
>> The rest of the ModuleDescriptor.hashCode() has been reviewed too and apart from calls to the enum types hashCode(), rest of the calls in that implementation, either directly or indirectly end up as calls on `java.lang.String.hashCode()` and as such aren't expected to cause non-deterministic values.
>> 
>> A new jtreg test has been added to reproduce this issue and verify the fix.
>
> Jaikiran Pai has updated the pull request incrementally with one additional commit since the last revision:
> 
>   use Enum#name() for hashCode() generation instead of Enum#ordinal()

FWIW, the GitHub Actions job failure for Windows is due to an unrelated reason:


2021-11-04T05:22:48.5273779Z /usr/bin/bash: line 1:  1174 Segmentation fault      (core dumped) /usr/bin/make -s -r -R -I /cygdrive/d/a/jdk/jdk/jdk/make/common SPEC=/cygdrive/d/a/jdk/jdk/jdk/build/windows-x64/spec.gmk MAKE_LOG_FLAGS="-s" -f ModuleWrapper.gmk -I /cygdrive/d/a/jdk/jdk/jdk/make/common/modules -I/cygdrive/d/a/jdk/jdk/jdk/make/modules/java.base MODULE=java.base MAKEFILE_PREFIX=Copy
2021-11-04T05:22:48.5304517Z make[2]: *** [make/Main.gmk:157: java.base-copy] Error 139
2021-11-04T05:22:48.5305851Z make[2]: *** Waiting for unfinished jobs....
2021-11-04T05:22:48.8158343Z Compiling 12 properties into resource bundles for jdk.jdeps
2021-11-04T05:22:49.2707959Z 
2021-11-04T05:22:49.2712144Z ERROR: Build failed for target 'default (product-bundles test-bundles)' in configuration 'windows-x64' (exit code 2) 
2021-11-04T05:22:49.8818435Z 
2021-11-04T05:22:49.8823500Z No indication of failed target found.
2021-11-04T05:22:49.8845292Z Hint: Try searching the build log for '] Error'.
2021-11-04T05:22:49.9156326Z Hint: See doc/building.html#troubleshooting for assistance.
2021-11-04T05:22:49.9156822Z 
2021-11-04T05:22:49.9206739Z make[1]: *** [/cygdrive/d/a/jdk/jdk/jdk/make/Init.gmk:315: main] Error 2
2021-11-04T05:22:49.9249924Z make: *** [/cygdrive/d/a/jdk/jdk/jdk/make/Init.gmk:186: default] Error 2
2021-11-04T05:22:50.0054100Z ##[error]Process completed with exit code 1.

Going ahead with the merge of this PR.

Thank you Alan and Magnus for the inputs and the reviews.

-------------

PR: https://git.openjdk.java.net/jdk/pull/6078


More information about the core-libs-dev mailing list