Browse Source

Prevent hugely inflated observed bandwidth values

When reading the bw history from the state file, we'd add the 900-second
value as traffic that occured during one second. Fix that by adding the
average value to each second.

This bug was present since 0.2.0.5-alpha, but was hidden until
0.2.23-alpha when we started using the saved values.
Sebastian Hahn 14 years ago
parent
commit
3f7f96d9e7
2 changed files with 21 additions and 3 deletions
  1. 5 0
      changes/bug2704_part2
  2. 16 3
      src/or/rephist.c

+ 5 - 0
changes/bug2704_part2

@@ -0,0 +1,5 @@
+  o Major bugfixes:
+    - Prevent relays that read their bandwidth history from their state file
+      from arbitrarily inflating that value. Fixes the second half of bug
+      2704, bugfix on tor-0.2.2.23-alpha.
+

+ 16 - 3
src/or/rephist.c

@@ -1686,11 +1686,24 @@ rep_hist_load_bwhist_state_section(bw_array_t *b,
         }
 
         if (start < now) {
-          add_obs(b, start, v);
+          time_t cur_start = start;
+          time_t actual_interval_len = s_interval;
+          uint64_t cur_val = 0;
+          /* Calculate the average per second. This is the best we can do
+           * because our state file doesn't have per-second resolution. */
+          if (start + s_interval > now)
+            actual_interval_len = now - start;
+          cur_val = v / actual_interval_len;
+          /* This is potentially inefficient, but since we don't do it very
+           * often it should be ok. */
+          while (cur_start < start + actual_interval_len) {
+            add_obs(b, cur_start, cur_val);
+            ++cur_start;
+          }
           b->max_total = mv;
           /* This will result in some fairly choppy history if s_interval
-           * is notthe same as NUM_SECS_BW_SUM_INTERVAL. XXXX */
-          start += s_interval;
+           * is not the same as NUM_SECS_BW_SUM_INTERVAL. XXXX */
+          start += actual_interval_len;
         }
     } SMARTLIST_FOREACH_END(cp);
   }