Author: toad
Date: 2006-09-02 16:12:40 +0000 (Sat, 02 Sep 2006)
New Revision: 10357

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
959: Hopefully fix a number of bugs in PeerNode
- Fix the NPEs in 958
- Hopefully fix all the trying-to-send-a-packet-while-unverified bugs (as they 
now turn out to be)
- Prevent some minor race conditions

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-09-02 15:58:34 UTC 
(rev 10356)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-09-02 16:12:40 UTC 
(rev 10357)
@@ -796,10 +796,11 @@
                        return false;
        }
     }
+    
     public boolean isConnected(){
        long now = System.currentTimeMillis();
        synchronized(this) {
-               if( isConnected && currentTracker != null ) {
+               if( isConnected && currentTracker != null && 
!currentTracker.isDeprecated() ) {
                        timeLastConnected = now;
                        return true;
                }
@@ -1011,7 +1012,7 @@

     boolean firstHandshake = true;

-    private void calcNextHandshake(boolean successfulHandshakeSend) {
+    private void calcNextHandshake(boolean successfulHandshakeSend, boolean 
dontFetchARK) {
         long now = System.currentTimeMillis();
         boolean fetchARKFlag = false;
         synchronized(this) {
@@ -1057,7 +1058,7 @@
         }
                setPeerNodeStatus(now);  // Because of isBursting being set 
above and it can't hurt others
         // Don't fetch ARKs for peers we have verified (through handshake) to 
be incompatible with us
-        if(fetchARKFlag) {
+        if(fetchARKFlag && !dontFetchARK) {
                        long arkFetcherStartTime1 = System.currentTimeMillis();
                        startARKFetcher();
                        long arkFetcherStartTime2 = System.currentTimeMillis();
@@ -1073,7 +1074,7 @@
      */
     public void sentHandshake() {
        if(logMINOR) Logger.minor(this, "sentHandshake(): "+this);
-        calcNextHandshake(true);
+        calcNextHandshake(true, false);
     }

     /**
@@ -1082,7 +1083,7 @@
      */
     public void couldNotSendHandshake() {
        if(logMINOR) Logger.minor(this, "couldNotSendHandshake(): "+this);
-        calcNextHandshake(false);
+        calcNextHandshake(false, false);
     }

     /**
@@ -1243,7 +1244,7 @@
      */
        void receivedPacket(boolean dontLog) throws NotConnectedException {
                synchronized(this) {
-                       if(!isConnected() && !dontLog) {
+                       if((!isConnected) && (!dontLog)) {
                                if((unverifiedTracker == null) && 
(currentTracker == null)) {
                                        Logger.error(this, "Received packet 
while disconnected!: "+this, new Exception("error"));
                                        throw new NotConnectedException();
@@ -1291,12 +1292,9 @@
        logMINOR = Logger.shouldLog(Logger.MINOR, this);
        long now = System.currentTimeMillis();

-       synchronized(this) {
-               completedHandshake = true;
-               handshakeCount = 0;
-               bogusNoderef = false;
-                       isConnected = true;
-        }
+       // Update sendHandshakeTime; don't send another handshake for a while.
+       // If unverified, "a while" determines the timeout; if not, it's just 
good practice to avoid a race below.
+       calcNextHandshake(true, true); 
        stopARKFetcher();
                try {
                        // First, the new noderef
@@ -1308,6 +1306,8 @@
                                isConnected = false;
                        }
                        Logger.error(this, "Failed to parse new noderef for 
"+this+": "+e1, e1);
+                       node.peers.disconnected(this);
+                       return false;
                }
                boolean routable = true;
                boolean newer = false;
@@ -1330,48 +1330,35 @@
                } else {
                        older = false;
                }
+               KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
+               changedIP(replyTo);
+               boolean bootIDChanged = false;
+               KeyTracker oldPrev = null;
+               KeyTracker oldCur = null;
+               KeyTracker prev = null;
        synchronized(this) {
+               completedHandshake = true;
+               handshakeCount = 0;
+               bogusNoderef = false;
+                       isConnected = true;
                isRoutable = routable;
                verifiedIncompatibleNewerVersion = newer;
                verifiedIncompatibleOlderVersion = older;
-        }
-               KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
-               changedIP(replyTo);
-               boolean bootIDChanged = false;
-       synchronized(this) {
                        bootIDChanged = (thisBootID != this.bootID);
                        if(bootIDChanged && logMINOR)
                                Logger.minor(this, "Changed boot ID from 
"+bootID+" to "+thisBootID+" for "+getPeer());
                        this.bootID = thisBootID;
                        connectedTime = now;
-               }
-               if(bootIDChanged) {
-                       KeyTracker oldPrev = null;
-                       KeyTracker oldCur = null;
-                       synchronized(this) {
+                       if(bootIDChanged) {
                                oldPrev = previousTracker;
                                oldCur = currentTracker;
                                previousTracker = null;
                                currentTracker = null;
-                       }
-                       if(oldPrev != null) {
-                               oldPrev.completelyDeprecated(newTracker);
-                       }
-                       if(oldCur != null)
-                               oldCur.completelyDeprecated(newTracker);
-                       node.lm.lostOrRestartedNode(this);
-               } // else it's a rekey
-               
-               if(unverified) {
-                       synchronized(this) {
+                       } // else it's a rekey
+                       if(unverified) {
                                unverifiedTracker = newTracker;
                                ctx = null;
-                       }
-                       if(logMINOR) Logger.minor(this, "sentHandshake() being 
called for unverifiedTracker: "+getPeer());
-                       sentHandshake();
-               } else {
-                       KeyTracker prev;
-                       synchronized(this) {
+                       } else {
                                prev = currentTracker;
                                previousTracker = prev;
                                currentTracker = newTracker;
@@ -1380,29 +1367,32 @@
                                peerAddedTime = 0;  // don't store anymore
                                ctx = null;
                        }
-                       if(prev != null)
-                               prev.deprecated();
+                       sentInitialMessages = false;
                }
-               synchronized(this) {
-                       Logger.normal(this, "Completed handshake with "+this+" 
on "+replyTo+" - current: "+currentTracker+" old: "+previousTracker+" 
unverified: "+unverifiedTracker+" bootID: "+thisBootID+" getName(): 
"+getName());
-               }
+
+       if(bootIDChanged)
+                       node.lm.lostOrRestartedNode(this);
+               if(oldPrev != null) oldPrev.completelyDeprecated(newTracker);
+               if(oldCur != null) oldCur.completelyDeprecated(newTracker);
+               if(prev != null) prev.deprecated();
+               Logger.normal(this, "Completed handshake with "+this+" on 
"+replyTo+" - current: "+currentTracker+" old: "+previousTracker+" unverified: 
"+unverifiedTracker+" bootID: "+thisBootID+" getName(): "+getName());
+               
+               // Received a packet
                try {
                        receivedPacket(unverified);
                } catch (NotConnectedException e) {
                        Logger.error(this, "Disconnected in completedHandshake 
with "+this);
                        return true; // i suppose
                }
+               
        if(newer || older || !isConnected())
                node.peers.disconnected(this);
-       else 
+       else { 
                node.peers.addConnectedPeer(this);
+                       onConnect();
+       }
+       
                setPeerNodeStatus(now);
-               synchronized(this) {
-                       sentInitialMessages = false;
-               }
-               if(isConnected()) {
-                       onConnect();
-               }
                return true;
     }

@@ -2273,9 +2263,7 @@
        public void setPeerNodeStatus(long now) {
                long localRoutingBackedOffUntil = getRoutingBackedOffUntil();
                synchronized(this) {
-                       if(isConnected && this.currentTracker.isDeprecated()) {
-                               Logger.error(this, "Connected but primary 
tracker deprecated ?!?! on "+this+" : "+currentTracker, new Exception("debug"));
-                       }
+                       checkConnectionsAndTrackers();
                        int oldPeerNodeStatus = peerNodeStatus;
                        if(isRoutable()) {  // Function use also updates 
timeLastConnected and timeLastRoutable
                                peerNodeStatus = 
Node.PEER_NODE_STATUS_CONNECTED;
@@ -2322,6 +2310,31 @@
                }
        }

+       private synchronized void checkConnectionsAndTrackers() {
+               if(isConnected) {
+                       if(currentTracker == null) {
+                               if(unverifiedTracker != null) {
+                                       if(unverifiedTracker.isDeprecated())
+                                               Logger.error(this, "Connected 
but primary tracker is null and unverified is deprecated ! 
"+unverifiedTracker+" for "+this);
+                                       else
+                                               Logger.minor(this, "Connected 
but primary tracker is null, but unverified = "+unverifiedTracker+" for "+this);
+                               } else
+                                       Logger.error(this, "Connected but both 
primary and unverified are null on "+this);
+                       } else if(currentTracker.isDeprecated()) {
+                               if(unverifiedTracker != null) {
+                                       if(unverifiedTracker.isDeprecated()) {
+                                               Logger.error(this, "Connected 
but primary tracker is deprecated, unverified is deprecated: 
primary="+currentTracker+" unverified: "+unverifiedTracker+" for "+this);
+                                       } else
+                                               Logger.minor(this, "Connected, 
primary tracker deprecated, unverified is valid, "+unverifiedTracker+" for 
"+this);
+                               } else {
+                                       // !!!!!!!
+                                       Logger.error(this, "Connected but 
primary tracker and unverified tracker are null on "+this);
+                                       isConnected = false;
+                               }
+                       }
+               }
+       }
+
        public String getIdentityString() {
        return Base64.encode(identity);
     }

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-09-02 15:58:34 UTC (rev 
10356)
+++ trunk/freenet/src/freenet/node/Version.java 2006-09-02 16:12:40 UTC (rev 
10357)
@@ -21,7 +21,7 @@
        public static final String protocolVersion = "1.0";

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

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


Reply via email to