[tor-commits] [torflow/master] Implement mercy, subject to consensus parameter.

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


commit 0e0564672f92ef8332b0707e7ad5ddfa0e25dd68
Author: Mike Perry <mikeperry-git at fscked.org>
Date:   Fri Dec 2 16:17:16 2011 -0800

    Implement mercy, subject to consensus parameter.
    
    If the param is set, we don't accumulate negative pid_error_sum for nodes with
    negative pid_error. Prevents us from punishing these nodes to 0 bw. The param
    only makes sense for descriptor-based feedback.
---
 NetworkScanners/BwAuthority/README.spec.txt |    8 ++++++++
 NetworkScanners/BwAuthority/aggregate.py    |   22 ++++++++++++++++++----
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/NetworkScanners/BwAuthority/README.spec.txt b/NetworkScanners/BwAuthority/README.spec.txt
index 175a9fb..64827cb 100644
--- a/NetworkScanners/BwAuthority/README.spec.txt
+++ b/NetworkScanners/BwAuthority/README.spec.txt
@@ -550,6 +550,14 @@
        Note that this parameter causes bwauthbestratio to have no 
        effect.
 
+    "bwauthmercy=1"
+       If present, we do not accumulate a negative pid_error_sum for
+       nodes with already negative pid_error. This prevents us from
+       punishing relays down to 0 bandwidth.
+
+       Note that this parameter has no effect unless you omit bwauthnsbw=1
+       and also set a bwauthti value of non-zero.
+
     "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 615a157..b3692e8 100755
--- a/NetworkScanners/BwAuthority/aggregate.py
+++ b/NetworkScanners/BwAuthority/aggregate.py
@@ -123,14 +123,16 @@ class Node:
                   + kd*self.use_bw*self.pid_delta
 
     self.prev_error = prev_vote.pid_error
-    # We decay the interval each round to keep it bounded.
-    # This decay is non-standard. We do it to avoid overflow
-    self.pid_error_sum = prev_vote.pid_error_sum*kidecay + self.pid_error
 
     self.pid_bw = self.use_bw \
                              + kp*self.use_bw*self.pid_error \
                              + ki*self.use_bw*self.integral_error() \
                              + kd*self.use_bw*self.d_error_dt()
+
+    # We decay the interval each round to keep it bounded.
+    # This decay is non-standard. We do it to avoid overflow
+    self.pid_error_sum = prev_vote.pid_error_sum*kidecay + self.pid_error
+
     return self.pid_bw
 
   def node_class(self):
@@ -238,6 +240,7 @@ class ConsensusJunk:
     self.use_circ_fails = False
     self.use_best_ratio = True
     self.use_desc_bw = True
+    self.use_mercy = False
 
     self.K_p = K_p
     self.T_i = T_i
@@ -252,7 +255,7 @@ class ConsensusJunk:
           self.bwauth_pid_control = False
         elif p == "bwauthnsbw=1":
           self.use_desc_bw = False
-          plog("INFO", "Using descriptor bandwidth")
+          plog("INFO", "Using NS bandwidth directly for feedback")
         elif p == "bwauthcircs=1":
           self.use_circ_fails = True
           plog("INFO", "Counting circuit failures")
@@ -265,6 +268,9 @@ class ConsensusJunk:
         elif p == "bwauthpidtgt=1":
           self.use_pid_tgt = True
           plog("INFO", "Using filtered PID target")
+        elif p == "bwauthmercy=1":
+          self.use_mercy = True
+          plog("INFO", "Showing mercy on gimpy nodes")
         elif p.startswith("bwauthkp="):
           self.K_p = int(p.split("=")[1])/10000.0
           plog("INFO", "Got K_p=%f from consensus." % self.K_p)
@@ -573,6 +579,14 @@ def main(argv):
         if circ_error < 0:
           n.pid_error = min(circ_error,n.pid_error)
 
+      # Don't punish gimpy nodes too hard
+      if cs_junk.use_mercy:
+        if not cs_junk.use_desc_bw:
+          plog("WARN",
+               "Can't be merciful w/ NS feedback! Set bwauthnsbw=0 and bwauthti!=0")
+        if n.pid_error_sum < 0 and n.pid_error < 0:
+          n.pid_error_sum = 0
+
       if n.idhex in prev_votes.vote_map:
         # If there is a new sample, let's use it for all but guards
         if n.measured_at > prev_votes.vote_map[n.idhex].measured_at:



More information about the tor-commits mailing list