[tor-commits] [sbws/maint-1.1] fix: v3bwfile: network means by relay type

juga at torproject.org juga at torproject.org
Tue Mar 16 14:17:53 UTC 2021


commit fc3d3b992ada601a6255f8a6889179abd4b7e55e
Author: juga0 <juga at riseup.net>
Date:   Mon Mar 1 22:04:04 2021 +0000

    fix: v3bwfile: network means by relay type
    
    Calculate network stream and filtered bandwidth averages per relay
    type, to obtain bandwidth weights the same way as Torflow.
    
    Closes #40059.
---
 sbws/globals.py      |  8 ++++++++
 sbws/lib/scaling.py  |  3 +++
 sbws/lib/v3bwfile.py | 24 +++++++++++++++---------
 sbws/util/stem.py    | 22 +++++++++++++++++++++-
 4 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/sbws/globals.py b/sbws/globals.py
index fa16096..b7b1097 100644
--- a/sbws/globals.py
+++ b/sbws/globals.py
@@ -187,6 +187,14 @@ MAX_RECENT_PRIORITY_RELAY_COUNT = (
     MAX_RECENT_PRIORITY_LIST_COUNT * MAX_RELAYS_PER_PRIORITY_LIST
 )
 
+# Used by util/stem.py
+G = 0
+M = 1
+E = 2
+GE = 3
+# Used by lib/scaling.py to calculate network means by relay type
+RELAY_TYPES = [G, M, E, GE]
+
 
 def fail_hard(*a, **kw):
     ''' Log something ... and then exit as fast as possible '''
diff --git a/sbws/lib/scaling.py b/sbws/lib/scaling.py
index 5415f63..1af007e 100644
--- a/sbws/lib/scaling.py
+++ b/sbws/lib/scaling.py
@@ -1,5 +1,8 @@
 from statistics import mean
 
+from sbws.globals import RELAY_TYPES
+from sbws.util.stem import rs_relay_type
+
 
 def bw_measurements_from_results(results):
     return [
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 22cf155..88bfc56 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -985,6 +985,11 @@ class V3BWLine(object):
                      len(bw_line_str), BW_LINE_SIZE)
         return bw_line_str
 
+    def set_relay_type(self, relay_type):
+        self.relay_type = relay_type
+
+    def del_relay_type(self):
+        delattr(self, "relay_type")
 
 class V3BWFile(object):
     """
@@ -1226,12 +1231,11 @@ class V3BWFile(object):
         """
         log.info("Calculating relays' bandwidth using Torflow method.")
         bw_lines_tf = copy.deepcopy(bw_lines)
-        # mean (Torflow's strm_avg)
-        mu = mean([l.bw_mean for l in bw_lines])
-        # filtered mean (Torflow's filt_avg)
-        muf = mean([l.bw_filt for l in bw_lines])
-        log.debug('mu %s', mu)
-        log.debug('muf %s', muf)
+        mu_type, muf_type = scaling.network_means_by_relay_type(
+            bw_lines_tf, router_statuses_d
+        )
+        log.debug('mu %s', mu_type)
+        log.debug('muf %s', muf_type)
 
         # Torflow's ``tot_net_bw``, sum of the scaled bandwidth for the relays
         # that are in the last consensus
@@ -1292,10 +1296,12 @@ class V3BWFile(object):
                 continue
 
             # Torflow's scaling
-            ratio_stream = l.bw_mean / mu
-            ratio_stream_filtered = l.bw_filt / muf
+            # relay_type is set in `network_means_by_relay_type` in the lines
+            # above
+            ratio_stream = l.bw_mean / mu_type[l.relay_type]
+            ratio_stream_filtered = l.bw_filt / muf_type[l.relay_type]
+            l.del_relay_type()
             ratio = max(ratio_stream, ratio_stream_filtered)
-
             # Assign it to an attribute, so it's not lost before capping and
             # rounding
             l.bw = ratio * min_bandwidth
diff --git a/sbws/util/stem.py b/sbws/util/stem.py
index 9fea31f..e617800 100644
--- a/sbws/util/stem.py
+++ b/sbws/util/stem.py
@@ -12,9 +12,11 @@ import logging
 import os
 from sbws.globals import fail_hard
 from sbws.globals import (TORRC_STARTING_POINT, TORRC_RUNTIME_OPTIONS,
-                          TORRC_OPTIONS_CAN_FAIL)
+                          TORRC_OPTIONS_CAN_FAIL, G, M, E, GE)
 from sbws import settings
 
+from stem import Flag
+
 log = logging.getLogger(__name__)
 stream_building_lock = RLock()
 
@@ -325,3 +327,21 @@ def is_torrc_starting_point_set(tor_controller):
     if not bad_options:
         log.info("Tor is correctly configured to work with sbws.")
     return bad_options
+
+
+def rs_relay_type(rs):
+    # In torflow, the equivalent to the bw_lines is initialized to "", so when
+    # the relay is not in the previous consensus and it is not known which
+    # flags it has, it would return "Medium", as it's the fail case in
+    # Node.node_class().
+    # It is not known if it is a bug, or a desired side effect that they relays
+    # not in the consensus will end up in the Middle class
+    if not rs:
+        return M
+    if Flag.EXIT in rs.flags and Flag.GUARD in rs.flags:
+        return GE
+    if Flag.GUARD in rs.flags:
+        return G
+    if Flag.EXIT in rs.flags:
+        return E
+    return M





More information about the tor-commits mailing list