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;


Reply via email to