Author: toad
Date: 2006-05-24 18:56:42 +0000 (Wed, 24 May 2006)
New Revision: 8847

Modified:
   trunk/freenet/src/freenet/io/comm/Peer.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
736: Fix #370, hopefully.

Modified: trunk/freenet/src/freenet/io/comm/Peer.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Peer.java 2006-05-24 18:07:20 UTC (rev 
8846)
+++ trunk/freenet/src/freenet/io/comm/Peer.java 2006-05-24 18:56:42 UTC (rev 
8847)
@@ -165,4 +165,8 @@
                addr.writeToDataOutputStream(dos);
                dos.writeInt(_port);
        }
+
+       public FreenetInetAddress getFreenetAddress() {
+               return addr;
+       }
 }
\ No newline at end of file

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-05-24 
18:07:20 UTC (rev 8846)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-05-24 
18:56:42 UTC (rev 8847)
@@ -1287,16 +1287,14 @@
         Logger.minor(this, "Possibly sending handshake to "+pn);
         DiffieHellmanContext ctx;
         Peer[] handshakeIPs;
-        synchronized(pn) {
-            if(!pn.shouldSendHandshake()) return;
-            handshakeIPs = pn.getHandshakeIPs();
-            if(handshakeIPs.length == 0) {
-                pn.couldNotSendHandshake();
-                return;
-            } else {
-                ctx = DiffieHellman.generateContext();
-                pn.setDHContext(ctx);
-            }
+        if(!pn.shouldSendHandshake()) return;
+        handshakeIPs = pn.getHandshakeIPs();
+        if(handshakeIPs.length == 0) {
+            pn.couldNotSendHandshake();
+            return;
+        } else {
+            ctx = DiffieHellman.generateContext();
+            pn.setDHContext(ctx);
         }
         int sentCount = 0;
         for(int i=0;i<handshakeIPs.length;i++){

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-05-24 18:07:20 UTC (rev 
8846)
+++ trunk/freenet/src/freenet/node/Node.java    2006-05-24 18:56:42 UTC (rev 
8847)
@@ -559,6 +559,7 @@

     // Helpers
        public final InetAddress localhostAddress;
+       public final FreenetInetAddress fLocalhostAddress;

        private boolean wasTestnet;

@@ -844,6 +845,7 @@
                        // Does not do a reverse lookup, so this is impossible
                        throw new Error(e3);
                }
+               fLocalhostAddress = new FreenetInetAddress(localhostAddress);
         ipDetector = new IPAddressDetector(10*1000, this);
         requestSenders = new HashMap();
         transferringRequestSenders = new HashMap();

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-05-24 18:07:20 UTC 
(rev 8846)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-05-24 18:56:42 UTC 
(rev 8847)
@@ -448,13 +448,20 @@
     public Peer[] getHandshakeIPs(){
        Peer[] p=null;

-       if(detectedPeer == null && nominalPeer.size() == 0) return new Peer[0];
-
-       InetAddress peerIP = detectedPeer.getHandshakeAddress();
-
-       if(peerIP == null && nominalPeer.size() == 0) return new Peer[0];
+       Peer[] myNominalPeer;

-       if( peerIP != null && ! nominalPeer.contains(detectedPeer)){
+       // Don't synchronize while doing lookups which may take a long time!
+       synchronized(this) {
+               myNominalPeer = (Peer[]) nominalPeer.toArray(new 
Peer[nominalPeer.size()]);
+               
+               if(myNominalPeer.length == 0) {
+                       if(detectedPeer == null) return new Peer[0];
+                       return new Peer[] { detectedPeer };
+               }
+               
+       }
+       
+       if( detectedPeer != null && ! nominalPeer.contains(detectedPeer)){
                p= new Peer[1+nominalPeer.size()];
                p[0]=detectedPeer;
                for(int i=1;i<nominalPeer.size()+1;i++)
@@ -462,16 +469,22 @@
        }else{
                p = (Peer[]) nominalPeer.toArray(new Peer[nominalPeer.size()]); 
                
        }
+       
        // Hack for two nodes on the same IP that can't talk over inet for 
routing reasons
-       InetAddress localhost = node.localhostAddress;
+       FreenetInetAddress localhost = node.fLocalhostAddress;
        FreenetInetAddress nodeAddr = node.getPrimaryIPAddress();
-       InetAddress nodeIP = nodeAddr == null ? null : nodeAddr.getAddress();
-       if(nodeIP != null && nodeIP.equals(localhost)) return p;
-       if(peerIP != null && peerIP.equals(localhost)) return p;
-       if(nodeIP != null && nodeIP.equals(peerIP)) {
+       
+       Peer extra = null;
+       for(int i=0;i<p.length;i++) {
+               FreenetInetAddress a = p[i].getFreenetAddress();
+               if(a.equals(nodeAddr)) {
+                       extra = new Peer(localhost, p[i].getPort());
+               }
+       }
+       if(extra != null) {
                Peer[] newPeers = new Peer[p.length+1];
                System.arraycopy(p, 0, newPeers, 0, p.length);
-               newPeers[newPeers.length-1] = new Peer(node.localhostAddress, 
detectedPeer.getPort());
+               newPeers[p.length] = extra;
                p = newPeers;
        }
        return p;

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-05-24 18:07:20 UTC (rev 
8846)
+++ trunk/freenet/src/freenet/node/Version.java 2006-05-24 18:56:42 UTC (rev 
8847)
@@ -18,7 +18,7 @@
        public static final String protocolVersion = "1.0";

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

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


Reply via email to