提交 c46e0e61 编写于 作者: R robm

8169465: Deadlock in com.sun.jndi.ldap.pool.Connections

Reviewed-by: dfuchs, vtewari
上级 de5bac17
...@@ -27,7 +27,6 @@ package com.sun.jndi.ldap.pool; ...@@ -27,7 +27,6 @@ package com.sun.jndi.ldap.pool;
import java.util.ArrayList; // JDK 1.2 import java.util.ArrayList; // JDK 1.2
import java.util.List; import java.util.List;
import java.util.Iterator;
import java.lang.ref.Reference; import java.lang.ref.Reference;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
...@@ -290,24 +289,29 @@ final class Connections implements PoolCallback { ...@@ -290,24 +289,29 @@ final class Connections implements PoolCallback {
* @param threshold an entry idle since this time has expired. * @param threshold an entry idle since this time has expired.
* @return true if no more connections in list * @return true if no more connections in list
*/ */
synchronized boolean expire(long threshold) { boolean expire(long threshold) {
Iterator<ConnectionDesc> iter = conns.iterator(); List<ConnectionDesc> clonedConns;
ConnectionDesc entry; synchronized(this) {
while (iter.hasNext()) { clonedConns = new ArrayList<>(conns);
entry = iter.next(); }
if (entry.expire(threshold)) { List<ConnectionDesc> expired = new ArrayList<>();
d("expire(): removing ", entry);
td("Expired ", entry);
iter.remove(); // remove from pool for (ConnectionDesc entry : clonedConns) {
d("expire(): ", entry);
if (entry.expire(threshold)) {
expired.add(entry);
td("expire(): Expired ", entry);
}
}
synchronized (this) {
conns.removeAll(expired);
// Don't need to call notify() because we're // Don't need to call notify() because we're
// removing only idle connections. If there were // removing only idle connections. If there were
// idle connections, then there should be no waiters. // idle connections, then there should be no waiters.
}
}
return conns.isEmpty(); // whether whole list has 'expired' return conns.isEmpty(); // whether whole list has 'expired'
} }
}
/** /**
* Called when this instance of Connections has been removed from Pool. * Called when this instance of Connections has been removed from Pool.
......
...@@ -25,11 +25,11 @@ ...@@ -25,11 +25,11 @@
package com.sun.jndi.ldap.pool; package com.sun.jndi.ldap.pool;
import java.util.ArrayList;
import java.util.Map; import java.util.Map;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.io.PrintStream; import java.io.PrintStream;
...@@ -166,17 +166,25 @@ final public class Pool { ...@@ -166,17 +166,25 @@ final public class Pool {
* and removed. * and removed.
*/ */
public void expire(long threshold) { public void expire(long threshold) {
Collection<ConnectionsRef> copy;
synchronized (map) { synchronized (map) {
Iterator<ConnectionsRef> iter = map.values().iterator(); copy = new ArrayList<>(map.values());
}
ArrayList<ConnectionsRef> removed = new ArrayList<>();
Connections conns; Connections conns;
while (iter.hasNext()) { for (ConnectionsRef ref : copy) {
conns = iter.next().getConnections(); conns = ref.getConnections();
if (conns.expire(threshold)) { if (conns.expire(threshold)) {
d("expire(): removing ", conns); d("expire(): removing ", conns);
iter.remove(); removed.add(ref);
} }
} }
synchronized (map) {
map.values().removeAll(removed);
} }
expungeStaleConnections(); expungeStaleConnections();
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册