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