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;