[tor-commits] [torflow/master] Make the pid target bw actually converge.

mikeperry at torproject.org mikeperry at torproject.org
Sat Dec 3 01:10:40 UTC 2011


commit 063ea9bca63343996a8e3e3f6d3c2142bad8681e
Author: Mike Perry <mikeperry-git at fscked.org>
Date:   Fri Dec 2 17:04:04 2011 -0800

    Make the pid target bw actually converge.
    
    This seems to only take a few seconds to do.. Expensive, but probably not
    prohibitively so?
---
 NetworkScanners/BwAuthority/README.spec.txt |    2 +-
 NetworkScanners/BwAuthority/aggregate.py    |   19 +++++++++++++++----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/NetworkScanners/BwAuthority/README.spec.txt b/NetworkScanners/BwAuthority/README.spec.txt
index bc94eee..e46994c 100644
--- a/NetworkScanners/BwAuthority/README.spec.txt
+++ b/NetworkScanners/BwAuthority/README.spec.txt
@@ -545,7 +545,7 @@
     "bwauthpidtgt=1"
        If present, the PID setpoint bandwidth F_avg will be re-computed
        by averaging the F_node values for only those nodes whose
-       descriptor bandwidth exceeds the F_avg computed from Section 3.1.
+       descriptor bandwidth exceeds the F_avg.
 
        Note that this parameter causes bwauthbestratio to have no 
        effect.
diff --git a/NetworkScanners/BwAuthority/aggregate.py b/NetworkScanners/BwAuthority/aggregate.py
index 1dc39ca..ca26b2d 100755
--- a/NetworkScanners/BwAuthority/aggregate.py
+++ b/NetworkScanners/BwAuthority/aggregate.py
@@ -482,9 +482,14 @@ def main(argv):
         true_circ_avg[cl] = sum(map(lambda n: (1.0-n.circ_fail_rate),
                                c_nodes))/float(len(c_nodes))
 
-        f_nodes = filter(lambda n: n.desc_bw >= true_filt_avg[cl], c_nodes)
+        # FIXME: This may be expensive
+        pid_tgt_avg[cl] = true_filt_avg[cl]
+        prev_pid_avg = 2*pid_tgt_avg[cl]
 
-        pid_tgt_avg[cl] = sum(map(lambda n: n.filt_bw, f_nodes))/float(len(f_nodes))
+        while prev_pid_avg > pid_tgt_avg[cl]:
+          f_nodes = filter(lambda n: n.desc_bw >= pid_tgt_avg[cl], c_nodes)
+          prev_pid_avg = pid_tgt_avg[cl]
+          pid_tgt_avg[cl] = sum(map(lambda n: n.filt_bw, f_nodes))/float(len(f_nodes))
 
         plog("INFO", "Network true_filt_avg["+cl+"]: "+str(true_filt_avg[cl]))
         plog("INFO", "Network pid_tgt_avg["+cl+"]: "+str(pid_tgt_avg[cl]))
@@ -494,9 +499,15 @@ def main(argv):
       strm_avg = sum(map(lambda n: n.strm_bw, nodes.itervalues()))/float(len(nodes))
       circ_avg = sum(map(lambda n: (1.0-n.circ_fail_rate),
                          nodes.itervalues()))/float(len(nodes))
-      f_nodes = filter(lambda n: n.desc_bw >= strm_avg, nodes.itervalues)
 
-      pid_avg = sum(map(lambda n: n.filt_bw, f_nodes))/float(len(f_nodes))
+      # FIXME: This may be expensive
+      pid_avg = filt_avg
+      prev_pid_avg = 2*pid_avg
+
+      while prev_pid_avg > pid_avg:
+        f_nodes = filter(lambda n: n.desc_bw >= pid_avg, c_nodes)
+        prev_pid_avg = pid_avg
+        pid_avg = sum(map(lambda n: n.filt_bw, f_nodes))/float(len(f_nodes))
 
       for cl in ["Guard+Exit", "Guard", "Exit", "Middle"]:
         true_filt_avg[cl] = filt_avg



More information about the tor-commits mailing list