Author: mrogers
Date: 2006-07-27 09:21:15 +0000 (Thu, 27 Jul 2006)
New Revision: 9791

Modified:
   trunk/apps/load-balancing-sims/phase5/Peer.java
Log:
Don't send empty packets

Modified: trunk/apps/load-balancing-sims/phase5/Peer.java
===================================================================
--- trunk/apps/load-balancing-sims/phase5/Peer.java     2006-07-27 08:59:44 UTC 
(rev 9790)
+++ trunk/apps/load-balancing-sims/phase5/Peer.java     2006-07-27 09:21:15 UTC 
(rev 9791)
@@ -35,7 +35,6 @@
        private LinkedList<DataPacket> txBuffer; // Retransmission buffer
        private LinkedList<Message> txQueue; // Messages waiting to be sent
        private int txQueueSize = 0; // Size of transmission queue in bytes
-       private int txHeadSize = 0; // Size of first message in transmission q

        // Receiver state
        private int rxSeq = 0; // Sequence number of next in-order packet
@@ -59,7 +58,6 @@
                log (m + " added to transmission queue");
                // Warning: until token-passing is implemented the length of
                // the transmission queue is unlimited
-               if (txQueue.isEmpty()) txHeadSize = m.size;
                txQueue.add (m);
                txQueueSize += m.size;
                log (txQueue.size() + " messages in transmission queue");
@@ -75,50 +73,50 @@
                        return false;
                }

+               // Return to slow start when the link is idle
+               double now = Event.time();
+               if (now - lastTransmission > RTO * rtt) {
+                       log ("returning to slow start");
+                       cwind = MIN_CWIND;
+                       slowStart = true;
+               }
+               lastTransmission = now;
+               
+               if (cwind - inflight <= Packet.HEADER_SIZE) {
+                       log ("no room in congestion window");
+                       return false;
+               }
+               
                // Work out how large a packet we can send
                int payload = Packet.MAX_PAYLOAD;
                if (payload > txQueueSize) payload = txQueueSize;
                if (payload > cwind - inflight - Packet.HEADER_SIZE)
                        payload = (int) cwind - inflight - Packet.HEADER_SIZE;

-               if (payload < txHeadSize) {
-                       log ("no room in congestion window");
-                       return false;
-               }
-               
                // Nagle's algorithm - try to coalesce small packets
                if (payload < Packet.SENSIBLE_PAYLOAD && inflight > 0) {
                        log ("delaying transmission of " + payload + " bytes");
                        return false;
                }

-               // Return to slow start when the link is idle
-               double now = Event.time();
-               if (now - lastTransmission > RTO * rtt) {
-                       log ("returning to slow start");
-                       cwind = MIN_CWIND;
-                       slowStart = true;
-               }
-               lastTransmission = now;
-               
                // Put as many messages as possible in the packet
                DataPacket p = new DataPacket (payload);
-               while (payload >= txHeadSize) {
-                       try {
-                               Message m = txQueue.removeFirst();
-                               p.addMessage (m);
-                               payload -= txHeadSize;
-                               txQueueSize -= txHeadSize;
-                               // Move on to the next message
-                               txHeadSize = txQueue.getFirst().size;
-                       }
-                       catch (NoSuchElementException nse) {
-                               // No more messages in the txQueue
-                               txHeadSize = 0;
-                               break;
-                       }
+               Iterator<Message> i = txQueue.iterator();
+               while (i.hasNext()) {
+                       Message m = i.next();
+                       if (m.size > payload) break;
+                       i.remove();
+                       txQueueSize -= m.size;
+                       p.addMessage (m);
+                       payload -= m.size;
                }

+               // Don't send empty packets
+               if (p.messages == null) {
+                       log ("message too large for congestion window");
+                       return false;
+               }
+               
                // Send the packet
                p.seq = txSeq++;
                log ("sending packet " + p.seq + ", " + p.size + " bytes");


Reply via email to