summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-03-15 17:13:07 -0400
committerNick Mathewson <nickm@torproject.org>2011-03-15 17:13:07 -0400
commitc5ffd44ccd3c60780143eb384938276522a173c1 (patch)
treef2b43ecea11c04d7e85e63b2c8b81ee9449f5de3
parentab418447eb9838a8a6f5588e374910d753740d0f (diff)
parenta86e27cf00153f4d926ac2b0974d2cceb543d673 (diff)
downloadtor-c5ffd44ccd3c60780143eb384938276522a173c1.tar.gz
tor-c5ffd44ccd3c60780143eb384938276522a173c1.zip
Merge branch 'bug2756_relay' into maint-0.2.2
-rw-r--r--changes/bug275611
-rw-r--r--src/or/connection.c2
-rw-r--r--src/or/connection_edge.c17
-rw-r--r--src/or/connection_edge.h1
-rw-r--r--src/or/relay.c5
5 files changed, 34 insertions, 2 deletions
diff --git a/changes/bug2756 b/changes/bug2756
new file mode 100644
index 0000000000..0cad515a1b
--- /dev/null
+++ b/changes/bug2756
@@ -0,0 +1,11 @@
+ o Minor bugfixes (spec conformance, performance):
+ - We now ask the other side of a stream (the client or the exit)
+ for more data on that stream when the amount of queued data on
+ that stream dips low enough. Previously, we wouldn't ask the
+ other side for more data until either it sent us more data
+ (which it wasn't supposed to do if it had exhausted its
+ window!) or until we had completely flushed all our queued
+ data. Fixing this should improve throughput. Fixes bug 2756;
+ bugfix on the earliest released versions of Tor (svn commit
+ r152).
+
diff --git a/src/or/connection.c b/src/or/connection.c
index 1894bc71ca..c65c91b73b 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -3245,6 +3245,8 @@ connection_flushed_some(connection_t *conn)
r = connection_dirserv_flushed_some(TO_DIR_CONN(conn));
} else if (conn->type == CONN_TYPE_OR) {
r = connection_or_flushed_some(TO_OR_CONN(conn));
+ } else if (CONN_IS_EDGE(conn)) {
+ r = connection_edge_flushed_some(TO_EDGE_CONN(conn));
}
conn->in_flushed_some = 0;
return r;
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index f02479fd59..85a52257a8 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -301,6 +301,23 @@ connection_edge_end_errno(edge_connection_t *conn)
return connection_edge_end(conn, reason);
}
+/** We just wrote some data to <b>conn</b>; act appropriately.
+ *
+ * (That is, if it's open, consider sending a stream-level sendme cell if we
+ * have just flushed enough.)
+ */
+int
+connection_edge_flushed_some(edge_connection_t *conn)
+{
+ switch (conn->_base.state) {
+ case AP_CONN_STATE_OPEN:
+ case EXIT_CONN_STATE_OPEN:
+ connection_edge_consider_sending_sendme(conn);
+ break;
+ }
+ return 0;
+}
+
/** Connection <b>conn</b> has finished writing and has no bytes left on
* its outbuf.
*
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index fa5f91cf8d..0b08dd07ca 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -23,6 +23,7 @@ int connection_edge_process_inbuf(edge_connection_t *conn,
int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn);
int connection_edge_end(edge_connection_t *conn, uint8_t reason);
int connection_edge_end_errno(edge_connection_t *conn);
+int connection_edge_flushed_some(edge_connection_t *conn);
int connection_edge_finished_flushing(edge_connection_t *conn);
int connection_edge_finished_connecting(edge_connection_t *conn);
diff --git a/src/or/relay.c b/src/or/relay.c
index a6c25062a3..2510242256 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -1409,8 +1409,9 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial,
goto repeat_connection_edge_package_raw_inbuf;
}
-/** Called when we've just received a relay data cell, or when
- * we've just finished flushing all bytes to stream <b>conn</b>.
+/** Called when we've just received a relay data cell, when
+ * we've just finished flushing all bytes to stream <b>conn</b>,
+ * or when we've flushed *some* bytes to the stream <b>conn</b>.
*
* If conn->outbuf is not too full, and our deliver window is
* low, send back a suitable number of stream-level sendme cells.