Author: toad
Date: 2007-12-03 21:37:18 +0000 (Mon, 03 Dec 2007)
New Revision: 16244

Modified:
   trunk/freenet/src/freenet/io/xfer/PacketThrottle.java
   trunk/freenet/src/freenet/node/NodeStats.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Reject requests from a peer if:
- The message queue to that peer is already over 4MB.
- The message queue to that peer will take more than 1 hour to transfer.

Modified: trunk/freenet/src/freenet/io/xfer/PacketThrottle.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/PacketThrottle.java       2007-12-03 
21:26:58 UTC (rev 16243)
+++ trunk/freenet/src/freenet/io/xfer/PacketThrottle.java       2007-12-03 
21:37:18 UTC (rev 16244)
@@ -124,4 +124,8 @@
        public double getWindowSize() {
                return _simulatedWindowSize;
        }
+
+       public double getBandwidth() {
+               return ((PACKET_SIZE * 1000.0 / getDelay())) / 1024;
+       }
 }

Modified: trunk/freenet/src/freenet/node/NodeStats.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStats.java       2007-12-03 21:26:58 UTC 
(rev 16243)
+++ trunk/freenet/src/freenet/node/NodeStats.java       2007-12-03 21:37:18 UTC 
(rev 16244)
@@ -335,6 +335,11 @@
         * (If no packets have been sent, the throttledPacketSendAverage should 
decrease; if it doesn't, it may go high,
         * and then no requests will be accepted, and it will stay high 
forever. */
        static final int CHECK_THROTTLE_TIME = 60 * 1000;
+       /** Absolute limit of 4MB queued to any given peer. FIXME make this 
configurable. 
+        * Note that for many MessageItem's, the actual memory usage will be 
significantly more than this figure. */
+       private static final long MAX_PEER_QUEUE_BYTES = 4 * 1024 * 1024;
+       /** Don't accept requests if it'll take more than an hour to send the 
current message queue */
+       private static final double MAX_PEER_QUEUE_TIME = 60 * 60 * 1000.0;

        private long lastAcceptedRequest = -1;

@@ -508,6 +513,14 @@
                        return "<freeHeapPercentThreshold 
("+SizeUtil.formatSize(freeHeapMemory, false)+" of 
"+SizeUtil.formatSize(maxHeapMemory, false)+" 
("+fix3p1pct.format(percentFreeHeapMemoryOfMax)+"))";
                }

+               if(source != null) {
+                       long queuedBytes = source.getMessageQueueLengthBytes();
+                       if(queuedBytes > MAX_PEER_QUEUE_BYTES)
+                               return "Too many message bytes queued for peer";
+                       if(queuedBytes / 
(source.getThrottle().getBandwidth()+1.0) > MAX_PEER_QUEUE_TIME)
+                               return "Peer's queue will take too long to 
transfer";
+               }
+               
                synchronized(this) {
                        if(logMINOR) Logger.minor(this, "Accepting request?");
                        lastAcceptedRequest = now;

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-12-03 21:26:58 UTC 
(rev 16243)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-12-03 21:37:18 UTC 
(rev 16244)
@@ -898,6 +898,18 @@
         // it wakes up every 100ms *anyway*.
        }

+       public long getMessageQueueLengthBytes() {
+               long x = 0;
+               synchronized(messagesToSendNow) {
+                       Iterator i = messagesToSendNow.iterator();
+                       for(; i.hasNext();) {
+                               MessageItem it = (MessageItem) (i.next());
+                               x += it.getData(this).length + 2;
+                       }
+               }
+               return x;
+       }
+       
        /**
        * @return The last time we received a packet.
        */


Reply via email to