Browse Source

r17949@catbus: nickm | 2008-02-06 13:21:12 -0500
Fix bandwidth bucked calculations again, I think. Bugfix on 0.1.2.x. Backport candidate.


svn:r13406

Nick Mathewson 17 years ago
parent
commit
6e2946fb5d
2 changed files with 15 additions and 7 deletions
  1. 2 0
      ChangeLog
  2. 13 7
      src/or/connection.c

+ 2 - 0
ChangeLog

@@ -47,6 +47,8 @@ Changes in version 0.2.0.19-alpha - 2008-02-??
     - If an attempt to launch a DNS resolve request over the control
     - If an attempt to launch a DNS resolve request over the control
       port fails because we have overrun the limit on the number of
       port fails because we have overrun the limit on the number of
       connections, tell the controller that the request has failed.
       connections, tell the controller that the request has failed.
+    - Avoid using too little bandwidth when Tor skips a few seconds.  Bugfix
+      on 0.1.2.x.
 
 
   o Code simplifications and refactoring:
   o Code simplifications and refactoring:
     - Remove some needless generality from cpuworker code, for improved
     - Remove some needless generality from cpuworker code, for improved

+ 13 - 7
src/or/connection.c

@@ -1659,13 +1659,19 @@ connection_bucket_refill_helper(int *bucket, int rate, int burst,
                                 int seconds_elapsed, const char *name)
                                 int seconds_elapsed, const char *name)
 {
 {
   int starting_bucket = *bucket;
   int starting_bucket = *bucket;
-  if (starting_bucket < burst) {
-    int incr = rate*seconds_elapsed;
-    *bucket += incr;
-    if (*bucket > burst || *bucket < starting_bucket) {
-      /* If we overflow the burst, or underflow our starting bucket,
-       * cap the bucket value to burst. */
-      *bucket = burst;
+  if (starting_bucket < burst && seconds_elapsed) {
+    if (((burst - starting_bucket)/seconds_elapsed) < rate) {
+      *bucket = burst;  /* We would overflow the bucket; just set it to
+                         * the maximum. */
+    } else {
+      int incr = rate*seconds_elapsed;
+      *bucket += incr;
+      if (*bucket > burst || *bucket < starting_bucket) {
+        /* If we overflow the burst, or underflow our starting bucket,
+         * cap the bucket value to burst. */
+        /* XXXX020 this might be redundant now. */
+        *bucket = burst;
+      }
     }
     }
     log(LOG_DEBUG, LD_NET,"%s now %d.", name, *bucket);
     log(LOG_DEBUG, LD_NET,"%s now %d.", name, *bucket);
   }
   }