[tor-commits] [torflow/master] Add a consensus param to raise the PID setpoint.

mikeperry at torproject.org mikeperry at torproject.org
Sat Dec 3 00:20:33 UTC 2011


commit 65b9670fc3db3708c4f069ce27dd06a788926415
Author: Mike Perry <mikeperry-git at fscked.org>
Date:   Fri Dec 2 15:58:58 2011 -0800

    Add a consensus param to raise the PID setpoint.
    
    Intuitively, it seems to make sense to exclude nodes with no chance
    of reaching the setpoint from consideration.
---
 NetworkScanners/BwAuthority/README.spec.txt |    8 ++++++
 NetworkScanners/BwAuthority/aggregate.py    |   32 ++++++++++++++++++++++----
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/NetworkScanners/BwAuthority/README.spec.txt b/NetworkScanners/BwAuthority/README.spec.txt
index ddaa7cc..175a9fb 100644
--- a/NetworkScanners/BwAuthority/README.spec.txt
+++ b/NetworkScanners/BwAuthority/README.spec.txt
@@ -542,6 +542,14 @@
        of Guard, Middle, Exit, and Guard+Exit nodes, and uses these
        flag-specific averages to compute pid_error.
 
+    "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.
+
+       Note that this parameter causes bwauthbestratio to have no 
+       effect.
+
     "bwauthkp=N"
        Sets K_p to N/10000.0. If absent, K_p=1.0.
 
diff --git a/NetworkScanners/BwAuthority/aggregate.py b/NetworkScanners/BwAuthority/aggregate.py
index 884b065..615a157 100755
--- a/NetworkScanners/BwAuthority/aggregate.py
+++ b/NetworkScanners/BwAuthority/aggregate.py
@@ -234,6 +234,7 @@ class ConsensusJunk:
     cs_bytes = c.sendAndRecv("GETINFO dir/status-vote/current/consensus\r\n")[0][2]
     self.bwauth_pid_control = True
     self.group_by_class = False
+    self.use_pid_tgt = False
     self.use_circ_fails = False
     self.use_best_ratio = True
     self.use_desc_bw = True
@@ -261,6 +262,9 @@ class ConsensusJunk:
         elif p == "bwauthbyclass=1":
           self.group_by_class = True
           plog("INFO", "Grouping nodes by flag-class")
+        elif p == "bwauthpidtgt=1":
+          self.use_pid_tgt = True
+          plog("INFO", "Using filtered PID target")
         elif p.startswith("bwauthkp="):
           self.K_p = int(p.split("=")[1])/10000.0
           plog("INFO", "Got K_p=%f from consensus." % self.K_p)
@@ -454,6 +458,7 @@ def main(argv):
       nodes[idhex].flags = prev_consensus[idhex].flags
 
   true_filt_avg = {}
+  pid_tgt_avg = {}
   true_strm_avg = {}
   true_circ_avg = {}
 
@@ -470,18 +475,31 @@ def main(argv):
         true_strm_avg[cl] = sum(map(lambda n: n.strm_bw, c_nodes))/float(len(c_nodes))
         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)
+
+        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]))
         plog("INFO", "Network true_circ_avg["+cl+"]: "+str(true_circ_avg[cl]))
     else:
       filt_avg = sum(map(lambda n: n.filt_bw, nodes.itervalues()))/float(len(nodes))
       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))
+
       for cl in ["Guard+Exit", "Guard", "Exit", "Middle"]:
         true_filt_avg[cl] = filt_avg
         true_strm_avg[cl] = strm_avg
         true_circ_avg[cl] = circ_avg
+        pid_tgt_avg[cl] = pid_avg
+
       plog("INFO", "Network true_filt_avg: "+str(true_filt_avg["Middle"]))
+      plog("INFO", "Network pid_tgt_avg: "+str(pid_tgt_avg["Middle"]))
       plog("INFO", "Network true_circ_avg: "+str(true_circ_avg["Middle"]))
   else:
     plog("INFO", "PID control disabled")
@@ -535,12 +553,16 @@ def main(argv):
       else:
         n.use_bw = n.ns_bw
 
-      if cs_junk.use_best_ratio and n.sbw_ratio > n.fbw_ratio:
-        n.pid_error = (n.strm_bw - true_strm_avg[n.node_class()]) \
-                         / true_strm_avg[n.node_class()]
+      if cs_junk.use_pid_tgt:
+          n.pid_error = (n.filt_bw - pid_tgt_avg[n.node_class()]) \
+                           / pid_tgt_avg[n.node_class()]
       else:
-        n.pid_error = (n.filt_bw - true_filt_avg[n.node_class()]) \
-                         / true_filt_avg[n.node_class()]
+        if cs_junk.use_best_ratio and n.sbw_ratio > n.fbw_ratio:
+          n.pid_error = (n.strm_bw - true_strm_avg[n.node_class()]) \
+                           / true_strm_avg[n.node_class()]
+        else:
+          n.pid_error = (n.filt_bw - true_filt_avg[n.node_class()]) \
+                           / true_filt_avg[n.node_class()]
 
       # Penalize nodes for circ failure rate
       if cs_junk.use_circ_fails:





More information about the tor-commits mailing list