mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 06:13:31 +01:00
close idle dir-fetch circs early
This commit is contained in:
parent
6ad09cc6af
commit
cb31978adb
7
changes/close_begindir_circs
Normal file
7
changes/close_begindir_circs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
o Major bugfixes:
|
||||||
|
- Relays now close idle circuits early if it looks like they were
|
||||||
|
intended for directory fetches. Such circuits are unlikely to
|
||||||
|
be re-used, and tens of thousands of them were piling up at the
|
||||||
|
fast relays, causing the relays to run out of sockets and memory.
|
||||||
|
Bugfix on 0.2.0.22-rc (where clients started tunneling their
|
||||||
|
directory fetches over TLS).
|
@ -17,7 +17,7 @@ extern circuit_t *global_circuitlist; /* from circuitlist.c */
|
|||||||
|
|
||||||
/********* END VARIABLES ************/
|
/********* END VARIABLES ************/
|
||||||
|
|
||||||
static void circuit_expire_old_circuits(time_t now);
|
static void circuit_expire_old_circuits_clientside(time_t now);
|
||||||
static void circuit_increment_failure_count(void);
|
static void circuit_increment_failure_count(void);
|
||||||
|
|
||||||
/** Return 1 if <b>circ</b> could be returned by circuit_get_best().
|
/** Return 1 if <b>circ</b> could be returned by circuit_get_best().
|
||||||
@ -544,7 +544,7 @@ circuit_build_needed_circs(time_t now)
|
|||||||
time_to_new_circuit = now + options->NewCircuitPeriod;
|
time_to_new_circuit = now + options->NewCircuitPeriod;
|
||||||
if (proxy_mode(get_options()))
|
if (proxy_mode(get_options()))
|
||||||
addressmap_clean(now);
|
addressmap_clean(now);
|
||||||
circuit_expire_old_circuits(now);
|
circuit_expire_old_circuits_clientside(now);
|
||||||
|
|
||||||
#if 0 /* disable for now, until predict-and-launch-new can cull leftovers */
|
#if 0 /* disable for now, until predict-and-launch-new can cull leftovers */
|
||||||
circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL);
|
circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL);
|
||||||
@ -628,7 +628,7 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn)
|
|||||||
* for too long and has no streams on it: mark it for close.
|
* for too long and has no streams on it: mark it for close.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
circuit_expire_old_circuits(time_t now)
|
circuit_expire_old_circuits_clientside(time_t now)
|
||||||
{
|
{
|
||||||
circuit_t *circ;
|
circuit_t *circ;
|
||||||
time_t cutoff = now - get_options()->CircuitIdleTimeout;
|
time_t cutoff = now - get_options()->CircuitIdleTimeout;
|
||||||
@ -660,6 +660,53 @@ circuit_expire_old_circuits(time_t now)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** How long do we wait before killing circuits with the properties
|
||||||
|
* described below?
|
||||||
|
*
|
||||||
|
* Probably we could choose a number here as low as 5 to 10 seconds,
|
||||||
|
* since these circs are used for begindir, and a) generally you either
|
||||||
|
* ask another begindir question right after or you don't for a long time,
|
||||||
|
* b) clients at least through 0.2.1.x choose from the whole set of
|
||||||
|
* directory mirrors at each choice, and c) re-establishing a one-hop
|
||||||
|
* circuit via create-fast is a light operation assuming the TLS conn is
|
||||||
|
* still there.
|
||||||
|
*
|
||||||
|
* I expect "b" to go away one day when we move to using directory
|
||||||
|
* guards, but I think "a" and "c" are good enough reasons that a low
|
||||||
|
* number is safe even then.
|
||||||
|
*/
|
||||||
|
#define IDLE_ONE_HOP_CIRC_TIMEOUT 60
|
||||||
|
|
||||||
|
/** Find each non-origin circuit that has been unused for too long,
|
||||||
|
* has no streams on it, used a create_fast, and ends here: mark it
|
||||||
|
* for close.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
circuit_expire_old_circuits_serverside(time_t now)
|
||||||
|
{
|
||||||
|
circuit_t *circ;
|
||||||
|
or_circuit_t *or_circ;
|
||||||
|
time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT;
|
||||||
|
|
||||||
|
for (circ = global_circuitlist; circ; circ = circ->next) {
|
||||||
|
if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ))
|
||||||
|
continue;
|
||||||
|
or_circ = TO_OR_CIRCUIT(circ);
|
||||||
|
/* If the circuit has been idle for too long, and there are no streams
|
||||||
|
* on it, and it ends here, and it used a create_fast, mark it for close.
|
||||||
|
*/
|
||||||
|
if (or_circ->is_first_hop && !circ->n_conn &&
|
||||||
|
!or_circ->n_streams && !or_circ->resolving_streams &&
|
||||||
|
or_circ->p_conn &&
|
||||||
|
or_circ->p_conn->timestamp_last_added_nonpadding <= cutoff) {
|
||||||
|
log_info(LD_CIRC, "Closing circ_id %d (empty %d secs ago)",
|
||||||
|
or_circ->p_circ_id,
|
||||||
|
(int)(now - or_circ->p_conn->timestamp_last_added_nonpadding));
|
||||||
|
circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Number of testing circuits we want open before testing our bandwidth. */
|
/** Number of testing circuits we want open before testing our bandwidth. */
|
||||||
#define NUM_PARALLEL_TESTING_CIRCS 4
|
#define NUM_PARALLEL_TESTING_CIRCS 4
|
||||||
|
|
||||||
|
@ -1058,6 +1058,10 @@ run_scheduled_events(time_t now)
|
|||||||
if (have_dir_info && !we_are_hibernating())
|
if (have_dir_info && !we_are_hibernating())
|
||||||
circuit_build_needed_circs(now);
|
circuit_build_needed_circs(now);
|
||||||
|
|
||||||
|
/* every 10 seconds, but not at the same second as other such events */
|
||||||
|
if (now % 10 == 5)
|
||||||
|
circuit_expire_old_circuits_serverside(now);
|
||||||
|
|
||||||
/** 5. We do housekeeping for each connection... */
|
/** 5. We do housekeeping for each connection... */
|
||||||
connection_or_set_bad_connections();
|
connection_or_set_bad_connections();
|
||||||
for (i=0;i<smartlist_len(connection_array);i++) {
|
for (i=0;i<smartlist_len(connection_array);i++) {
|
||||||
|
@ -2834,6 +2834,8 @@ int circuit_conforms_to_options(const origin_circuit_t *circ,
|
|||||||
void circuit_build_needed_circs(time_t now);
|
void circuit_build_needed_circs(time_t now);
|
||||||
void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn);
|
void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn);
|
||||||
|
|
||||||
|
void circuit_expire_old_circuits_serverside(time_t now);
|
||||||
|
|
||||||
void reset_bandwidth_test(void);
|
void reset_bandwidth_test(void);
|
||||||
int circuit_enough_testing_circs(void);
|
int circuit_enough_testing_circs(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user