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 16 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
       port fails because we have overrun the limit on the number of
       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:
     - 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 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);
   }