Use a more sophisticated soft-hibernation-limit calculation

This should help address bug 1789.
This commit is contained in:
Nick Mathewson 2010-09-03 13:43:59 -04:00
parent 17ebddbbdc
commit d0acaac781
2 changed files with 29 additions and 2 deletions

8
changes/bug1789 Normal file
View File

@ -0,0 +1,8 @@
o Minor features:
- Be more generous with how much bandwidth we'd use up (with
accounting enabled) before entering "soft hibernation".
Previously, we'd hibernate once we'd used up 95% of our allotment.
Now, we use up 95% of our allotment, AND make sure that we have
no more than 500MB/3 hours of traffic remaining before we enter
soft hibernation.

View File

@ -637,8 +637,27 @@ hibernate_hard_limit_reached(void)
static int static int
hibernate_soft_limit_reached(void) hibernate_soft_limit_reached(void)
{ {
uint64_t soft_limit = DBL_TO_U64(U64_TO_DBL(get_options()->AccountingMax) const uint64_t acct_max = get_options()->AccountingMax;
* .95); #define SOFT_LIM_PCT (.95)
#define SOFT_LIM_BYTES (500*1024*1024)
#define SOFT_LIM_MINUTES (3*60)
/* The 'soft limit' is a fair bit more complicated now than once it was.
* We want to stop accepting connections when ALL of the following are true:
* - We expect to use up the remaining bytes in under 3 hours
* - We have used up 95% of our bytes.
* - We have less than 500MB of bytes left.
*/
uint64_t soft_limit = DBL_TO_U64(U64_TO_DBL(acct_max) * SOFT_LIM_PCT);
if (acct_max > SOFT_LIM_BYTES && acct_max - SOFT_LIM_BYTES > soft_limit) {
soft_limit = acct_max - SOFT_LIM_BYTES;
}
if (expected_bandwidth_usage) {
const uint64_t expected_usage =
expected_bandwidth_usage * SOFT_LIM_MINUTES;
if (acct_max > expected_usage && acct_max - expected_usage > soft_limit)
soft_limit = acct_max - expected_usage;
}
if (!soft_limit) if (!soft_limit)
return 0; return 0;
return n_bytes_read_in_interval >= soft_limit return n_bytes_read_in_interval >= soft_limit