diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-11-06 19:58:06 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-11-06 19:58:06 +0000 |
commit | fad1656a7ff2a40eb35a816661581f1a3f23b128 (patch) | |
tree | 7d27bc3e7c2bcf1f8b19c16e9d65e9d441f9faf5 | |
parent | 897f64c95d18c5eb988ae2cc98fa24049fea49a7 (diff) | |
download | tor-fad1656a7ff2a40eb35a816661581f1a3f23b128.tar.gz tor-fad1656a7ff2a40eb35a816661581f1a3f23b128.zip |
r16467@catbus: nickm | 2007-11-06 14:57:00 -0500
Backport r12400 and r12401: Do not allow buckets to overflow.
svn:r12402
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | src/or/connection.c | 12 |
2 files changed, 11 insertions, 3 deletions
@@ -30,6 +30,8 @@ Changes in version 0.1.2.18 - 2007-10-28 that it shouldn't be considered to exist at all anymore. Now we clear all the flags for routers that fall out of the networkstatus consensus. Fixes bug 529. + - When the clock jumps forward a lot, do not allow the bandwidth + buckets to become negative. Fixes Bug 544. o Minor bugfixes: - Don't try to access (or alter) the state file when running diff --git a/src/or/connection.c b/src/or/connection.c index e7c2365595..04fe25dce2 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1328,15 +1328,19 @@ connection_bucket_refill(int seconds_elapsed) /* refill the global buckets */ if (global_read_bucket < (int)options->BandwidthBurst) { + int initial_read_bucket = global_read_bucket; global_read_bucket += (int)options->BandwidthRate*seconds_elapsed; - if (global_read_bucket > (int)options->BandwidthBurst) + if (global_read_bucket > (int)options->BandwidthBurst || + global_read_bucket < initial_read_bucket) global_read_bucket = (int)options->BandwidthBurst; log(LOG_DEBUG, LD_NET,"global_read_bucket now %d.", global_read_bucket); } if (global_write_bucket < (int)options->BandwidthBurst) { + int initial_write_bucket = global_write_bucket; global_write_bucket_empty_last_second = global_write_bucket == 0; global_write_bucket += (int)options->BandwidthRate*seconds_elapsed; - if (global_write_bucket > (int)options->BandwidthBurst) + if (global_write_bucket > (int)options->BandwidthBurst || + global_write_bucket < initial_write_bucket) global_write_bucket = (int)options->BandwidthBurst; log(LOG_DEBUG, LD_NET,"global_write_bucket now %d.", global_write_bucket); } @@ -1349,8 +1353,10 @@ connection_bucket_refill(int seconds_elapsed) if (connection_speaks_cells(conn)) { or_connection_t *or_conn = TO_OR_CONN(conn); if (connection_read_bucket_should_increase(or_conn)) { + int initial_read_bucket = or_conn->read_bucket; or_conn->read_bucket += or_conn->bandwidthrate*seconds_elapsed; - if (or_conn->read_bucket > or_conn->bandwidthburst) + if (or_conn->read_bucket > or_conn->bandwidthburst || + or_conn->read_bucket < initial_read_bucket) or_conn->read_bucket = or_conn->bandwidthburst; //log_fn(LOG_DEBUG,"Receiver bucket %d now %d.", i, // conn->read_bucket); |