-
Notifications
You must be signed in to change notification settings - Fork 5.5k
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
8324646: Avoid Class.forName in SecureRandom constructor #17559
Conversation
👋 Welcome back ogillespie! A progress list of the required criteria for merging this PR into |
@olivergillespie The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
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.
This looks promising to me! But we need to polish this a bit:
@@ -1557,12 +1557,22 @@ private static class EngineDescription { | |||
final String name; | |||
final boolean supportsParameter; | |||
final String constructorParameterClassName; | |||
private volatile Class<?> constructorParameterClass; |
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.
Style: no need for private
here, match what other fields are doing.
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.
I don't disagree in principle but it was like this before the revert, and is still like this in 17.
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.
Is volatile really needed? And there is some performance penalty and in practice the value will be the same even if recomputed.
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.
Same thinking as above - this is how it was before, and how it is in 17. I'd rather not diverge, unless the reason is strong.
ctrParamClz = cap.constructorParameterClassName == null? | ||
null : Class.forName(cap.constructorParameterClassName); | ||
null : cap.getConstructorParameterClass(); |
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.
Maybe we should move the ternary for cap.constructorParameterClassName == null
into new method to begin with.
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.
Thanks. Similar reasoning as above. If we decide to diverge from the original implementation then I'll update this too.
test/micro/org/openjdk/bench/java/security/SecureRandomBench.java
Outdated
Show resolved
Hide resolved
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, given our target is to backport this to other releases which have a similar code shape. But someone who is more familiar with this code should take a look, maybe @valeriepeng?
/reviewers 2
@olivergillespie 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 192 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. As you do not have Committer status in this project an existing Committer must agree to sponsor your change. Possible candidates are the reviewers of this PR (@shipilev, @wangweij) but any other Committer may sponsor as well. ➡️ To flag this PR as ready for integration with the above commit message, type |
How about just using class literals? There is no need to call |
Thanks :). That seems sensible if writing from scratch, but that part I'm just reviving from JDK-8280970 which is nice for keeping it in sync with 17 for backports. My preference is to keep it close to the original code/17 unless there's a strong reason not to. |
I second Max's suggestion of just using class literals. It's cleaner this way. I'd think it'd also be faster? |
The lookup only happens once per entry so I don't think performance is a big deal either way. What do you both think about my argument for re-using the code that stood for years and still stands in 17? |
You are converting from string to class anyway, and since this is only implementation detail inside one file, we can even backport it if it really helps. |
I still prefer class literals as it's cleaner and more straight forward than the pre-existing approach. Why having two fields when one is enough. In most if not all aspects, class literals seems a better solution... Backport should be doable as the scope of change is limited. |
Updated with class literals, thanks |
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.
I like it even more with class literals.
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.
LGTM.
BTW, is there any change in benchmark scores?
Thank you :) No change in benchmark score, or perhaps slight improvement. There seem to be two modes, one at 2400ns/op (same as original change) and one around 2200ns/op.
|
/integrate Assuming the approvals still hold after the trivial copyright change, I think this is ready to go. Thanks all. |
@olivergillespie |
/sponsor |
Going to push as commit 8ef918d.
Your commit was automatically rebased without conflicts. |
@wangweij @olivergillespie Pushed as commit 8ef918d. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
/backport jdk17u |
@olivergillespie Could not automatically backport
Please fetch the appropriate branch/commit and manually resolve these conflicts by using the following commands in your personal fork of openjdk/jdk17u. Note: these commands are just some suggestions and you can use other equivalent commands you know.
Once you have resolved the conflicts as explained above continue with creating a pull request towards the openjdk/jdk17u with the title Below you can find a suggestion for the pull request body:
|
/backport jdk21u-dev |
@olivergillespie the backport was successfully created on the branch backport-olivergillespie-8ef918d6 in my personal fork of openjdk/jdk21u-dev. To create a pull request with this backport targeting openjdk/jdk21u-dev:master, just click the following link: The title of the pull request is automatically filled in correctly and below you find a suggestion for the pull request body:
If you need to update the source branch of the pull then run the following commands in a local clone of your personal fork of openjdk/jdk21u-dev:
|
/backport jdk22u-dev |
@olivergillespie The target repository |
/backport jdk22u |
@olivergillespie the backport was successfully created on the branch backport-olivergillespie-8ef918d6 in my personal fork of openjdk/jdk22u. To create a pull request with this backport targeting openjdk/jdk22u:master, just click the following link: The title of the pull request is automatically filled in correctly and below you find a suggestion for the pull request body:
If you need to update the source branch of the pull then run the following commands in a local clone of your personal fork of openjdk/jdk22u:
|
Avoid expensive
Class.forName
call when constructing Providers such asSecureRandom
which take constructor parameters. This can easily be cached in EngineDescription (this cache already existed before, it was removed in JDK-8280970 as unused, I'm bringing it back unchanged to support this new usage).Benchmark results on my Linux x86 host show around a 20% reduction in time to create a new
SecureRandom
instance. Most of the remaining overhead is due to a failing constructor lookup - see JDK-8324648.I have seen multiple real-world applications which call
new SecureRandom()
on the hot path, so I believe efficiency here is important.Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/17559/head:pull/17559
$ git checkout pull/17559
Update a local copy of the PR:
$ git checkout pull/17559
$ git pull https://git.openjdk.org/jdk.git pull/17559/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 17559
View PR using the GUI difftool:
$ git pr show -t 17559
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/17559.diff
Webrev
Link to Webrev Comment