Author: toad Date: 2006-04-12 18:20:25 +0000 (Wed, 12 Apr 2006) New Revision: 8530
Modified: trunk/freenet/src/freenet/io/comm/DMT.java trunk/freenet/src/freenet/io/xfer/PacketThrottle.java trunk/freenet/src/freenet/node/FNPPacketMangler.java trunk/freenet/src/freenet/node/NodeDispatcher.java trunk/freenet/src/freenet/node/PacketSender.java trunk/freenet/src/freenet/node/ThrottleWindowManager.java trunk/freenet/src/freenet/node/Version.java Log: 637: We were increasing the window size too fast - in fact exponentially with time - by incrementing it on every successful packet send. We should increase windowSize by b / windowSize instead. See ftp://ftp.ee.lbl.gov/papers/congavoid.ps.Z (Jacobson, 1988), page 6. This applies to both transfers and load limiting. Also send void's in keepalives to ensure we have a round trip time even when there's no traffic. Modified: trunk/freenet/src/freenet/io/comm/DMT.java =================================================================== --- trunk/freenet/src/freenet/io/comm/DMT.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/io/comm/DMT.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -918,7 +918,15 @@ msg.set(EXTERNAL_ADDRESS, peer); return msg; } + + public static final MessageType FNPVoid = new MessageType("FNPVoid") {{ + }}; + public static final Message createFNPVoid() { + Message msg = new Message(FNPVoid); + return msg; + } + public static void init() { } } Modified: trunk/freenet/src/freenet/io/xfer/PacketThrottle.java =================================================================== --- trunk/freenet/src/freenet/io/xfer/PacketThrottle.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/io/xfer/PacketThrottle.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -73,7 +73,7 @@ public synchronized void notifyOfPacketAcknowledged() { _totalPackets++; - _simulatedWindowSize += PACKET_TRANSMIT_INCREMENT; + _simulatedWindowSize += (PACKET_TRANSMIT_INCREMENT / _simulatedWindowSize); Logger.minor(this, "notifyOfPacketAcked(): "+this); } Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java =================================================================== --- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -777,7 +777,7 @@ /** * Build a packet and send it, from a whole bunch of messages. */ - public void processOutgoingOrRequeue(MessageItem[] messages, PeerNode pn, boolean neverWaitForPacketNumber) { + public void processOutgoingOrRequeue(MessageItem[] messages, PeerNode pn, boolean neverWaitForPacketNumber, boolean dontRequeue) { Logger.minor(this, "processOutgoingOrRequeue "+messages.length+" messages for "+pn+" ("+neverWaitForPacketNumber+")"); byte[][] messageData = new byte[messages.length][]; int length = 1; @@ -799,22 +799,26 @@ } catch (NotConnectedException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing"); // Requeue - pn.requeueMessageItems(messages, i, messages.length-i, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, i, messages.length-i, false); return; } catch (WouldBlockException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing"); // Requeue - pn.requeueMessageItems(messages, i, messages.length-i, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, i, messages.length-i, false); return; } catch (KeyChangedException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing"); // Requeue - pn.requeueMessageItems(messages, i, messages.length-i, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, i, messages.length-i, false); return; } catch (Throwable e) { Logger.error(this, "Caught "+e+" while sending messages, requeueing", e); // Requeue - pn.requeueMessageItems(messages, i, messages.length-i, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, i, messages.length-i, false); return; } @@ -849,17 +853,20 @@ } catch (NotConnectedException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing"); // Requeue - pn.requeueMessageItems(messages, 0, messages.length, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, 0, messages.length, false); return; } catch (WouldBlockException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing"); // Requeue - pn.requeueMessageItems(messages, 0, messages.length, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, 0, messages.length, false); return; } catch (Throwable e) { Logger.error(this, "Caught "+e+" while sending messages, requeueing", e); // Requeue - pn.requeueMessageItems(messages, 0, messages.length, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, 0, messages.length, false); return; } @@ -886,17 +893,20 @@ } catch (NotConnectedException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing remaining messages"); // Requeue - pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); return; } catch (WouldBlockException e) { Logger.normal(this, "Caught "+e+" while sending messages, requeueing remaining messages"); // Requeue - pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); return; } catch (Throwable e) { Logger.error(this, "Caught "+e+" while sending messages, requeueing remaining messages", e); // Requeue - pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); + if(!dontRequeue) + pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false); return; } } Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java =================================================================== --- trunk/freenet/src/freenet/node/NodeDispatcher.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/node/NodeDispatcher.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -92,6 +92,8 @@ Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS); source.setRemoteDetectedPeer(p); node.redetectAddress(); + } else if(spec == DMT.FNPVoid) { + return true; } return false; } Modified: trunk/freenet/src/freenet/node/PacketSender.java =================================================================== --- trunk/freenet/src/freenet/node/PacketSender.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/node/PacketSender.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -2,6 +2,8 @@ import java.util.LinkedList; +import freenet.io.comm.DMT; +import freenet.io.comm.Message; import freenet.io.comm.NotConnectedException; import freenet.support.Logger; import freenet.support.WouldBlockException; @@ -142,7 +144,7 @@ Logger.minor(this, "PS Sending: "+(messages[j].msg == null ? "(not a Message)" : messages[j].msg.getSpec().getName())); } // Send packets, right now, blocking, including any active notifications - node.packetMangler.processOutgoingOrRequeue(messages, pn, true); + node.packetMangler.processOutgoingOrRequeue(messages, pn, true, false); continue; } } @@ -150,16 +152,9 @@ // Need to send a keepalive packet? if(now - pn.lastSentPacketTime() > Node.KEEPALIVE_INTERVAL) { Logger.minor(this, "Sending keepalive"); - try { - node.packetMangler.processOutgoing(null, 0, 0, pn); - } catch (PacketSequenceException e) { - Logger.error(this, "Caught "+e+" - disconnecting", e); - pn.forceDisconnect(); - } catch (WouldBlockException e) { - Logger.error(this, "Impossible: "+e, e); - } catch (NotConnectedException e) { - // Ignore: no point sending a keepalive now! :) - } + // Force packet to have a sequence number. + Message m = DMT.createFNPVoid(); + node.packetMangler.processOutgoingOrRequeue(new MessageItem[] { new MessageItem(m, null) }, pn, true, true); } } else { // Not connected Modified: trunk/freenet/src/freenet/node/ThrottleWindowManager.java =================================================================== --- trunk/freenet/src/freenet/node/ThrottleWindowManager.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/node/ThrottleWindowManager.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -30,7 +30,7 @@ public synchronized void requestCompleted() { _totalPackets++; - _simulatedWindowSize += PACKET_TRANSMIT_INCREMENT; + _simulatedWindowSize += (PACKET_TRANSMIT_INCREMENT / _simulatedWindowSize); Logger.minor(this, "requestCompleted on "+this); } Modified: trunk/freenet/src/freenet/node/Version.java =================================================================== --- trunk/freenet/src/freenet/node/Version.java 2006-04-12 17:39:32 UTC (rev 8529) +++ trunk/freenet/src/freenet/node/Version.java 2006-04-12 18:20:25 UTC (rev 8530) @@ -20,7 +20,7 @@ public static final String protocolVersion = "1.0"; /** The build number of the current revision */ - private static final int buildNumber = 636; + private static final int buildNumber = 637; /** Oldest build of Fred we will talk to */ private static final int lastGoodBuild = 591;
