Author: toad
Date: 2008-02-14 17:25:23 +0000 (Thu, 14 Feb 2008)
New Revision: 17896
Modified:
trunk/freenet/src/freenet/io/comm/DMT.java
trunk/freenet/src/freenet/io/comm/Message.java
trunk/freenet/src/freenet/io/comm/MessageType.java
trunk/freenet/src/freenet/node/NetworkIDManager.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/NodeDispatcher.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
Log:
Include node identity as well as location in routed pings.
Use this information to find the node if we are near it, even though it may
have swapped.
Modified: trunk/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-14 16:22:20 UTC (rev
17895)
+++ trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-14 17:25:23 UTC (rev
17896)
@@ -129,6 +129,7 @@
public static final String OFFER_AUTHENTICATOR = "offerAuthenticator";
public static final String DAWN_HTL = "dawnHtl";
public static final String SECRET = "secret";
+ public static final String NODE_IDENTITY = "nodeIdentity";
/** Very urgent */
public static final short PRIORITY_NOW=-2;
@@ -1156,11 +1157,12 @@
public static final MessageType FNPRoutedPing = new
MessageType("FNPRoutedPing", PRIORITY_LOW) {{
addRoutedToNodeMessageFields();
addField(COUNTER, Integer.class);
+
}};
- public static final Message createFNPRoutedPing(long uid, double
targetLocation, short htl, int counter) {
+ public static final Message createFNPRoutedPing(long uid, double
targetLocation, short htl, int counter, byte[] nodeIdentity) {
Message msg = new Message(FNPRoutedPing);
- msg.setRoutedToNodeFields(uid, targetLocation, htl);
+ msg.setRoutedToNodeFields(uid, targetLocation, htl,
nodeIdentity);
msg.set(COUNTER, counter);
return msg;
}
@@ -1184,9 +1186,9 @@
}};
- public static final Message createFNPSecretPing(long uid, double
targetLocation, short htl, short dawnHtl, int counter) {
+ public static final Message createFNPSecretPing(long uid, double
targetLocation, short htl, short dawnHtl, int counter, byte[] nodeIdentity) {
Message msg = new Message(FNPSecretPing);
- msg.setRoutedToNodeFields(uid, targetLocation, htl);
+ msg.setRoutedToNodeFields(uid, targetLocation, htl,
nodeIdentity);
msg.set(COUNTER, counter);
msg.set(DAWN_HTL, dawnHtl);
return msg;
Modified: trunk/freenet/src/freenet/io/comm/Message.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Message.java 2008-02-14 16:22:20 UTC
(rev 17895)
+++ trunk/freenet/src/freenet/io/comm/Message.java 2008-02-14 17:25:23 UTC
(rev 17896)
@@ -26,6 +26,7 @@
import freenet.support.Fields;
import freenet.support.Logger;
import freenet.support.Serializer;
+import freenet.support.ShortBuffer;
/**
* A Message which can be read from and written to a DatagramPacket
@@ -284,11 +285,13 @@
/**
* Set fields for a routed-to-a-specific-node message.
+ * @param nodeIdentity
*/
- public void setRoutedToNodeFields(long uid, double targetLocation, short
htl) {
+ public void setRoutedToNodeFields(long uid, double targetLocation, short
htl, byte[] nodeIdentity) {
set(DMT.UID, uid);
set(DMT.TARGET_LOCATION, targetLocation);
set(DMT.HTL, htl);
+ set(DMT.NODE_IDENTITY, new ShortBuffer(nodeIdentity));
}
public int receivedByteCount() {
Modified: trunk/freenet/src/freenet/io/comm/MessageType.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/MessageType.java 2008-02-14 16:22:20 UTC
(rev 17895)
+++ trunk/freenet/src/freenet/io/comm/MessageType.java 2008-02-14 17:25:23 UTC
(rev 17896)
@@ -22,6 +22,7 @@
import java.util.*;
import freenet.support.Logger;
+import freenet.support.ShortBuffer;
public class MessageType {
@@ -73,6 +74,7 @@
addField(DMT.UID, Long.class);
addField(DMT.TARGET_LOCATION, Double.class);
addField(DMT.HTL, Short.class);
+ addField(DMT.NODE_IDENTITY, ShortBuffer.class);
}
public boolean checkType(String fieldName, Object fieldValue) {
Modified: trunk/freenet/src/freenet/node/NetworkIDManager.java
===================================================================
--- trunk/freenet/src/freenet/node/NetworkIDManager.java 2008-02-14
16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/NetworkIDManager.java 2008-02-14
17:25:23 UTC (rev 17896)
@@ -16,6 +16,7 @@
import freenet.io.comm.NotConnectedException;
import freenet.support.Logger;
+import freenet.support.ShortBuffer;
import freenet.support.math.BootstrappingDecayingRunningAverage;
import freenet.support.math.RunningAverage;
import freenet.support.math.TrivialRunningAverage;
@@ -131,6 +132,7 @@
if (logMINOR) Logger.minor(this, "recently
complete/loop: "+uid);
source.sendAsync(DMT.createFNPRejectedLoop(uid), null,
0, null);
} else {
+ byte[] nodeIdentity = ((ShortBuffer)
m.getObject(DMT.NODE_IDENTITY)).getData();
StoredSecret match;
//Yes, I know... it looks really weird sync.ing on a
separate map...
synchronized (secretsByPeer) {
@@ -183,7 +185,7 @@
counter++;
routedTo.add(next);
try {
-
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter),
null, 0, null);
+
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter,
nodeIdentity), null, 0, null);
} catch (NotConnectedException e) {
Logger.normal(this, next+"
disconnected before secret-ping-forward");
continue;
@@ -510,7 +512,7 @@
}
//next... send a secretping through next to target
- next.sendSync(DMT.createFNPSecretPing(uid,
target.getLocation(), htl, dawn, 0), null);
+ next.sendSync(DMT.createFNPSecretPing(uid,
target.getLocation(), htl, dawn, 0, target.identity), null);
//wait for a response; SecretPong, RejectLoop, or
timeout
MessageFilter mfPong =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(SECRETPONG_TIMEOUT).setType(DMT.FNPSecretPong);
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2008-02-14 16:22:20 UTC (rev
17895)
+++ trunk/freenet/src/freenet/node/Node.java 2008-02-14 17:25:23 UTC (rev
17896)
@@ -355,7 +355,7 @@
* topology can be reconstructed. */
public long swapIdentifier;
private String myName;
- final LocationManager lm;
+ public final LocationManager lm;
/** My peers */
public final PeerManager peers;
/** Directory to put node, peers, etc into */
@@ -1852,10 +1852,10 @@
* @return The number of hops it took to find the node, if it was found.
* Otherwise -1.
*/
- public int routedPing(double loc2) {
+ public int routedPing(double loc2, byte[] nodeIdentity) {
long uid = random.nextLong();
int initialX = random.nextInt();
- Message m = DMT.createFNPRoutedPing(uid, loc2, maxHTL,
initialX);
+ Message m = DMT.createFNPRoutedPing(uid, loc2, maxHTL,
initialX, nodeIdentity);
Logger.normal(this, "Message: "+m);
dispatcher.handleRouted(m, null);
Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java 2008-02-14 16:22:20 UTC
(rev 17895)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java 2008-02-14 17:25:23 UTC
(rev 17896)
@@ -465,14 +465,16 @@
final HashSet notIgnored;
Message msg;
short lastHtl;
+ final byte[] identity;
- RoutedContext(Message msg, PeerNode source) {
+ RoutedContext(Message msg, PeerNode source, byte[] identity) {
createdTime = accessTime = System.currentTimeMillis();
this.source = source;
routedTo = new HashSet();
notIgnored = new HashSet();
this.msg = msg;
lastHtl = msg.getShort(DMT.HTL);
+ this.identity = identity;
}
void addSent(PeerNode n) {
@@ -527,7 +529,7 @@
}
} else {
// Try routing to the next node
- forward(rc.msg, id, rc.source, htl,
rc.msg.getDouble(DMT.TARGET_LOCATION), rc);
+ forward(rc.msg, id, rc.source, htl,
rc.msg.getDouble(DMT.TARGET_LOCATION), rc, rc.identity);
}
return true;
}
@@ -546,6 +548,7 @@
long id = m.getLong(DMT.UID);
Long lid = new Long(id);
short htl = m.getShort(DMT.HTL);
+ byte[] identity = ((ShortBuffer)
m.getObject(DMT.NODE_IDENTITY)).getData();
if(source != null) htl = source.decrementHTL(htl);
RoutedContext ctx;
ctx = (RoutedContext)routedContexts.get(lid);
@@ -557,7 +560,7 @@
}
return true;
}
- ctx = new RoutedContext(m, source);
+ ctx = new RoutedContext(m, source, identity);
synchronized (routedContexts) {
routedContexts.put(lid, ctx);
}
@@ -579,7 +582,7 @@
}
return true;
} else {
- return forward(m, id, source, htl, target, ctx);
+ return forward(m, id, source, htl, target, ctx,
identity);
}
}
@@ -602,12 +605,18 @@
return true;
}
- private boolean forward(Message m, long id, PeerNode pn, short htl,
double target, RoutedContext ctx) {
+ private boolean forward(Message m, long id, PeerNode pn, short htl,
double target, RoutedContext ctx, byte[] targetIdentity) {
if(logMINOR) Logger.minor(this, "Should forward");
// Forward
m = preForward(m, htl);
while(true) {
- PeerNode next = node.peers.closerPeer(pn, ctx.routedTo,
ctx.notIgnored, target, true, node.isAdvancedModeEnabled(), -1, null, null);
+ PeerNode next =
node.peers.getByIdentity(targetIdentity);
+ if(next != null && !next.isConnected()) {
+ Logger.error(this, "Found target but
disconnected!: "+next);
+ next = null;
+ }
+ if(next == null)
+ next = node.peers.closerPeer(pn, ctx.routedTo,
ctx.notIgnored, target, true, node.isAdvancedModeEnabled(), -1, null, null);
if(logMINOR) Logger.minor(this, "Next: "+next+"
message: "+m);
if(next != null) {
// next is connected, or at least has been =>
next.getPeer() CANNOT be null.
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2008-02-14 16:22:20 UTC
(rev 17895)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2008-02-14 17:25:23 UTC
(rev 17896)
@@ -1636,4 +1636,13 @@
}
return count;
}
+
+ public PeerNode getByIdentity(byte[] identity) {
+ PeerNode[] peers = myPeers;
+ for(int i=0;i<peers.length;i++) {
+ if(Arrays.equals(peers[i].getIdentity(), identity))
+ return peers[i];
+ }
+ return null;
+ }
}
Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
2008-02-14 16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
2008-02-14 17:25:23 UTC (rev 17896)
@@ -112,6 +112,15 @@
System.err.println("Swaps failed:" +LocationManager.noSwaps);
System.err.println("Swaps succeeded:" +LocationManager.swaps);
+ double totalSwapInterval = 0.0;
+ double totalSwapTime = 0.0;
+ for(int i=0;i<nodes.length;i++) {
+ totalSwapInterval += nodes[i].lm.getSendSwapInterval();
+ totalSwapTime += nodes[i].lm.getAverageSwapTime();
+ }
+ System.err.println("Average swap time: "+(totalSwapTime /
nodes.length));
+ System.err.println("Average swap sender interval:
"+(totalSwapInterval / nodes.length));
+
waitForAllConnected(nodes);
lastSwaps = newSwaps;
@@ -128,7 +137,7 @@
randomNode2 = nodes[random.nextInt(nodes.length)];
double loc2 = randomNode2.getLocation();
Logger.normal(RealNodeRoutingTest.class, "Pinging
"+randomNode2.getDarknetPortNumber()+" @ "+loc2+" from
"+randomNode.getDarknetPortNumber()+" @ "+randomNode.getLocation());
- int hopsTaken = randomNode.routedPing(loc2);
+ int hopsTaken = randomNode.routedPing(loc2,
randomNode2.getDarknetIdentity());
pings++;
if(hopsTaken < 0) {
failures++;
Modified: trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
2008-02-14 16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
2008-02-14 17:25:23 UTC (rev 17896)
@@ -119,7 +119,7 @@
}
//Send the request for the secret through the
'pathway' node.
- pathway.sendSync(DMT.createFNPSecretPing(uid,
verify.getLocation(), PING_HTL, DAWN_HTL, 0), null);
+ pathway.sendSync(DMT.createFNPSecretPing(uid,
verify.getLocation(), PING_HTL, DAWN_HTL, 0, verify.getIdentity()), null);
long result=getSecretPingResponse(source,
pathway, uid);
if (result!=secret) {