From 5f12688a9058f8aa3b789d4158a7ec08ec1ddea4 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 18 Jan 2010 14:57:03 +0000
Subject: [PATCH]     * Console: Add a tunnel share ratio estimate

---
 .../i2p/router/web/SummaryBarRenderer.java    |  6 +++++
 .../src/net/i2p/router/web/SummaryHelper.java |  9 ++++++++
 apps/routerconsole/jsp/help.jsp               |  7 +++++-
 .../i2p/router/DummyTunnelManagerFacade.java  |  1 +
 .../net/i2p/router/TunnelManagerFacade.java   |  1 +
 .../router/tunnel/pool/TunnelPoolManager.java | 23 +++++++++++++++++++
 6 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
index 89922dec81..af3323571d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
@@ -378,6 +378,12 @@ public class SummaryBarRenderer {
            .append(_("Participating"))
            .append(":</b></td><td align=\"right\">")
            .append(_helper.getParticipatingTunnels())
+           .append("</td></tr>\n" +
+
+                   "<tr><td align=\"left\"><b>")
+           .append(_("Share ratio"))
+           .append(":</b></td><td align=\"right\">")
+           .append(_helper.getShareRatio())
            .append("</td></tr>\n" +
 
                    "</table><hr><h3><a href=\"/jobs.jsp\" target=\"_top\" title=\"")
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index d1e8cb7fda..fdf2b46ac8 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -499,6 +499,15 @@ public class SummaryHelper extends HelperBase {
             return _context.tunnelManager().getParticipatingCount();
     }
  
+    /** @since 0.7.10 */
+    public String getShareRatio() { 
+        if (_context == null) 
+            return "0";
+        double sr = _context.tunnelManager().getShareRatio();
+        DecimalFormat fmt = new DecimalFormat("##0.00");
+        return fmt.format(sr);
+    }
+
     /**
      * How lagged our job queue is over the last minute (pretty printed with
      * the units attached)
diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp
index 50c430f02d..86acd6dace 100644
--- a/apps/routerconsole/jsp/help.jsp
+++ b/apps/routerconsole/jsp/help.jsp
@@ -92,7 +92,12 @@ shared bandwidth, and amount of locally-generated traffic.
 The recommended method for limiting participating tunnels is
 to change your share percentage on the <a href="config.jsp#help">configuration page</a>.
 You may also limit the total number by setting <tt>router.maxParticipatingTunnels=nnn</tt> on
-the <a href="configadvanced.jsp">advanced configuration page</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[Enable graphing]</a>.</ul>
+the <a href="configadvanced.jsp">advanced configuration page</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[Enable graphing]</a>.
+<li class="tidylist"><b>Share ratio:</b>
+The number of participating tunnels you route for others, divided by the total number of hops in
+all your exploratory and client tunnels.
+A number greater than 1.00 means you are contributing more tunnels to the network than you are using.
+</ul>
 
 <h3>Congestion</h3><div align="justify">
 Some basic indications of router overload:</div><ul>
diff --git a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
index 4b8fb486e4..2adc9ac338 100644
--- a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
+++ b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java
@@ -35,6 +35,7 @@ class DummyTunnelManagerFacade implements TunnelManagerFacade {
     public int getFreeTunnelCount() { return 0; }
     public int getOutboundTunnelCount() { return 0; }
     public int getInboundClientTunnelCount() { return 0; }
+    public double getShareRatio() { return 0d; }
     public int getOutboundClientTunnelCount() { return 0; }
     public long getLastParticipatingExpiration() { return -1; }
     public void buildTunnels(Destination client, ClientTunnelSettings settings) {}
diff --git a/router/java/src/net/i2p/router/TunnelManagerFacade.java b/router/java/src/net/i2p/router/TunnelManagerFacade.java
index 148499a43d..b1cfd5c289 100644
--- a/router/java/src/net/i2p/router/TunnelManagerFacade.java
+++ b/router/java/src/net/i2p/router/TunnelManagerFacade.java
@@ -51,6 +51,7 @@ public interface TunnelManagerFacade extends Service {
     public int getInboundClientTunnelCount();
     /** how many outbound client tunnels do we have available? */
     public int getOutboundClientTunnelCount();
+    public double getShareRatio();
     
     /** When does the last tunnel we are participating in expire? */
     public long getLastParticipatingExpiration();
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index bbee14a484..fbb2bc77f0 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -193,6 +193,29 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     public int getParticipatingCount() { return _context.tunnelDispatcher().getParticipatingCount(); }
     public long getLastParticipatingExpiration() { return _context.tunnelDispatcher().getLastParticipatingExpiration(); }
     
+    /**
+     *  @return (number of part. tunnels) / (estimated total number of hops in our expl.+client tunnels)
+     *  100 max.
+     *  We just use length setting, not variance, for speed
+     *  @since 0.7.10
+     */
+    public double getShareRatio() {
+        int part = getParticipatingCount();
+        if (part <= 0)
+            return 0d;
+        List<TunnelPool> pools = new ArrayList();
+        listPools(pools);
+        int count = 0;
+        for (int i = 0; i < pools.size(); i++) {
+            TunnelPool pool = pools.get(i);
+            count += pool.size() * pool.getSettings().getLength();
+        }
+        if (count <= 0)
+            return 100d;
+        return Math.min(part / (double) count, 100d);
+    }
+
+
     public boolean isValidTunnel(Hash client, TunnelInfo tunnel) {
         if (tunnel.getExpiration() < _context.clock().now())
             return false;
-- 
GitLab