[tor-commits] [sbws/maint-1.1] chg: v3bwfile: Calculate filtered bandwidth

juga at torproject.org juga at torproject.org
Mon Jun 29 07:49:10 UTC 2020


commit c030731ec25adeff750c8c00415b87521a10d581
Author: juga0 <juga at riseup.net>
Date:   Sat May 16 17:55:50 2020 +0000

    chg: v3bwfile: Calculate filtered bandwidth
    
    for each relay, calculate the filtered mean for all relays and
    calculate the filtered ratio for each relay.
---
 sbws/lib/v3bwfile.py           | 14 +++++++++++---
 tests/unit/lib/test_scaling.py | 13 +++++++++++++
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 245ffa6..9a303be 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -15,6 +15,7 @@ from sbws.globals import (SPEC_VERSION, BW_LINE_SIZE, SBWS_SCALE_CONSTANT,
                           TORFLOW_SCALING, SBWS_SCALING, TORFLOW_BW_MARGIN,
                           TORFLOW_OBS_LAST, TORFLOW_OBS_MEAN,
                           PROP276_ROUND_DIG, MIN_REPORT, MAX_BW_DIFF_PERC)
+from sbws.lib import scaling
 from sbws.lib.resultdump import ResultSuccess, _ResultType
 from sbws.util.filelock import DirectoryLock
 from sbws.util.timestamp import (now_isodt_str, unixts_to_isodt_str,
@@ -631,8 +632,10 @@ class V3BWLine(object):
         assert node_id.startswith('$')
         self.node_id = node_id
         self.bw = bw
+        # For now, we do not want to add ``bw_filt`` to the bandwidth file,
+        # therefore it is set here but not added to ``BWLINE_KEYS_V1``.
         [setattr(self, k, v) for k, v in kwargs.items()
-         if k in BWLINE_KEYS_V1]
+         if k in BWLINE_KEYS_V1 + ["bw_filt"]]
 
     def __str__(self):
         return self.bw_strv1
@@ -762,7 +765,11 @@ class V3BWLine(object):
         if rtt:
             kwargs['rtt'] = rtt
         bw = cls.bw_median_from_results(results_recent)
+        # XXX: all the class functions could use the bw_measurements instead of
+        # obtaining them each time or use a class Measurements.
+        bw_measurements = scaling.bw_measurements_from_results(results_recent)
         kwargs['bw_mean'] = cls.bw_mean_from_results(results_recent)
+        kwargs['bw_filt'] = scaling.bw_filt(bw_measurements)
         kwargs['bw_median'] = cls.bw_median_from_results(
             results_recent)
         kwargs['desc_bw_avg'] = \
@@ -1311,7 +1318,8 @@ class V3BWFile(object):
         # mean (Torflow's strm_avg)
         mu = mean([l.bw_mean for l in bw_lines])
         # filtered mean (Torflow's filt_avg)
-        muf = mean([max(l.bw_mean, mu) for l in bw_lines])
+        muf = mean([l.bw_filt for l in bw_lines])
+
         # bw sum (Torflow's tot_net_bw or tot_sbw)
         sum_bw = sum([l.bw_mean for l in bw_lines])
         # Torflow's clipping
@@ -1369,7 +1377,7 @@ class V3BWFile(object):
                 min_bandwidth = min(desc_bw, l.consensus_bandwidth)
             # Torflow's scaling
             ratio_stream = l.bw_mean / mu
-            ratio_stream_filtered = max(l.bw_mean, mu) / muf
+            ratio_stream_filtered = l.bw_filt / muf
             ratio = max(ratio_stream, ratio_stream_filtered)
             bw_scaled = ratio * min_bandwidth
             # round and convert to KB
diff --git a/tests/unit/lib/test_scaling.py b/tests/unit/lib/test_scaling.py
new file mode 100644
index 0000000..06fb71b
--- /dev/null
+++ b/tests/unit/lib/test_scaling.py
@@ -0,0 +1,13 @@
+"""Unit tests for scaling.py."""
+
+from sbws.lib import scaling
+
+
+def test_bw_filt():
+    bw_measurements = [
+        96700.00922329757, 70311.63051659254, 45531.743347556374,
+        38913.97025485627, 55656.332364676025
+    ]
+    fb = scaling.bw_filt(bw_measurements)
+    # This is greater than the mean, that is 61422.73714139576
+    assert fb == 83505.81986994506





More information about the tor-commits mailing list