diff --git a/ChangeLog b/ChangeLog index 906b4bf9c..3e4ae02b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -30,6 +30,9 @@ Changes in version 0.2.0.28-rc - 2008-06-13 bug 688, reported by mfr. - When we haven't had any application requests lately, don't bother logging that we have expired a bunch of descriptors. + - Make relay cells written on a connection count as non-padding when + tracking how long a connection has been in use. Bugfix on + 0.2.0.1-alpha. Spotted by lodger. - Fix unit tests in 0.2.0.27-rc. - Fix compile on Windows. diff --git a/doc/TODO.020 b/doc/TODO.020 index ed1673159..f28148c8f 100644 --- a/doc/TODO.020 +++ b/doc/TODO.020 @@ -16,7 +16,7 @@ Backport items for 0.2.0: o r14205: free authority certs on exit. o r14212: free static hashtables and log mutex on exit. o r14214: don't read torrc when all we do is --hash-password - - r14329: update last_added_nonpadding for relay cells. + o r14329: update last_added_nonpadding for relay cells. - r14247: tor-spec and dir-spec updates [just backport the whole files] Backport for 0.2.0 once better tested: diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 5d9800d09..00217f2dc 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -285,13 +285,15 @@ int connection_or_flushed_some(or_connection_t *conn) { size_t datalen = buf_datalen(conn->_base.outbuf); + time_t now = time(NULL); /* If we're under the low water mark, add cells until we're just over the * high water mark. */ if (datalen < OR_CONN_LOWWATER) { ssize_t n = (OR_CONN_HIGHWATER - datalen + CELL_NETWORK_SIZE-1) / CELL_NETWORK_SIZE; while (conn->active_circuits && n > 0) { - int flushed = connection_or_flush_from_first_active_circuit(conn, 1); + int flushed; + flushed = connection_or_flush_from_first_active_circuit(conn, 1, now); n -= flushed; } } diff --git a/src/or/or.h b/src/or/or.h index ba7bdf9bd..6e7654ca1 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -3557,7 +3557,7 @@ void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn, cell_t *cell, int direction); void connection_or_unlink_all_active_circs(or_connection_t *conn); int connection_or_flush_from_first_active_circuit(or_connection_t *conn, - int max); + int max, time_t now); void assert_active_circuits_ok(or_connection_t *orconn); void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn); void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn); diff --git a/src/or/relay.c b/src/or/relay.c index 91f7f167b..58b3d9eaf 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1833,7 +1833,8 @@ set_streams_blocked_on_circ(circuit_t *circ, or_connection_t *orconn, * conn->outbuf. Return the number of cells written. Advance * the active circuit pointer to the next active circuit in the ring. */ int -connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max) +connection_or_flush_from_first_active_circuit(or_connection_t *conn, + int max, time_t now) { int n_flushed; cell_queue_t *queue; @@ -1866,7 +1867,7 @@ connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max) * for us. */ assert_active_circuits_ok_paranoid(conn); - return n_flushed; + goto done; } } tor_assert(*next_circ_on_conn_p(circ,conn)); @@ -1883,6 +1884,9 @@ connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max) log_debug(LD_GENERAL, "Made a circuit inactive."); make_circuit_inactive_on_conn(circ, conn); } + done: + if (n_flushed) + conn->timestamp_last_added_nonpadding = now; return n_flushed; } @@ -1927,7 +1931,7 @@ append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn, * get called, and we can start putting more data onto the buffer then. */ log_debug(LD_GENERAL, "Primed a buffer."); - connection_or_flush_from_first_active_circuit(orconn, 1); + connection_or_flush_from_first_active_circuit(orconn, 1, time(NULL)); } }