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.
This commit is contained in:
Sebastian Hahn 2011-04-19 16:00:41 +02:00 committed by Nick Mathewson
parent 13c3884ff6
commit 3f7f96d9e7
2 changed files with 21 additions and 3 deletions

5
changes/bug2704_part2 Normal file
View File

@ -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.

View File

@ -1686,11 +1686,24 @@ rep_hist_load_bwhist_state_section(bw_array_t *b,
} }
if (start < now) { 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; b->max_total = mv;
/* This will result in some fairly choppy history if s_interval /* This will result in some fairly choppy history if s_interval
* is not the same as NUM_SECS_BW_SUM_INTERVAL. XXXX */ * is not the same as NUM_SECS_BW_SUM_INTERVAL. XXXX */
start += s_interval; start += actual_interval_len;
} }
} SMARTLIST_FOREACH_END(cp); } SMARTLIST_FOREACH_END(cp);
} }