[13] RFR JDK-7107615 "scalability bloker in javax.crypto.JceSecurity"
Xuelei Fan
xuelei.fan at oracle.com
Tue Apr 16 22:43:02 UTC 2019
On 4/16/2019 2:16 PM, Valerie Peng wrote:
> Hi Xuelei,
>
> Thanks for the comments.
>
> On 4/16/2019 8:58 AM, Xuelei Fan wrote:
>> 213-217:
>> Previously, the set/get of both verificationResults and
>> verifyingProviders are synchronized. With this update, the get of
>> verificationResults is not out of the set synchronized block, so there
>> is a competition introduced. I think it would be nice to double check
>> the verificationResults in the synchronized block.
>> synchronized (JceSecurity.class) {
>> + // double check if the provider has been verified
>> ...
>> }
>>
> Hmm, are you talking about the verificationResults.get(pKey) call (line
> 206) and move it inside the block of synchronized (JceSecurity.class)
> (line 212)?
I meant to get/check twice.
... getVerificationResult(Provider p) {
...
// get/check block
Object o = verificationResults.get(pKey);
if ( o == ...) {
...
} else if (o != null) {
...
}
synchronized (JceSecurity.class) {
// double check if the provider has been verified.
// use the get/check block again
Object o = verificationResults.get(pKey);
if ( o == ...) {
...
} else if (o != null) {
...
}
// further operation is the provider has not been verified.
....
}
}
> If that's what you suggest, I think that'd take away the key
> idea of this performance rfe fix. My understanding of the patch is to
> use a ConcurrentHashMap for "verificationResult" so accesses to this
> "verificationResult" cache are controlled by the finer-grained model of
> ConcurrentHashMap. On the other hand, verifyingProviders map and the
> time consuming/potentially complex verifyProvider(...) call are still
> inside the synchronized (JceSecurity.class) block. Maybe it'd be clearer
> if I had re-written the code and move the verificationResults.put(...)
> calls outside of the synchronized (JceSecurity.class) block. The way I
> look at it, this change separates out the "verificationResult" cache
> from the rest of the provider verification logic and uses
> ConcurrentHashMap instead of JceSecurity.class in order to improve
> performance.
>
I think there is a competition. If two threads try to get the lock,
line 212-227 get executed in both thread. The double checking scheme
could avoid it as when the 2nd thread get the lock, it will use the
result of the 1st thread.
>> I did not get the idea to use verifyingProviders. In line 219, a
>> provider was inserted into the map, and in the final block, line 235,
>> the provider was removed from the map. There is no other update of
>> the map, so the map should always be empty and not really used. Am I
>> missing something? Could the verifyingProviders field get removed?
>>
> The verifyingProviders field is for detecting potential recursions
> during the provider verification. the verifyProvider(URL, Provider) call
> will call ProviderVerifier.verify(). This will trigger provider jar file
> verification. Depending on runtime provider verification, this may
> trigger another provider being loaded/verified. As
> getVerificationResult(Provider) is being called by the pkg private
> static method JceSecurity.getInstance(...) which is used internally by
> other JCA classes, it's possible for getVerificationResult(...) to be
> recursively called and thus the verifyingProviders field will help
> detect if somehow verifying the current provider will require loading
> another JCA service from the current provider.
>
I see the point now. Thanks!
>>
>> 406-426:
>> I may add a blank line between two different blocks (methods, field
>> and methods).
>>
> Sure, added.
>
>
>> - 416 if (o instanceof IdentityWrapper == false) {
>> + 416 if (!(o instanceof IdentityWrapper)) {
>>
>> I prefer to use "!" operator.
>
> Sure.
>
Thanks!
Xuelei
> Webrev updated at: http://cr.openjdk.java.net/~valeriep/7107615/webrev.01/
>
> Thanks,
> Valerie
>>
>> Xuelei
>>
>> On 4/15/2019 6:20 PM, Valerie Peng wrote:
>>>
>>> Anyone has time to review this performance rfe? The fix is based on
>>> Sergey's suggested patch.
>>>
>>> RFE: https://bugs.openjdk.java.net/browse/JDK-7107615
>>>
>>> Webrev: http://cr.openjdk.java.net/~valeriep/7107615/webrev.00/
>>>
>>> Mach5 run is clean.
>>>
>>> Thanks,
>>> Valerie
More information about the security-dev
mailing list