Author: toad
Date: 2006-09-20 19:56:28 +0000 (Wed, 20 Sep 2006)
New Revision: 10495

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Fix deadlock, remove unnecessary extra lock for routing backoff status.

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-09-20 17:26:27 UTC 
(rev 10494)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-09-20 19:56:28 UTC 
(rev 10495)
@@ -1787,11 +1787,8 @@
         }
     }

-    // FIXME nested locking; helpful, but necessary ?
-    // In any case, if we have to do this, we must always take the lock on 
this before on routingBackoffSync
     public synchronized PeerNodeStatus getStatus() {
-       PeerNodeStatus peerNodeStatus = new PeerNodeStatus(this);
-        return peerNodeStatus;
+       return new PeerNodeStatus(this);
     }

     public String getTMCIPeerInfo() {
@@ -1875,8 +1872,6 @@
                        if(peerAddedTime > 1) {
                                fs.put("peerAddedTime", 
Long.toString(peerAddedTime));
                        }
-               }
-               synchronized(routingBackoffSync) {
                        fs.put("lastRoutingBackoffReason", 
lastRoutingBackoffReason);
                        fs.put("routingBackoffPercent", 
Double.toString(backedOffPercent.currentValue() * 100));
                        fs.put("routingBackoff", 
Long.toString((Math.max(routingBackedOffUntil - now, 0))));
@@ -1973,11 +1968,9 @@
         return hashCode;
     }

-       private final Object routingBackoffSync = new Object();
-       
        public boolean isRoutingBackedOff() {
                long now = System.currentTimeMillis();
-               synchronized(routingBackoffSync) {
+               synchronized(this) {
                        if(now < routingBackedOffUntil) {
                                if(logMINOR) Logger.minor(this, "Routing is 
backed off");
                                return true;
@@ -2015,18 +2008,14 @@
         * Track the percentage of time a peer spends backed off
         */
        private void reportBackoffStatus(long now) {
-               long localRoutingBackedOffUntil = -1;
-               synchronized(routingBackoffSync) {
-                       localRoutingBackedOffUntil = routingBackedOffUntil;
-               }
                synchronized(this) {
                        if(now > lastSampleTime) { // don't report twice in the 
same millisecond
-                               if (now > localRoutingBackedOffUntil) { // not 
backed off
-                                       if (lastSampleTime > 
localRoutingBackedOffUntil) { // last sample after last backoff
+                               if (now > routingBackedOffUntil) { // not 
backed off
+                                       if (lastSampleTime > 
routingBackedOffUntil) { // last sample after last backoff
                                                backedOffPercent.report(0.0);
                                        } else {
-                                               if(localRoutingBackedOffUntil > 
0)
-                                                       
backedOffPercent.report((double)(localRoutingBackedOffUntil - 
lastSampleTime)/(double)(now - lastSampleTime));
+                                               if(routingBackedOffUntil > 0)
+                                                       
backedOffPercent.report((double)(routingBackedOffUntil - 
lastSampleTime)/(double)(now - lastSampleTime));
                                        }
                                } else {
                                        backedOffPercent.report(1.0);
@@ -2048,26 +2037,23 @@
                reportBackoffStatus(now);
                // 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;
+                       // 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;
+                               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;
                        }
+                       setLastBackoffReason( reason );
                }
                setPeerNodeStatus(now);
        }
@@ -2082,7 +2068,7 @@
                Peer peer = getPeer();
                long now = System.currentTimeMillis();
                reportBackoffStatus(now);
-               synchronized(routingBackoffSync) {
+               synchronized(this) {
                        // Don't un-backoff if still backed off
                        if(now > routingBackedOffUntil) {
                                routingBackoffLength = 
INITIAL_ROUTING_BACKOFF_LENGTH;
@@ -2182,16 +2168,12 @@
                return myName;
        }

-       public int getRoutingBackoffLength() {
-        synchronized(routingBackoffSync) {
-                       return routingBackoffLength;
-               }
+       public synchronized int getRoutingBackoffLength() {
+               return routingBackoffLength;
        }

-       public long getRoutingBackedOffUntil() {
-        synchronized(routingBackoffSync) {
-                       return routingBackedOffUntil;
-               }
+       public synchronized long getRoutingBackedOffUntil() {
+               return routingBackedOffUntil;
        }

        public synchronized String getLastBackoffReason() {


Reply via email to