diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-08-18 14:14:28 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-08-18 14:33:41 -0400 |
commit | 80391b88a58a747fe6ac326442557a827e350d4f (patch) | |
tree | 504fc58e94a67146852c494e245f9c41d5e769bd /src/or | |
parent | 4dd3245abb32066e025bbf00e22dd40f4fc605cb (diff) | |
download | tor-80391b88a58a747fe6ac326442557a827e350d4f.tar tor-80391b88a58a747fe6ac326442557a827e350d4f.tar.gz |
Decide whether to ignore SENDMEs based on streams_blocked, not queue size
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/relay.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/src/or/relay.c b/src/or/relay.c index bc17b6d12..c123eb397 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -52,8 +52,7 @@ circuit_resume_edge_reading_helper(edge_connection_t *conn, crypt_path_t *layer_hint); static int circuit_consider_stop_edge_reading(circuit_t *circ, crypt_path_t *layer_hint); -static int -circuit_queue_high(circuit_t *circ); +static int circuit_queue_streams_are_blocked(circuit_t *circ); /** Cache the current hi-res time; the cache gets reset when libevent * calls us. */ @@ -1238,7 +1237,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, conn->package_window += STREAMWINDOW_INCREMENT; log_debug(domain,"stream-level sendme, packagewindow now %d.", conn->package_window); - if (circuit_queue_high(circ)) { /* Too high, don't touch conn */ + if (circuit_queue_streams_are_blocked(circ)) { + /* Still waiting for queue to flush; don't touch conn */ return 0; } connection_start_reading(TO_CONN(conn)); @@ -1441,8 +1441,7 @@ connection_edge_consider_sending_sendme(edge_connection_t *conn) static void circuit_resume_edge_reading(circuit_t *circ, crypt_path_t *layer_hint) { - - if (circuit_queue_high(circ)) { + if (circuit_queue_streams_are_blocked(circ)) { log_debug(layer_hint?LD_APP:LD_EXIT,"Too big queue, no resuming"); return; } @@ -2414,24 +2413,15 @@ assert_active_circuits_ok(or_connection_t *orconn) tor_assert(n == smartlist_len(orconn->active_circuit_pqueue)); } -/** Return 1 if the number of cells waiting on the queue - * more than a watermark or equal it. Else return 0. - * XXXY: Only for edges: origin and exit. Middles out of luck for such, - * need the proposal. +/** Return 1 if we shouldn't restart reading on this circuit, even if + * we get a SENDME. Else return 0. */ static int -circuit_queue_high(circuit_t *circ) +circuit_queue_streams_are_blocked(circuit_t *circ) { - cell_queue_t *queue; - if (CIRCUIT_IS_ORIGIN(circ)) { - queue = &circ->n_conn_cells; + return circ->streams_blocked_on_n_conn; } else { - or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); - queue = &orcirc->p_conn_cells; + return circ->streams_blocked_on_p_conn; } - - if (queue->n >= CELL_QUEUE_HIGHWATER_SIZE) - return 1; - return 0; } |