summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2018-10-17 12:25:12 -0400
committerDavid Goulet <dgoulet@torproject.org>2018-10-17 12:25:12 -0400
commit2000d04cb67fa1ee88105e61666dceba40b8c368 (patch)
tree985e6798894c1642e1a1bab97378cc74336412f5
parentb5731cdf2ecdf0662de7268d95aa67cfaca92b6e (diff)
downloadtor-2000d04cb67fa1ee88105e61666dceba40b8c368.tar.gz
tor-2000d04cb67fa1ee88105e61666dceba40b8c368.zip
conn: Stop writing when our write bandwidth limist is exhausted
Commit 488e2b00bf881b97bcc8e4bbe304845ff1d79a03 introduced an issue, most likely introduced by a bad copy paste, that made us stop reading on the connection if our write bandwidth limit was reached. The problem is that because "read_blocked_on_bw" was never set, the connection was never reenabled for reading. This is most likely the cause of #27813 where bytes were accumulating in the kernel TCP bufers because tor was not doing reads. Only relays with RelayBandwidthRate would suffer from this but affecting all relays connecting to them. And using that tor option is recommended and best practice so many many relays have it enabled. Fixes #28089.
-rw-r--r--changes/ticket280896
-rw-r--r--src/or/connection.c2
2 files changed, 7 insertions, 1 deletions
diff --git a/changes/ticket28089 b/changes/ticket28089
new file mode 100644
index 0000000000..a900ec18f5
--- /dev/null
+++ b/changes/ticket28089
@@ -0,0 +1,6 @@
+ o Major bugfixes (relay):
+ - When our write bandwidth limit is exhausted, stop writing on the
+ connection. Previously, we had a typo in the code that would make us stop
+ reading leading to relay connections being stuck indefinitely. Fixes bug
+ 28089; bugfix on 0.3.4.1-alpha.
+
diff --git a/src/or/connection.c b/src/or/connection.c
index 7283a81043..0a2a635096 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -3111,7 +3111,7 @@ connection_write_bw_exhausted(connection_t *conn, bool is_global_bw)
{
(void)is_global_bw;
conn->write_blocked_on_bw = 1;
- connection_stop_reading(conn);
+ connection_stop_writing(conn);
reenable_blocked_connection_schedule();
}