Merge branch 'bug2756_relay' into maint-0.2.2

This commit is contained in:
Nick Mathewson 2011-03-15 17:13:07 -04:00
commit c5ffd44ccd
5 changed files with 34 additions and 2 deletions

11
changes/bug2756 Normal file
View File

@ -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).

View File

@ -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;

View File

@ -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.
*

View File

@ -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);

View File

@ -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.