mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
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:
+11
-6
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user