commit 4adb743f61fc20fd0c36ee7ef25b561ac8a67573
Author: juga0 <juga(a)riseup.net>
Date: Fri Mar 29 12:11:28 2019 +0000
fix: v3bwfile: Use bytes to compare bandwidth sum
Use bytes to compare the sum of scaled bandwidth (in KB) with the
sum of the consensus one (previously converted to Bytes measured.
Also:
- Check that the bandwidth attribute exists, since it was not
stored in older versions.
- Do not sum the bw=1 as a result of the relays being unmeasured.
- Calculate the percentage difference as two difference values.
- Log which were actually the bandwidth sums.
---
sbws/lib/v3bwfile.py | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 89c66eb..3e2c646 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -1045,13 +1045,25 @@ class V3BWFile(object):
@staticmethod
def is_max_bw_diff_perc_reached(bw_lines,
max_bw_diff_perc=MAX_BW_DIFF_PERC):
- sum_consensus_bw = sum([l.desc_bw_obs_last for l in bw_lines])
- sum_bw = sum([l.bw for l in bw_lines])
- diff = min(sum_consensus_bw, sum_bw) / max(sum_consensus_bw, sum_bw)
- diff_perc = diff * 100
- log.info("The difference between the total consensus bandwidth "
- "and the total measured bandwidth is %s%% percent",
- diff_perc)
+ # Since old versions were not storing consensus bandwidth, use getattr.
+ sum_consensus_bw = sum([l.consensus_bandwidth for l in bw_lines
+ if getattr(l, 'consensus_bandwidth', None)])
+ # Because the scaled bandwidth is in KB, but not the stored consensus
+ # bandwidth, multiply by 1000.
+ # Do not count 1 bandwidths for the relays that were excluded
+ # and exclude also the bw of the relays that did not stored consensus,
+ # since they are not included either in the sum of the consensus.
+ sum_bw = sum([l.bw for l in bw_lines
+ if getattr(l, 'consensus_bandwidth', None)
+ and getattr(l, 'unmeasured', 0) == 0]) * 1000
+ # Percentage difference
+ diff_perc = (
+ abs(sum_consensus_bw - sum_bw)
+ / ((sum_consensus_bw + sum_bw) / 2)
+ ) * 100
+ log.info("The difference between the total consensus bandwidth (%s)"
+ "and the total measured bandwidth (%s) is %s%%.",
+ sum_consensus_bw, sum_bw, round(diff_perc))
if diff_perc > MAX_BW_DIFF_PERC:
log.warning("It is more than %s%%", max_bw_diff_perc)
return True
@@ -1227,6 +1239,12 @@ class V3BWFile(object):
log.debug('muf %s', muf)
log.debug('hlimit %s', hlimit)
for l in bw_lines_tf:
+ # Because earlier versions did not store this values, check first
+ # they exists. Do not report any error, since they will be stored
+ if not(l.desc_bw_obs_last or l.desc_bw_obs_mean and l.desc_bw_avg):
+ log.debug("Skipping %s from scaling, because there were not "
+ "descriptor bandwidths.", l.nick)
+ continue
if desc_bw_obs_type == TORFLOW_OBS_LAST:
desc_bw_obs = l.desc_bw_obs_last
elif desc_bw_obs_type == TORFLOW_OBS_MEAN: