[tor-commits] [torflow/master] Fix for 0-bandwidth Guard issue.

mikeperry at torproject.org mikeperry at torproject.org
Thu Nov 17 23:50:09 UTC 2011


commit e6ddd7a2572bac9be7a29c3fe725dbed7628c770
Author: Mike Perry <mikeperry-git at fscked.org>
Date:   Sat Nov 12 15:56:54 2011 -0800

    Fix for 0-bandwidth Guard issue.
    
    We were accidentally voting 0 for guards that weren't measured this round.
---
 NetworkScanners/BwAuthority/aggregate.py |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/NetworkScanners/BwAuthority/aggregate.py b/NetworkScanners/BwAuthority/aggregate.py
index 53f8dd7..1746256 100755
--- a/NetworkScanners/BwAuthority/aggregate.py
+++ b/NetworkScanners/BwAuthority/aggregate.py
@@ -95,7 +95,7 @@ class Node:
     self.strm_fail_rate = 0
 
   def revert_to_vote(self, vote):
-    self.new_bw = vote.bw*1000 # XXX: Could be 0?
+    self.new_bw = vote.bw*1000
     self.pid_bw = vote.pid_bw
     self.pid_error = vote.pid_error
     self.measured_at = vote.measured_at
@@ -176,7 +176,7 @@ class Vote:
       self.pid_bw = float(re.search("[\s]*pid_bw=([\S]+)[\s]*", line).group(1))
     except:
       plog("NOTICE", "No previous PID data.")
-      self.pid_bw = 0
+      self.pid_bw = self.bw
       self.pid_error = 0
       self.pid_error_sum = 0
 
@@ -432,8 +432,15 @@ def main(argv):
               n.revert_to_vote(prev_votes.vote_map[n.idhex])
               # Don't use feedback here, but we might as well use our
               # new measurement against the previous vote.
-              n.new_bw = prev_votes.vote_map[n.idhex].pid_bw + \
-                     K_p*prev_votes.vote_map[n.idhex].pid_bw*pid_error
+              if prev_votes.vote_map[n.idhex].pid_bw == 0:
+                # This should no longer happen
+                plog("NOTICE", "Zero bw for Guard node "+n.nick+"="+n.idhex)
+                n.new_bw = prev_votes.vote_map[n.idhex].bw + \
+                       K_p*prev_votes.vote_map[n.idhex].bw*pid_error
+                n.pid_bw = n.new_bw
+              else:
+                n.new_bw = prev_votes.vote_map[n.idhex].pid_bw + \
+                       K_p*prev_votes.vote_map[n.idhex].pid_bw*pid_error
           else:
             # Everyone else should be pretty instantenous to respond.
             # Full feedback should be fine for them (we hope),
@@ -451,7 +458,6 @@ def main(argv):
               n.new_bw = n.get_pid_bw(prev_votes.vote_map[n.idhex], K_p)
         else:
           # Reset values. Don't vote/sample this measurement round.
-          # XXX: This possibly breaks guards
           n.revert_to_vote(prev_votes.vote_map[n.idhex])
       else: # No prev vote, pure consensus feedback this round
         n.new_bw = n.ns_bw + K_p*n.ns_bw*n.pid_error
@@ -465,10 +471,10 @@ def main(argv):
       else:
         n.ratio = n.fbw_ratio
 
-      n.pid_bw = 0
       n.pid_error = 0
       n.pid_error_sum = 0
       n.new_bw = n.desc_bw*n.ratio
+      n.pid_bw = n.new_bw # for transition between pid/no-pid
 
     n.change = n.new_bw - n.desc_bw
 





More information about the tor-commits mailing list