Update of /cvsroot/freenet/freenet/src/freenet In directory sc8-pr-cvs1:/tmp/cvs-serv24593/freenet
Modified Files: OpenConnectionManager.java Log Message: Fix deadlock in the changes moving sync(lru) outside of KillSurplusConnections. No more deadlocks, and since we now remove from lru _before_ actually going to terminate the connection this still ensures that we don't kill too many Index: OpenConnectionManager.java =================================================================== RCS file: /cvsroot/freenet/freenet/src/freenet/OpenConnectionManager.java,v retrieving revision 1.109 retrieving revision 1.110 diff -u -r1.109 -r1.110 --- OpenConnectionManager.java 26 Sep 2003 22:38:34 -0000 1.109 +++ OpenConnectionManager.java 28 Sep 2003 14:58:45 -0000 1.110 @@ -107,11 +107,9 @@ openConns++; } if ( maxConnections != 0 && lru.size() < maxConnections ) return; - synchronized(lru) { - /* At toad's request moving back to diong this in every thred. */ -// lru.notifyAll(); - KillSurplusConnections(); - } + /* At toad's request moving back to diong this in every thred. */ +// lru.notifyAll(); + KillSurplusConnections(); } // Removing a connection that isn't in the OCM is a @@ -490,54 +488,56 @@ boolean oldestCache = false; boolean candidateCache = false; while (true) { - if ( maxConnections > 0 && lru.size() > maxConnections ) { - synchronized(closedList) { - if ( !closedList.isEmpty() ) { - oldest = (ConnectionHandler)closedList.removeLast(); + synchronized(lru) { + if ( maxConnections > 0 && lru.size() > maxConnections ) { + synchronized(closedList) { + if ( !closedList.isEmpty() ) { + oldest = (ConnectionHandler)closedList.removeLast(); + } } - } - // Dump an idle connection if possible. - if ( oldest == null ) for (Enumeration e = lru.elements(); e.hasMoreElements();) { - ConnectionHandler candidate = - (ConnectionHandler)e.nextElement(); - if (!(candidate.sending() || candidate.receiving())) { - // If the oldest is open and the candidate is closed... - if( !candidate.isOpen() ) { - oldest = candidate; - break; - } else if ( oldest != null ) { - //This can only happen if it closes during the run of - //this loop, very unlikely but _anything_ which could - //keep us from running onlyRTNodeConn is a good thing - //because that involves locking hashtables, BigInteger - //math and badness like that. - if ( oldest != null && (!oldest.isOpen()) ) + // Dump an idle connection if possible. + if ( oldest == null ) for (Enumeration e = lru.elements(); e.hasMoreElements();) { + ConnectionHandler candidate = + (ConnectionHandler)e.nextElement(); + if (!(candidate.sending() || candidate.receiving())) { + // If the oldest is open and the candidate is closed... + if( !candidate.isOpen() ) { + oldest = candidate; break; - // If the oldest is an only-conn-to-this-RTNode and the - // candidate is not... then use the candidate - if ( ( ( oldest == cached && oldestCache ) || - ( oldestCache = onlyRTNodeConn(oldest) ) ) && - ! ( candidateCache = onlyRTNodeConn(candidate) ) ) { + } else if ( oldest != null ) { + //This can only happen if it closes during the run of + //this loop, very unlikely but _anything_ which could + //keep us from running onlyRTNodeConn is a good thing + //because that involves locking hashtables, BigInteger + //math and badness like that. + if ( oldest != null && (!oldest.isOpen()) ) + break; + // If the oldest is an only-conn-to-this-RTNode and the + // candidate is not... then use the candidate + if ( ( ( oldest == cached && oldestCache ) || + ( oldestCache = onlyRTNodeConn(oldest) ) ) && + ! ( candidateCache = onlyRTNodeConn(candidate) ) ) { + oldest = candidate; + oldestCache = candidateCache; + } + cached = oldest; + } else { oldest = candidate; - oldestCache = candidateCache; } - cached = oldest; - } else { - oldest = candidate; } } - } - if (oldest == null) { - // Not good. This connection will most likely - // be restarted, causing even more traffic :-( - oldest = (ConnectionHandler)lru.pop(); + if (oldest == null) { + // Not good. This connection will most likely + // be restarted, causing even more traffic :-( + oldest = (ConnectionHandler)lru.pop(); + } else { + lru.remove(oldest); + } + } else { - lru.remove(oldest); + //We have killed enough connections + return; } - - } else { - //We have killed enough connections - return; } if (oldest != null) { Core.diagnostics.occurrenceBinomial("connectionTimedout", 1, 0); _______________________________________________ cvs mailing list [EMAIL PROTECTED] http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs