-
Notifications
You must be signed in to change notification settings - Fork 6.2k
8327466: ct.sym zip not reproducible across build environment timezones #25207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
👋 Welcome back jpai! A progress list of the required criteria for merging this PR into |
|
@jaikiran This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be: You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 4 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. ➡️ To integrate this PR with the above commit message to the |
lahodaj
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me, thanks!
|
Thank you Erik and Jan for the reviews. |
|
/integrate |
|
Going to push as commit a989245.
Your commit was automatically rebased without conflicts. |
Can I please get a review of this change in the JDK build tool class
CreateSymbolswhich addresses an issue related to the reproducibility of the generatedct.symfile? This addresses https://bugs.openjdk.org/browse/JDK-8327466.Even before this change, in order to support reproducibility of the generated ct.sym file, this internal
CreateSymbolsprogram takes atimestampargument. The value for thetimestampis considered to be the number of seconds since epoch and maps directly to theSOURCE_DATE_EPOCHconstruct that's used by several tools (even outside the JDK) to provide reproducible output.The ct.sym file generated by the
CreateSymbolsprogram is a ZIP file.CreateSymbolsuses the passedtimestampvalue to set the last modified time on each of the ZIP entries of the generated ZIP file. That way, a constant value for thetimestampargument implies that without anything else having changed for a subsequent build, the subsequently generated ct.sym will also have the exact same value for the timestamp for each of the ZIP entries.Like many other things in the ZIP specification, a timestamp for a ZIP entry can be set in more than one place within the ZIP structure and the value thus set can be interpreted differently depending on where it is set. That also results in Java SE's
java.util.zipAPIs having more than one way of setting that timestamp.The
CreateSymbolsprogram uses thejava.util.zip.ZipEntry.setTime(...)API to set this timestamp on the entry. However, that API is specified to be affected by the local system default timezone. This effectively means that ifCreateSymbolsis triggered more than once with the sametimestampvalue but with a different timezone, then the generated ct.sym files from each run will have a different value for the ZIP entry timestamps. This defeats the purpose of thetimestampagrument.The fix is to use an alternate API
java.util.zip.ZipEntry.setTimeLocal(...)which isn't affected by the local system timezone. This API was introduced in Java 9 to solve issues like this. The decade old original RFR, when this API was introduced, does a very good job of explaining the necessity of this API and how it differs from thesetTime(...)method https://mail.openjdk.org/pipermail/core-libs-dev/2015-June/034426.html.The commit in this PR also introduces a regression test which reproduces the issue and verifies the fix.
I have run this change in tier1 and tier5 and this and other tests continue to pass.
Progress
Issue
Reviewers
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/25207/head:pull/25207$ git checkout pull/25207Update a local copy of the PR:
$ git checkout pull/25207$ git pull https://git.openjdk.org/jdk.git pull/25207/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 25207View PR using the GUI difftool:
$ git pr show -t 25207Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/25207.diff
Using Webrev
Link to Webrev Comment