From 0bec84a3b13bd98e40aaaf59c05a31962934dd4a Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 26 Feb 2020 16:36:36 +0000 Subject: [PATCH] Profiles: Fix bug which caused speed values to be divided by 3 after being read from file Remove _isFailing field Minor cleanup Don't persist profiles when in vmCommSystem mode --- .../i2p/router/peermanager/PeerManager.java | 3 + .../i2p/router/peermanager/PeerProfile.java | 61 ++++++++++++------- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index 857f667321..b1448ceced 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -151,6 +151,9 @@ class PeerManager { } void storeProfiles() { + // Don't overwrite disk profiles when testing + if (_context.commSystem().isDummy()) + return; // lock in case shutdown bumps into periodic store if (!_storeLock.compareAndSet(false, true)) return; diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java index 7381e30895..c5102c8630 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java +++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java @@ -58,7 +58,6 @@ public class PeerProfile { private float _speedValue; private float _capacityValue; private float _integrationValue; - private boolean _isFailing; // new calculation values, to be updated // floats to save some space private float _speedValueNew; @@ -86,9 +85,8 @@ public class PeerProfile { private final float _peakTunnelThroughput[] = new float[THROUGHPUT_COUNT]; /** total number of bytes pushed through a single tunnel in a 1 minute period */ private final float _peakTunnel1mThroughput[] = new float[THROUGHPUT_COUNT]; - /** once a day, on average, cut the measured throughtput values in half */ - /** let's try once an hour times 3/4 */ - private static final int DROP_PERIOD_MINUTES = 60; + /** periodically cut the measured throughput values */ + private static final int DROP_PERIOD_MINUTES = 120; private static final float DEGRADE_FACTOR = 0.75f; private long _lastCoalesceDate = System.currentTimeMillis(); @@ -336,7 +334,7 @@ public class PeerProfile { * is this peer actively failing (aka not worth touching)? * deprecated - unused - always false */ - public boolean getIsFailing() { return _isFailing; } + public boolean getIsFailing() { return false; } public float getTunnelTestTimeAverage() { return _tunnelTestResponseTimeAvg; } void setTunnelTestTimeAverage(float avg) { _tunnelTestResponseTimeAvg = avg; } @@ -363,11 +361,18 @@ public class PeerProfile { rv /= (60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakThroughputKBps(float kBps) { - _peakThroughput[0] = kBps*60*1024; - //for (int i = 0; i < THROUGHPUT_COUNT; i++) - // _peakThroughput[i] = kBps*60; + + /** + * Only for restoration from persisted profile. + */ + void setPeakThroughputKBps(float kBps) { + // Set all so the average remains the same + float speed = kBps * (60 * 1024); + for (int i = 0; i < THROUGHPUT_COUNT; i++) { + _peakThroughput[i] = speed; + } } + void dataPushed(int size) { _peakThroughputCurrentTotal += size; } /** the tunnel pushed that much data in its lifetime */ @@ -393,8 +398,16 @@ public class PeerProfile { rv /= (10 * 60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakTunnelThroughputKBps(float kBps) { - _peakTunnelThroughput[0] = kBps * (60 * 10 * 1024); + + /** + * Only for restoration from persisted profile. + */ + void setPeakTunnelThroughputKBps(float kBps) { + // Set all so the average remains the same + float speed = kBps * (60 * 10 * 1024); + for (int i = 0; i < THROUGHPUT_COUNT; i++) { + _peakTunnelThroughput[i] = speed; + } } /** the tunnel pushed that much data in a 1 minute period */ @@ -422,10 +435,11 @@ public class PeerProfile { } } } + /** * @return the average of the three fastest one-minute data transfers, on a per-tunnel basis, * through this peer. Ever. Except that the peak values are cut in half - * once a day by coalesceThroughput(). This seems way too seldom. + * periodically by coalesceThroughput(). */ public float getPeakTunnel1mThroughputKBps() { float rv = 0; @@ -434,8 +448,16 @@ public class PeerProfile { rv /= (60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakTunnel1mThroughputKBps(float kBps) { - _peakTunnel1mThroughput[0] = kBps*60*1024; + + /** + * Only for restoration from persisted profile. + */ + void setPeakTunnel1mThroughputKBps(float kBps) { + // Set all so the average remains the same + float speed = kBps * (60 * 1024); + for (int i = 0; i < THROUGHPUT_COUNT; i++) { + _peakTunnel1mThroughput[i] = speed; + } } /** @@ -517,7 +539,7 @@ public class PeerProfile { } } } else { - if (_context.random().nextInt(DROP_PERIOD_MINUTES*2) <= 0) { + if (_context.random().nextInt(DROP_PERIOD_MINUTES) <= 0) { for (int i = 0; i < THROUGHPUT_COUNT; i++) _peakThroughput[i] *= DEGRADE_FACTOR; } @@ -525,7 +547,7 @@ public class PeerProfile { // we degrade the tunnel throughput here too, regardless of the current // activity - if (_context.random().nextInt(DROP_PERIOD_MINUTES*2) <= 0) { + if (_context.random().nextInt(DROP_PERIOD_MINUTES) <= 0) { for (int i = 0; i < THROUGHPUT_COUNT; i++) { _peakTunnelThroughput[i] *= DEGRADE_FACTOR; _peakTunnel1mThroughput[i] *= DEGRADE_FACTOR; @@ -544,7 +566,7 @@ public class PeerProfile { updateValues(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Coalesced: speed [" + _speedValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + "] failing? [" + _isFailing + "]"); + _log.debug("Coalesced: speed [" + _speedValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + ']'); } /** @@ -574,7 +596,6 @@ public class PeerProfile { // (in fact aren't really used at all), so we can // update them directly _integrationValue = calculateIntegration(); - _isFailing = calculateIsFailing(); } /** @@ -594,9 +615,7 @@ public class PeerProfile { private float calculateCapacity() { return (float) CapacityCalculator.calc(this); } private float calculateIntegration() { return (float) IntegrationCalculator.calc(this); } /** deprecated - unused - always false */ - private boolean calculateIsFailing() { return false; } - /** deprecated - unused - always false */ - void setIsFailing(boolean val) { _isFailing = val; } + void setIsFailing(boolean val) {} /** * Helper for calculators -- GitLab