Loading changes/bug2756 0 → 100644 +11 −0 Original line number Diff line number Diff line 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). src/or/connection.c +2 −0 Original line number Diff line number Diff line Loading @@ -3648,6 +3648,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; Loading src/or/connection_edge.c +17 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading src/or/connection_edge.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading src/or/relay.c +3 −2 Original line number Diff line number Diff line Loading @@ -1403,8 +1403,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. Loading Loading
changes/bug2756 0 → 100644 +11 −0 Original line number Diff line number Diff line 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).
src/or/connection.c +2 −0 Original line number Diff line number Diff line Loading @@ -3648,6 +3648,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; Loading
src/or/connection_edge.c +17 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading
src/or/connection_edge.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
src/or/relay.c +3 −2 Original line number Diff line number Diff line Loading @@ -1403,8 +1403,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. Loading