diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index d92e8b49badc866bf795f4575308c8cf1be6c6b7..87d13c16e2f03e65aab4920d29d0cf1b80400538 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -100,6 +100,13 @@ public class CapacityCalculator extends Calculator { long eventCount = 0; if (curAccepted != null) eventCount = curAccepted.getCurrentEventCount() + curAccepted.getLastEventCount(); + // Punish for rejections. + // We don't want to simply do eventCount -= rejected or we get to zero with 50% rejection, + // and we don't want everybody to be at zero during times of congestion. + if (eventCount > 0) { + long rejected = curRejected.getCurrentEventCount() + curRejected.getLastEventCount(); + eventCount = eventCount * eventCount / (eventCount + rejected); + } double stretch = ((double)ESTIMATE_PERIOD) / period; double val = eventCount * stretch; long failed = 0; @@ -116,12 +123,6 @@ public class CapacityCalculator extends Calculator { val -= failed * stretch; } - //if ( (period <= 10*60*1000) && (curRejected.getCurrentEventCount() + curRejected.getLastEventCount() > 0) ) { - // //System.out.println("10m period has rejected " + (curRejected.getCurrentEventCount() + curRejected.getLastEventCount()) + " times"); - // return 0.0d; - //} else - val -= stretch * (curRejected.getCurrentEventCount() + curRejected.getLastEventCount()); - val += GROWTH_FACTOR; if (val >= 0) {