Fix a major load balance bug: we were round-robining in 16 KB chunks, and

servers with bandwidthrate of 20 KB, while downloading a 600 KB directory,
would starve their other connections. Now we try to be a bit more fair.


svn:r5906
This commit is contained in:
Roger Dingledine
2006-02-04 08:58:51 +00:00
parent 032a01ef64
commit 640c555f02
+11 -6
View File
@@ -988,13 +988,18 @@ static int
connection_bucket_read_limit(connection_t *conn)
{
int at_most;
int base = connection_speaks_cells(conn) ?
CELL_NETWORK_SIZE : RELAY_PAYLOAD_SIZE;
/* do a rudimentary round-robin so one circuit can't hog a connection */
if (connection_speaks_cells(conn)) {
at_most = 32*(CELL_NETWORK_SIZE);
} else {
at_most = 32*(RELAY_PAYLOAD_SIZE);
}
/* Do a rudimentary round-robin so one circuit can't hog a connection.
* Pick at most 32 cells, at least 4 cells if possible, and if we're in
* the middle pick 1/8 of the available bandwidth. */
at_most = global_read_bucket / 8;
at_most -= (at_most % base); /* round down */
if (at_most > 32*base) /* 16 KB */
at_most = 32*base;
else if (at_most < 4*base) /* 2 KB */
at_most = 4*base;
if (at_most > global_read_bucket)
at_most = global_read_bucket;