[jdk9] RFR: 8159822: Non-synchronized access to shared members of com.sun.jndi.ldap.pool.Pool
Ivan Gerasimov
ivan.gerasimov at oracle.com
Tue Jun 21 16:25:00 UTC 2016
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