[jdk9] RFR: 8159822: Non-synchronized access to shared members of com.sun.jndi.ldap.pool.Pool
Ivan Gerasimov
ivan.gerasimov at oracle.com
Thu Jun 30 15:43:47 UTC 2016
Thanks Seán!
I added an example of stacktrace to the description.
With kind regards,
Ivan
On 30.06.2016 17:31, Seán Coffey wrote:
> Looks fine to me Ivan.
>
> If you have a stacktrace of an example ConcurrentModificationException
> issue, please paste it into the bug report so that it's documented for
> others to find.
>
> Regards,
> Sean.
>
> On 24/06/2016 15:56, Ivan Gerasimov wrote:
>> Hi Aleksey!
>>
>> I've double-checked the Pool class and found no other code that has
>> to be additionally synchronized.
>> Please note that the method expungeStaleConnections() is thread-safe
>> and can be called from outside the synchronized blocks.
>> The method Pool.getConnections(Object) accesses the `map` field, but
>> it is only called from synchronized blocks, so it's fine.
>>
>> Please let me know, if I'm missing something obvious.
>>
>> With kind regards,
>> Ivan
>>
>>
>> On 21.06.2016 19:25, Ivan Gerasimov wrote:
>>>
>>>
>>> On 21.06.2016 18:43, Aleksey Shipilev wrote:
>>>> On 06/21/2016 06:14 PM, Ivan Gerasimov wrote:
>>>>> Hello!
>>>>>
>>>>> The Pool has a member `map`, which is accessed from different
>>>>> threads,
>>>>> thus the access is synchronized.
>>>>> However, in some code paths (mostly in debug printing) it is accessed
>>>>> without proper synchronization, which results in intermediate
>>>>> ConcurrentModificationException when the debug output is turned on.
>>>>>
>>>>> Would you please help review the fix?
>>>>>
>>>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8159822
>>>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8159822/00/webrev/
>>>> Missed synchronized-s:
>>>>
>>>> 154 private Connections getConnections(Object id) {
>>>> 155 ConnectionsRef ref = map.get(id);
>>>> 156 return (ref != null) ? ref.getConnections() : null;
>>>> 157 }
>>>>
>>>> ...gets called via:
>>>>
>>>> 168 public void expire(long threshold) {
>>>> 169 synchronized (map) {
>>>> ...
>>>> 179 }
>>>> 180 expungeStaleConnections();
>>>> 181 }
>>>>
>>>> ...and also via:
>>>>
>>>> 188 private static void expungeStaleConnections() {
>>>> ...
>>>> 192 Connections conns = releaseRef.getConnections();
>>>> ...
>>>> 203 }
>>>> 204 }
>>> But this is ConnectionsWeakRef.getConnections() not
>>> Pool.getConnections(Object).
>>> As far as I can see, an instance of ConnectionsWeakRef cannot be
>>> accessed concurrently.
>>>
>>>>
>>>> ...
>>>>
>>>> 117 public PooledConnection getPooledConnection(Object id, long
>>>> timeout,
>>>> 118 PooledConnectionFactory factory) throws
>>>> NamingException {
>>>> ...
>>>> // no synchronized prior here
>>>> 127 expungeStaleConnections();
>>>> ...
>>>>
>>> expungeStaleConnections() should be safe to call concurrently as
>>> long as ReferenceQueue.poll() is thread-safe.
>>>
>>> With kind regards,
>>> Ivan
>>>
>>>
>>
>
>
More information about the core-libs-dev
mailing list