Author: nextgens Date: 2006-09-08 21:12:58 +0000 (Fri, 08 Sep 2006) New Revision: 10436
Modified: trunk/freenet/src/freenet/node/PeerNode.java Log: Fix a deadlock (http://dark-code.bulix.org/phvyey-16367) Modified: trunk/freenet/src/freenet/node/PeerNode.java =================================================================== --- trunk/freenet/src/freenet/node/PeerNode.java 2006-09-08 21:06:31 UTC (rev 10435) +++ trunk/freenet/src/freenet/node/PeerNode.java 2006-09-08 21:12:58 UTC (rev 10436) @@ -2045,24 +2045,27 @@ long now = System.currentTimeMillis(); Peer peer = getPeer(); reportBackoffStatus(now); - synchronized(routingBackoffSync) { - // Don't back off any further if we are already backed off - if(now > routingBackedOffUntil) { - routingBackoffLength = routingBackoffLength * BACKOFF_MULTIPLIER; - if(routingBackoffLength > MAX_ROUTING_BACKOFF_LENGTH) - routingBackoffLength = MAX_ROUTING_BACKOFF_LENGTH; - int x = node.random.nextInt(routingBackoffLength); - routingBackedOffUntil = now + x; - setLastBackoffReason( reason ); - String reasonWrapper = ""; - if( 0 <= reason.length()) { - reasonWrapper = " because of '"+reason+"'"; + // We need it because of nested locking on getStatus() + synchronized (this) { + synchronized(routingBackoffSync) { + // Don't back off any further if we are already backed off + if(now > routingBackedOffUntil) { + routingBackoffLength = routingBackoffLength * BACKOFF_MULTIPLIER; + if(routingBackoffLength > MAX_ROUTING_BACKOFF_LENGTH) + routingBackoffLength = MAX_ROUTING_BACKOFF_LENGTH; + int x = node.random.nextInt(routingBackoffLength); + routingBackedOffUntil = now + x; + setLastBackoffReason( reason ); + String reasonWrapper = ""; + if( 0 <= reason.length()) { + reasonWrapper = " because of '"+reason+"'"; + } + + if(logMINOR) Logger.minor(this, "Backing off"+reasonWrapper+": routingBackoffLength="+routingBackoffLength+", until "+x+"ms on "+peer); + } else { + if(logMINOR) Logger.minor(this, "Ignoring localRejectedOverload: "+(routingBackedOffUntil-now)+"ms remaining on routing backoff on "+peer); + return; } - - if(logMINOR) Logger.minor(this, "Backing off"+reasonWrapper+": routingBackoffLength="+routingBackoffLength+", until "+x+"ms on "+peer); - } else { - if(logMINOR) Logger.minor(this, "Ignoring localRejectedOverload: "+(routingBackedOffUntil-now)+"ms remaining on routing backoff on "+peer); - return; } } setPeerNodeStatus(now);
