[tor-commits] [sbws/master] fix: v3bwfile: Use bytes to compare bandwidth sum

juga at torproject.org juga at torproject.org
Fri Mar 29 13:48:34 UTC 2019


commit 4adb743f61fc20fd0c36ee7ef25b561ac8a67573
Author: juga0 <juga at 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:





More information about the tor-commits mailing list