Don't update AccountingSoftLimitHitAt on startup

Add a "default" state which we use until we've decided whether we're
live or hibernating. This allows us to properly track whether we're
resuming a hibernation period or not. Fixes bug 2003.
This commit is contained in:
Sebastian Hahn 2011-09-01 05:21:50 +02:00
parent cc33ac362b
commit d10ae9c028
2 changed files with 21 additions and 5 deletions

8
changes/bug2003 Normal file
View File

@ -0,0 +1,8 @@
o Major bugfixes:
- Don't update the AccountingSoftLimitHitAt state file entry whenever
tor gets started. This prevents a wrong average bandwidth estimate,
which would cause relays to always start a new accounting interval at
the earliest possible moment. Fixes bug 2003; bugfix on 0.2.2.7-alpha.
Reported by BryonEldridge, who also helped immensely in tracking this
bug down. Thanks!

View File

@ -41,14 +41,17 @@ typedef enum {
HIBERNATE_STATE_LOWBANDWIDTH=3, HIBERNATE_STATE_LOWBANDWIDTH=3,
/** We are hibernating, and we won't wake up till there's more bandwidth to /** We are hibernating, and we won't wake up till there's more bandwidth to
* use. */ * use. */
HIBERNATE_STATE_DORMANT=4 HIBERNATE_STATE_DORMANT=4,
/** We start out in state default, which means we havent decided which state
* we're in. */
HIBERNATE_STATE_INITIAL=5
} hibernate_state_t; } hibernate_state_t;
extern long stats_n_seconds_working; /* published uptime */ extern long stats_n_seconds_working; /* published uptime */
/** Are we currently awake, asleep, running out of bandwidth, or shutting /** Are we currently awake, asleep, running out of bandwidth, or shutting
* down? */ * down? */
static hibernate_state_t hibernate_state = HIBERNATE_STATE_LIVE; static hibernate_state_t hibernate_state = HIBERNATE_STATE_INITIAL;
/** If are hibernating, when do we plan to wake up? Set to 0 if we /** If are hibernating, when do we plan to wake up? Set to 0 if we
* aren't hibernating. */ * aren't hibernating. */
static time_t hibernate_end_time = 0; static time_t hibernate_end_time = 0;
@ -804,9 +807,11 @@ static void
hibernate_end(hibernate_state_t new_state) hibernate_end(hibernate_state_t new_state)
{ {
tor_assert(hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH || tor_assert(hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH ||
hibernate_state == HIBERNATE_STATE_DORMANT); hibernate_state == HIBERNATE_STATE_DORMANT ||
hibernate_state == HIBERNATE_STATE_INITIAL);
/* listeners will be relaunched in run_scheduled_events() in main.c */ /* listeners will be relaunched in run_scheduled_events() in main.c */
if (hibernate_state != HIBERNATE_STATE_INITIAL)
log_notice(LD_ACCT,"Hibernation period ended. Resuming normal activity."); log_notice(LD_ACCT,"Hibernation period ended. Resuming normal activity.");
hibernate_state = new_state; hibernate_state = new_state;
@ -939,7 +944,8 @@ consider_hibernation(time_t now)
/* Else, we aren't hibernating. See if it's time to start hibernating, or to /* Else, we aren't hibernating. See if it's time to start hibernating, or to
* go dormant. */ * go dormant. */
if (hibernate_state == HIBERNATE_STATE_LIVE) { if (hibernate_state == HIBERNATE_STATE_LIVE ||
hibernate_state == HIBERNATE_STATE_INITIAL) {
if (hibernate_soft_limit_reached()) { if (hibernate_soft_limit_reached()) {
log_notice(LD_ACCT, log_notice(LD_ACCT,
"Bandwidth soft limit reached; commencing hibernation. " "Bandwidth soft limit reached; commencing hibernation. "
@ -951,6 +957,8 @@ consider_hibernation(time_t now)
"Commencing hibernation. We will wake up at %s local time.", "Commencing hibernation. We will wake up at %s local time.",
buf); buf);
hibernate_go_dormant(now); hibernate_go_dormant(now);
} else if (hibernate_state == HIBERNATE_STATE_INITIAL) {
hibernate_end(HIBERNATE_STATE_LIVE);
} }
} }