From 13c3884ff60aa0e58464f379f988683f1c30438a Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Tue, 19 Apr 2011 17:12:27 +0200 Subject: [PATCH 1/2] Don't sometimes undercount bw average This fixes the first part of bug 2704. It should occur only rarely when no bw maxima are known. Bugfix on 0.2.2.23-alpha. Fixes bug 2704. --- changes/bug2704_part1 | 5 +++++ src/or/rephist.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 changes/bug2704_part1 diff --git a/changes/bug2704_part1 b/changes/bug2704_part1 new file mode 100644 index 0000000000..eaf22812cc --- /dev/null +++ b/changes/bug2704_part1 @@ -0,0 +1,5 @@ + o Minor bugfixes: + - Fix an issue causing calculation of Tor's average bandwidth as saved + in the state file to be 10 times smaller than it should be. Fixes the + first part of bug 2704, bugfix on tor-0.2.2.23-alpha. + diff --git a/src/or/rephist.c b/src/or/rephist.c index 9b7eefecf2..6034bbcb2b 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -1673,7 +1673,7 @@ rep_hist_load_bwhist_state_section(bw_array_t *b, mv *= NUM_SECS_ROLLING_MEASURE; } else { /* No maxima known; guess average rate to be conservative. */ - mv = v / s_interval; + mv = (v / s_interval) * NUM_SECS_ROLLING_MEASURE; } if (!ok) { retval = -1; From 3f7f96d9e7aa2254d62d63530c37ee96d4b3abc8 Mon Sep 17 00:00:00 2001 From: Sebastian Hahn Date: Tue, 19 Apr 2011 16:00:41 +0200 Subject: [PATCH 2/2] 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. --- changes/bug2704_part2 | 5 +++++ src/or/rephist.c | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 changes/bug2704_part2 diff --git a/changes/bug2704_part2 b/changes/bug2704_part2 new file mode 100644 index 0000000000..962c8b7099 --- /dev/null +++ b/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. + diff --git a/src/or/rephist.c b/src/or/rephist.c index 6034bbcb2b..fb091d5adf 100644 --- a/src/or/rephist.c +++ b/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); }