Author: toad
Date: 2006-07-29 20:20:37 +0000 (Sat, 29 Jul 2006)
New Revision: 9816
Modified:
trunk/freenet/src/freenet/io/comm/Message.java
trunk/freenet/src/freenet/node/CHKInsertSender.java
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/InsertHandler.java
trunk/freenet/src/freenet/node/MessageItem.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/NodePinger.java
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/RequestHandler.java
trunk/freenet/src/freenet/node/SSKInsertSender.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/transport/IPAddressDetector.java
Log:
915:
Reduce maximum sleep time on PacketSender to 100ms, same as max coalescing
delay. Only wake up PacketSender in sendAsync() if we need to.
SSKInsertSender fix - don't move on to the next node after getting a collision.
Message.encodeToPacket doesn't need a LowLevelFilter argument.
Up search timeout on inserts to 2 minutes.
Keep going on inserts when get a timeout before Accepted.
True multi-homing support.
Clear the last detected IP address when the use-local flag is enabled.
Logging.
Comments.
Modified: trunk/freenet/src/freenet/io/comm/Message.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Message.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/io/comm/Message.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -155,7 +155,7 @@
_payload.put(key, value);
}
- public byte[] encodeToPacket(LowLevelFilter f, PeerContext destination)
{
+ public byte[] encodeToPacket(PeerContext destination) {
// if (this.getSpec() != MessageTypes.ping && this.getSpec() !=
MessageTypes.pong)
// Logger.logMinor("<<<<< Send message : " + this);
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -138,7 +138,7 @@
// Constants
static final int ACCEPTED_TIMEOUT = 10000;
- static final int SEARCH_TIMEOUT = 60000;
+ static final int SEARCH_TIMEOUT = 120000;
static final int TRANSFER_COMPLETION_TIMEOUT = 120000;
// Basics
@@ -310,8 +310,9 @@
// Try to propagate back to source
Logger.minor(this, "Timeout");
next.localRejectedOverload("Timeout3");
- finish(TIMED_OUT, next);
- return;
+ // Try another node.
+ forwardRejectedOverload();
+ break;
}
if (msg.getSpec() == DMT.FNPRejectedOverload) {
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-07-29
19:38:47 UTC (rev 9815)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-07-29
20:20:37 UTC (rev 9816)
@@ -821,7 +821,7 @@
mi_name = (mi.msg == null ? "(not a Message)" :
mi.msg.getSpec().getName());
if(mi.formatted) {
try {
- byte[] buf = mi.getData(this, pn);
+ byte[] buf = mi.getData(pn);
KeyTracker kt = pn.getCurrentKeyTracker();
if(kt == null) {
Logger.minor(this, "kt = null");
@@ -866,7 +866,7 @@
return;
}
} else {
- byte[] data = mi.getData(this, pn);
+ byte[] data = mi.getData(pn);
messageData[x] = data;
newMsgs[x] = mi;
alreadyReported[x] = mi.alreadyReportedBytes;
@@ -1104,7 +1104,7 @@
}
public byte[] preformat(Message msg, PeerNode pn) {
- byte[] buf = msg.encodeToPacket(this, pn);
+ byte[] buf = msg.encodeToPacket(pn);
return preformat(buf, 0, buf.length);
}
Modified: trunk/freenet/src/freenet/node/InsertHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertHandler.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/InsertHandler.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -335,6 +335,9 @@
}
}
+ /**
+ * Verify data, or send DataInsertRejected.
+ */
private void maybeCommit() {
Message toSend = null;
Modified: trunk/freenet/src/freenet/node/MessageItem.java
===================================================================
--- trunk/freenet/src/freenet/node/MessageItem.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/MessageItem.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -39,9 +39,9 @@
/**
* Return the data contents of this MessageItem.
*/
- public byte[] getData(FNPPacketMangler mangler, PeerNode pn) {
+ public byte[] getData(PeerNode pn) {
if(buf == null)
- buf = msg.encodeToPacket(mangler, pn);
+ buf = msg.encodeToPacket(pn);
return buf;
}
}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-07-29 19:38:47 UTC (rev
9815)
+++ trunk/freenet/src/freenet/node/Node.java 2006-07-29 20:20:37 UTC (rev
9816)
@@ -51,7 +51,6 @@
import freenet.clients.http.SimpleToadletServer;
import freenet.config.BooleanCallback;
import freenet.config.Config;
-import freenet.config.FilePersistentConfig;
import freenet.config.IntCallback;
import freenet.config.InvalidConfigValueException;
import freenet.config.LongCallback;
@@ -60,10 +59,8 @@
import freenet.crypt.DSAGroup;
import freenet.crypt.DSAPrivateKey;
import freenet.crypt.DSAPublicKey;
-import freenet.crypt.DiffieHellman;
import freenet.crypt.Global;
import freenet.crypt.RandomSource;
-import freenet.crypt.Yarrow;
import freenet.io.comm.DMT;
import freenet.io.comm.DisconnectedException;
import freenet.io.comm.FreenetInetAddress;
@@ -406,6 +403,10 @@
roundTripTime.report(Math.max(rtt, 10));
Logger.minor(this, "Reported successful completion:
"+rtt+" on "+this+" avg "+roundTripTime.currentValue());
}
+
+ public String toString() {
+ return "rtt: "+roundTripTime.currentValue()+"
_s="+throttleWindow.currentValue();
+ }
}
/** Config object for the whole node. */
@@ -1112,6 +1113,8 @@
public void set(boolean val) throws
InvalidConfigValueException {
includeLocalAddressesInNoderefs = val;
+ lastIPAddress = null;
+ ipDetector.clearCached();
}
});
@@ -2423,11 +2426,12 @@
// If the IP is overridden, the override has to be the
first element.
addresses.add(new Peer(overrideIPAddress, portNumber));
}
- InetAddress detectedAddr = ipDetector.getAddress();
- if(detectedAddr != null) {
- Peer a = new Peer(new FreenetInetAddress(detectedAddr),
portNumber);
- if(!addresses.contains(a))
- addresses.add(a);
+ InetAddress[] detectedAddrs = ipDetector.getAddress();
+ if(detectedAddrs != null) {
+ for(int i=0;i<detectedAddrs.length;i++) {
+ Peer p = new Peer(detectedAddrs[i], portNumber);
+ if(!addresses.contains(p)) addresses.add(p);
+ }
}
if((pluginDetectedIPs != null) && (pluginDetectedIPs.length >
0)) {
for(int i=0;i<pluginDetectedIPs.length;i++) {
@@ -2438,7 +2442,7 @@
addresses.add(a);
}
}
- if((detectedAddr == null) && (oldIPAddress != null) &&
!oldIPAddress.equals(overrideIPAddress))
+ if((detectedAddrs == null) && (oldIPAddress != null) &&
!oldIPAddress.equals(overrideIPAddress))
addresses.add(new Peer(oldIPAddress, portNumber));
// Try to pick it up from our connections
if(peers != null) {
@@ -2481,7 +2485,7 @@
}
}
if(best != null) {
- if((bestPopularity > 2) ||
(detectedAddr == null)) {
+ if((bestPopularity > 2) ||
(detectedAddrs == null)) {
if(!addresses.contains(best))
addresses.add(best);
if((secondBest != null) &&
(secondBestPopularity > 2)) {
Modified: trunk/freenet/src/freenet/node/NodePinger.java
===================================================================
--- trunk/freenet/src/freenet/node/NodePinger.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/NodePinger.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -15,14 +15,13 @@
private TimeDecayingRunningAverage tdra;
NodePinger(Node n) {
- Logger.normal(this, "Starting NodePinger");
- System.out.println("Starting NodePinger");
this.node = n;
this.tdra = new TimeDecayingRunningAverage(0.0, 30*1000, // 30
seconds
0.0, Double.MAX_VALUE);
}
void start() {
+ Logger.normal(this, "Starting NodePinger");
Thread t = new Thread(this, "Node pinger");
t.setDaemon(true);
t.start();
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -227,7 +227,7 @@
int sz = 56; // overhead; FIXME should be a constant or
something
for(int j=0;j<messages.length;j++) {
if(l > messages[j].submitted) l =
messages[j].submitted;
- sz += 2 + /* FIXME only 2? */
messages[j].getData(node.packetMangler, pn).length;
+ sz += 2 + /* FIXME only 2? */
messages[j].getData(pn).length;
}
if((l + 100 > now) && (sz < 1024 /* sensible size */)) {
// Don't send immediately
@@ -324,8 +324,8 @@
}
long sleepTime = nextActionTime - now;
- // 200ms maximum sleep time
- sleepTime = Math.min(sleepTime, 200);
+ // 100ms maximum sleep time - same as the maximum coalescing delay
+ sleepTime = Math.min(sleepTime, 100);
if(now - node.startupTime > 60*1000*5) {
if(now - lastReceivedPacketFromAnyNode > Node.ALARM_TIME) {
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -12,6 +12,7 @@
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;
import java.util.zip.DataFormatException;
@@ -772,14 +773,28 @@
Logger.minor(this, "Sending async: "+msg+" : "+cb+" on "+this);
if(!isConnected()) throw new NotConnectedException();
MessageItem item = new MessageItem(msg, cb == null ? null : new
AsyncMessageCallback[] {cb}, alreadyReportedBytes, ctr);
+ item.getData(this);
long now = System.currentTimeMillis();
reportBackoffStatus(now);
+ int x = 0;
synchronized(messagesToSendNow) {
messagesToSendNow.addLast(item);
+ Iterator i = messagesToSendNow.iterator();
+ for(;i.hasNext();) {
+ MessageItem it = (MessageItem) (i.next());
+ x += it.getData(this).length + 2;
+ if(x > 1024) break;
+ }
}
- synchronized(node.ps) {
- node.ps.notifyAll();
+ if(x > 1024) {
+ // If there is a packet's worth to send, wake up the
packetsender.
+ synchronized(node.ps) {
+ node.ps.notifyAll();
+ }
}
+ // We DO NOT NEED to wake up the PacketSender
+ // It will wake up before the maximum coalescing delay (100ms) because
+ // it wakes up every 100ms *anyway*.
}
/**
Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/RequestHandler.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -42,7 +42,6 @@
source = (PeerNode) req.getSource();
closestLoc = req.getDouble(DMT.NEAREST_LOCATION);
double myLoc = n.lm.getLocation().getValue();
- // FIXME should be more generic when implement SSKs
key = (Key) req.getObject(DMT.FREENET_ROUTING_KEY);
double keyLoc = key.toNormalizedDouble();
if(PeerManager.distance(keyLoc, myLoc) < PeerManager.distance(keyLoc,
closestLoc)) {
Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-07-29 19:38:47 UTC
(rev 9815)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-07-29 20:20:37 UTC
(rev 9816)
@@ -199,8 +199,8 @@
// Try to propagate back to source
Logger.minor(this, "Timeout");
next.localRejectedOverload("Timeout");
- finish(TIMED_OUT, next);
- return;
+ forwardRejectedOverload();
+ break;
}
if (msg.getSpec() == DMT.FNPRejectedOverload) {
@@ -262,12 +262,12 @@
}
if(newAck == null) {
- // Terminal overload
// Try to propagate back to source
Logger.minor(this, "Timeout");
next.localRejectedOverload("Timeout2");
- finish(TIMED_OUT, next);
- return;
+ forwardRejectedOverload();
+ // Try another peer
+ break;
}
}
@@ -406,7 +406,7 @@
hasCollided = true;
notifyAll();
}
- break; // go to next node
+ continue;
}
if (msg.getSpec() != DMT.FNPInsertReply) {
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-07-29 19:38:47 UTC (rev
9815)
+++ trunk/freenet/src/freenet/node/Version.java 2006-07-29 20:20:37 UTC (rev
9816)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 914;
+ private static final int buildNumber = 915;
/** Oldest build of Fred we will talk to */
private static final int oldLastGoodBuild = 870;
Modified: trunk/freenet/src/freenet/transport/IPAddressDetector.java
===================================================================
--- trunk/freenet/src/freenet/transport/IPAddressDetector.java 2006-07-29
19:38:47 UTC (rev 9815)
+++ trunk/freenet/src/freenet/transport/IPAddressDetector.java 2006-07-29
20:20:37 UTC (rev 9816)
@@ -47,51 +47,28 @@
* Fetches the currently detected IP address. If not detected yet a
detection is forced
* @return Detected ip address
*/
- public InetAddress getAddress() {
- return getAddress(0, null);
+ public InetAddress[] getAddress() {
+ return getAddress(0);
}
/**
* Get the IP address
- * @param preferedAddress An address that for some reason is prefered
above others. Might be null
* @return Detected ip address
*/
- public InetAddress getAddress(long recheckTime, String preferedAddress)
{
- if ((lastInetAddress == null)
- || (System.currentTimeMillis() > (lastDetectedTime +
recheckTime)))
- checkpoint(preferedAddress);
- return lastInetAddress;
+ public InetAddress[] getAddress(long recheckTime) {
+ if(System.currentTimeMillis() > (lastDetectedTime + recheckTime)
+ || lastAddressList == null)
+ checkpoint();
+ return lastAddressList;
}
- /**
- * Get the IP address
- * @return Detected ip address
- */
- public InetAddress getAddress(long recheckTime) {
- return getAddress(recheckTime, null);
- }
-
- public void checkpoint() {
- checkpoint((InetAddress)null);
- }
-
boolean old = false;
- protected synchronized void checkpoint(String preferredAddress) {
- InetAddress preferredInetAddress = null;
- try {
- preferredInetAddress =
InetAddress.getByName(preferredAddress);
- //It there was something preferred then convert it to a
proper class
- } catch (UnknownHostException e) {
- }
- checkpoint(preferredInetAddress);
- }
-
/**
* Execute a checkpoint - detect our internet IP address and log it
* @param preferedAddress An address that for some reason is prefered
above others. Might be null
*/
- protected synchronized void checkpoint(InetAddress preferedInetAddress)
{
+ protected synchronized void checkpoint() {
boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
Vector addrs = new Vector();
@@ -142,14 +119,8 @@
"Finished scanning interfaces");
}
- if ((preferedInetAddress == null)
- && (lastInetAddress != null)
- ? isInternetAddress(lastInetAddress)
- : true) //If no specific other address is
preferred then we prefer to keep our old address
- preferedInetAddress = lastInetAddress;
-
InetAddress oldAddress = lastInetAddress;
- onGetAddresses(addrs, preferedInetAddress);
+ onGetAddresses(addrs);
lastDetectedTime = System.currentTimeMillis();
if ((oldAddress != null) && (lastInetAddress != null) &&
!lastInetAddress.equals(oldAddress)) {
@@ -199,16 +170,16 @@
* @param v Vector of InetAddresses
* @param preferedInetAddress An address that for some reason is
prefered above others. Might be null
*/
- protected void onGetAddresses(Vector v, InetAddress
preferedInetAddress) {
+ protected void onGetAddresses(Vector v) {
+ Vector output = new Vector();
boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
if (logDEBUG)
Logger.debug(
this,
"onGetAddresses found " + v.size() + "
potential addresses)");
- InetAddress addrDetected = null;
if (v.size() == 0) {
Logger.error(this, "No addresses found!");
- addrDetected = null;
+ lastAddressList = null;
} else {
// InetAddress lastNonValidAddress = null;
for (int x = 0; x < v.size(); x++) {
@@ -218,39 +189,22 @@
Logger.debug(
this,
"Address " + x + ": " +
i);
- if (isInternetAddress(i)) {
- //Do not even consider this
address if it isn't globally addressable
- if (logDEBUG)
- Logger.debug(
- this,
- "Setting
default address to "
- +
i.getHostAddress());
-
- addrDetected = i;
- //Use the last detected valid
IP as 'detected' IP
- if ((preferedInetAddress !=
null)
- && addrDetected.equals(
-
preferedInetAddress)) { //Prefer the specified address if it is still available
to us. Do not look for more ones
- if (logDEBUG)
- Logger.debug(
- this,
-
"Detected address is the preferred address, setting final address to "
-
+ lastInetAddress.getHostAddress());
- lastInetAddress =
addrDetected;
- return;
+ if(i.isAnyLocalAddress()) {
+ // Wildcard address, 0.0.0.0,
ignore.
+ } else if(i.isLinkLocalAddress() ||
i.isLoopbackAddress() ||
+ i.isSiteLocalAddress())
{
+
if(node.includeLocalAddressesInNoderefs) {
+ output.add(i);
}
-
- }// else
-// lastNonValidAddress = i;
+ } else if(i.isMulticastAddress()) {
+ // Ignore
+ } else {
+ output.add(i);
+ }
}
}
- //If we are here we didn't manage to find a valid
globally addressable IP. Do the best of the situation, return the last valid
non-addressable IP
- //This address will be used by the node if the user has
configured localIsOK.
-// if (lastInetAddress == null || (!detectedInetAddress))
-// lastInetAddress = lastNonValidAddress;
}
- lastInetAddress = addrDetected;
- // FIXME: add support for multihoming
+ lastAddressList = (InetAddress[]) output.toArray(new
InetAddress[output.size()]);
}
protected boolean isInternetAddress(InetAddress addr) {
@@ -271,4 +225,9 @@
}
}
}
+
+ public void clearCached() {
+ lastAddressList = null;
+ lastDetectedTime = -1;
+ }
}