Author: toad
Date: 2006-06-14 23:40:14 +0000 (Wed, 14 Jun 2006)
New Revision: 9205

Modified:
   trunk/freenet/src/freenet/node/ARKFetcher.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
814: Fix a deadlock.

Modified: trunk/freenet/src/freenet/node/ARKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/node/ARKFetcher.java      2006-06-14 23:17:10 UTC 
(rev 9204)
+++ trunk/freenet/src/freenet/node/ARKFetcher.java      2006-06-14 23:40:14 UTC 
(rev 9205)
@@ -112,19 +112,21 @@
                        getter.cancel();
        }

-       public synchronized void onSuccess(FetchResult result, ClientGetter 
state) {
+       public void onSuccess(FetchResult result, ClientGetter state) {
                Logger.minor(this, "Fetched ARK for "+peer, new 
Exception("debug"));
-               started = false;
-               // Fetcher context specifies an upper bound on size.
-               backoff = MIN_BACKOFF;
-               
-               if(isFetching) {
-                       node.removeARKFetcher(identity,this);
-                       isFetching = false;
+               synchronized(this) {
+                       started = false;
+                       // Fetcher context specifies an upper bound on size.
+                       backoff = MIN_BACKOFF;
+                       
+                       if(isFetching) {
+                               node.removeARKFetcher(identity,this);
+                               isFetching = false;
+                       }
+                       
+                       getter = null;
                }

-               getter = null;
-               
                ArrayBucket bucket = (ArrayBucket) result.asBucket();
                byte[] data = bucket.toByteArray();
                String ref;
@@ -145,26 +147,30 @@
                }
        }

-       public synchronized void onFailure(FetchException e, ClientGetter 
state) {
-               started = false;
-               Logger.minor(this, "Failed to fetch ARK for "+peer+" : "+e, e);
-               
-               if(isFetching) {
-                       node.removeARKFetcher(identity,this);
-                       isFetching = false;
+       public void onFailure(FetchException e, ClientGetter state) {
+               synchronized(this) {
+                       started = false;
+                       Logger.minor(this, "Failed to fetch ARK for "+peer+" : 
"+e, e);
+                       
+                       if(isFetching) {
+                               node.removeARKFetcher(identity,this);
+                               isFetching = false;
+                       }
+                       
+                       // If it's a redirect, follow the redirect and update 
the ARK.
+                       // If it's any other error, wait a while then retry.
+                       getter = null;
+                       if(!shouldRun) return;
+                       if(e.newURI == null) {
+                               backoff += backoff;
+                               if(backoff > MAX_BACKOFF) backoff = MAX_BACKOFF;
+                       }
                }
-               
-               // If it's a redirect, follow the redirect and update the ARK.
-               // If it's any other error, wait a while then retry.
-               getter = null;
-               if(!shouldRun) return;
                if(e.newURI != null) {
                        peer.updateARK(e.newURI);
                        queueWithBackoff();
                        return;
                }
-               backoff += backoff;
-               if(backoff > MAX_BACKOFF) backoff = MAX_BACKOFF;
                Logger.minor(this, "Failed to fetch ARK for "+peer+", now 
backing off ARK fetches for "+(int) (backoff / 1000)+" seconds");
                // We may be on the PacketSender thread.
                // FIXME should this be exponential backoff?

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-06-14 23:17:10 UTC 
(rev 9204)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-06-14 23:40:14 UTC 
(rev 9205)
@@ -1065,99 +1065,101 @@
      * @param replyTo
      * @return True unless we rejected the handshake, or it failed to parse.
      */
-    public synchronized boolean completedHandshake(long thisBootID, byte[] 
data, int offset, int length, BlockCipher encCipher, byte[] encKey, Peer 
replyTo, boolean unverified) {
-      long now = System.currentTimeMillis();
-       completedHandshake = true;
-       handshakeCount = 0;
+    public boolean completedHandshake(long thisBootID, byte[] data, int 
offset, int length, BlockCipher encCipher, byte[] encKey, Peer replyTo, boolean 
unverified) {
+       long now = System.currentTimeMillis();
        arkFetcher.stop();
-        bogusNoderef = false;
-        try {
-            // First, the new noderef
-            processNewNoderef(data, offset, length);
-        } catch (FSParseException e1) {
-            bogusNoderef = true;
-            Logger.error(this, "Failed to parse new noderef for "+this+": 
"+e1, e1);
-            // Treat as invalid version
-        }
-        if(reverseInvalidVersion()) {
-            try {
-                
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(lastGoodVersion));
-            } catch (NumberFormatException e) {
-                // ignore
-            }
-            Logger.normal(this, "Not connecting to "+this+" - reverse invalid 
version "+Version.getVersionString()+" for peer's lastGoodversion: 
"+lastGoodVersion);
-            verifiedIncompatibleNewerVersion = true;
-            isConnected = false;
-            setPeerNodeStatus(now);
-            node.peers.disconnected(this);
-            return false;
-        } else {
-            verifiedIncompatibleNewerVersion = false;
-            setPeerNodeStatus(now);
-        }
-        if(invalidVersion()) {
-            Logger.normal(this, "Not connecting to "+this+" - invalid version 
"+version);
-            verifiedIncompatibleOlderVersion = true;
-            isConnected = false;
-            setPeerNodeStatus(now);
-            node.peers.disconnected(this);
-            return false;
-        } else {
-            verifiedIncompatibleOlderVersion = false;
-            setPeerNodeStatus(now);
-        }
-        KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
-        changedIP(replyTo);
-        if(thisBootID != this.bootID) {
-            connectedTime = System.currentTimeMillis();
-            Logger.minor(this, "Changed boot ID from "+bootID+" to 
"+thisBootID+" for "+getPeer());
-            isConnected = false; // Will be reset below
-            setPeerNodeStatus(now);
-            if(previousTracker != null) {
-                KeyTracker old = previousTracker;
-                previousTracker = null;
-                old.completelyDeprecated(newTracker);
-            }
-            previousTracker = null;
-            if(currentTracker != null) {
-                KeyTracker old = currentTracker;
-                currentTracker = null;
-                old.completelyDeprecated(newTracker);
-            }
-            this.bootID = thisBootID;
-            node.lm.lostOrRestartedNode(this);
-        } // else it's a rekey
-        
-        if(unverified) {
-            unverifiedTracker = newTracker;
-            ctx = null;
-            Logger.minor(this, "sentHandshake() being called for 
unverifiedTracker: "+getPeer());
-            sentHandshake();
-        } else {
-            previousTracker = currentTracker;
-            currentTracker = newTracker;
-            unverifiedTracker = null;
-            if(previousTracker != null)
-                previousTracker.deprecated();
-            isConnected = true;
-            neverConnected = false;
-            peerAddedTime = 0;  // don't store anymore
-            setPeerNodeStatus(now);
-            ctx = null;
-        }
-        if(!isConnected)
-               node.peers.disconnected(this);
-        Logger.normal(this, "Completed handshake with "+this+" on "+replyTo+" 
- current: "+currentTracker+" old: "+previousTracker+" unverified: 
"+unverifiedTracker+" bootID: "+thisBootID+" myName: "+myName);
-        try {
-                       receivedPacket(unverified);
-               } catch (NotConnectedException e) {
-                       Logger.error(this, "Disconnected in completedHandshake 
with "+this);
-                       return true; // i suppose
-               }
-               if(isConnected)
-                       node.peers.addConnectedPeer(this);
-        sentInitialMessages = false;
-        return true;
+       synchronized(this) {
+               completedHandshake = true;
+               handshakeCount = 0;
+               bogusNoderef = false;
+               try {
+                       // First, the new noderef
+                       processNewNoderef(data, offset, length);
+               } catch (FSParseException e1) {
+                       bogusNoderef = true;
+                       Logger.error(this, "Failed to parse new noderef for 
"+this+": "+e1, e1);
+                       // Treat as invalid version
+               }
+               if(reverseInvalidVersion()) {
+                       try {
+                               
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(lastGoodVersion));
+                       } catch (NumberFormatException e) {
+                               // ignore
+                       }
+                       Logger.normal(this, "Not connecting to "+this+" - 
reverse invalid version "+Version.getVersionString()+" for peer's 
lastGoodversion: "+lastGoodVersion);
+                       verifiedIncompatibleNewerVersion = true;
+                       isConnected = false;
+                       setPeerNodeStatus(now);
+                       node.peers.disconnected(this);
+                       return false;
+               } else {
+                       verifiedIncompatibleNewerVersion = false;
+                       setPeerNodeStatus(now);
+               }
+               if(invalidVersion()) {
+                       Logger.normal(this, "Not connecting to "+this+" - 
invalid version "+version);
+                       verifiedIncompatibleOlderVersion = true;
+                       isConnected = false;
+                       setPeerNodeStatus(now);
+                       node.peers.disconnected(this);
+                       return false;
+               } else {
+                       verifiedIncompatibleOlderVersion = false;
+                       setPeerNodeStatus(now);
+               }
+               KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
+               changedIP(replyTo);
+               if(thisBootID != this.bootID) {
+                       connectedTime = System.currentTimeMillis();
+                       Logger.minor(this, "Changed boot ID from "+bootID+" to 
"+thisBootID+" for "+getPeer());
+                       isConnected = false; // Will be reset below
+                       setPeerNodeStatus(now);
+                       if(previousTracker != null) {
+                               KeyTracker old = previousTracker;
+                               previousTracker = null;
+                               old.completelyDeprecated(newTracker);
+                       }
+                       previousTracker = null;
+                       if(currentTracker != null) {
+                               KeyTracker old = currentTracker;
+                               currentTracker = null;
+                               old.completelyDeprecated(newTracker);
+                       }
+                       this.bootID = thisBootID;
+                       node.lm.lostOrRestartedNode(this);
+               } // else it's a rekey
+               
+               if(unverified) {
+                       unverifiedTracker = newTracker;
+                       ctx = null;
+                       Logger.minor(this, "sentHandshake() being called for 
unverifiedTracker: "+getPeer());
+                       sentHandshake();
+               } else {
+                       previousTracker = currentTracker;
+                       currentTracker = newTracker;
+                       unverifiedTracker = null;
+                       if(previousTracker != null)
+                               previousTracker.deprecated();
+                       isConnected = true;
+                       neverConnected = false;
+                       peerAddedTime = 0;  // don't store anymore
+                       setPeerNodeStatus(now);
+                       ctx = null;
+               }
+               if(!isConnected)
+                       node.peers.disconnected(this);
+               Logger.normal(this, "Completed handshake with "+this+" on 
"+replyTo+" - current: "+currentTracker+" old: "+previousTracker+" unverified: 
"+unverifiedTracker+" bootID: "+thisBootID+" myName: "+myName);
+               try {
+                       receivedPacket(unverified);
+               } catch (NotConnectedException e) {
+                       Logger.error(this, "Disconnected in completedHandshake 
with "+this);
+                       return true; // i suppose
+               }
+               if(isConnected)
+                       node.peers.addConnectedPeer(this);
+               sentInitialMessages = false;
+               return true;
+       }
     }

     boolean sentInitialMessages = false;

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-14 23:17:10 UTC (rev 
9204)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-14 23:40:14 UTC (rev 
9205)
@@ -18,7 +18,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 813;
+       private static final int buildNumber = 814;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 765;


Reply via email to