From 787def6a1c76c45fc6def1dd1392a5b0b78f3020 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 27 Aug 2009 15:27:46 +0000
Subject: [PATCH]     * Tunnel:       - Adjust the random drop probability for
 the message size

---
 .../router/tunnel/InboundGatewayReceiver.java |  2 +-
 .../router/tunnel/OutboundTunnelEndpoint.java |  2 +-
 .../i2p/router/tunnel/TunnelDispatcher.java   | 19 +++++++++++++++++--
 .../i2p/router/tunnel/TunnelParticipant.java  |  2 +-
 4 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java b/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
index 822c1f6370..382be541f3 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
@@ -35,7 +35,7 @@ public class InboundGatewayReceiver implements TunnelGateway.Receiver {
             }
         }
         
-        if (_context.tunnelDispatcher().shouldDropParticipatingMessage())
+        if (_context.tunnelDispatcher().shouldDropParticipatingMessage("IBGW", encrypted.length))
             return -1;
         _config.incrementSentMessages();
         TunnelDataMessage msg = new TunnelDataMessage(_context);
diff --git a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
index 9aa9e667b1..32e4c2c2ef 100644
--- a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
+++ b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
@@ -43,7 +43,7 @@ public class OutboundTunnelEndpoint {
                            + (toTunnel != null ? toTunnel.getTunnelId() + "" : ""));
             // don't drop it if we are the target
             if ((!_context.routerHash().equals(toRouter)) &&
-                _context.tunnelDispatcher().shouldDropParticipatingMessage())
+                _context.tunnelDispatcher().shouldDropParticipatingMessage("OBEP " + msg.getType(), msg.getMessageSize()))
                 return;
             _config.incrementSentMessages();
             _outDistributor.distribute(msg, toRouter, toTunnel);
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
index 6351c58553..b9da8d6d83 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
@@ -540,8 +540,17 @@ public class TunnelDispatcher implements Service {
      * This is similar to the code in ../RouterThrottleImpl.java
      * We drop in proportion to how far over the limit we are.
      * Perhaps an exponential function would be better?
+     *
+     * The drop probability is adjusted for the size of the message.
+     * At this stage, participants and IBGWs see a standard 1024 byte message.
+     * OBEPs however may see a wide variety of sizes.
+     *
+     * @param type unused except for logging
+     * @param length the length of the message
      */
-    public boolean shouldDropParticipatingMessage() {
+    public boolean shouldDropParticipatingMessage(String type, int length) {
+        if (length <= 0)
+            return false;
         RateStat rs = _context.statManager().getRate("tunnel.participatingBandwidth");
         if (rs == null)
             return false;
@@ -574,13 +583,19 @@ public class TunnelDispatcher implements Service {
         float pctDrop = (used - maxBps) / used;
         if (pctDrop <= 0)
             return false;
+        // drop in proportion to size w.r.t. a standard 1024-byte message
+        // this is a little expensive but we want to adjust the curve between 0 and 1
+        // Most messages are 1024, only at the OBEP do we see other sizes
+        if (length != 1024)
+            pctDrop = (float) Math.pow(pctDrop, 1024d / length);
         float rand = _context.random().nextFloat();
         boolean reject = rand <= pctDrop;
         if (reject) {
             if (_log.shouldLog(Log.WARN)) {
                 int availBps = (int) (((maxKBps*1024)*share) - used);
                 _log.warn("Drop part. msg. avail/max/used " + availBps + "/" + (int) maxBps + "/" 
-                          + used + " %Drop = " + pctDrop);
+                          + used + " %Drop = " + pctDrop
+                          + ' ' + type + ' ' + length);
             }
             _context.statManager().addRateData("tunnel.participatingMessageDropped", 1, 0);
         }
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
index b9d660751b..a73208e3bb 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
@@ -150,7 +150,7 @@ public class TunnelParticipant {
     }
 
     private void send(HopConfig config, TunnelDataMessage msg, RouterInfo ri) {
-        if (_context.tunnelDispatcher().shouldDropParticipatingMessage())
+        if (_context.tunnelDispatcher().shouldDropParticipatingMessage("TDM", 1024))
             return;
         _config.incrementSentMessages();
         long oldId = msg.getUniqueId();
-- 
GitLab