summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@fscked.org>2010-06-15 14:46:01 -0700
committerMike Perry <mikeperry-git@fscked.org>2010-06-15 20:04:46 -0700
commit82922ea45a24e7f79ac4c1ddf4d9de02c604546d (patch)
tree1ef4d303eb8b8edcc2bd1fb2fb6147b28763649f
parentc6c8fbf852bb2ecee6387609e8cbf78a772c7e01 (diff)
downloadtor-82922ea45a24e7f79ac4c1ddf4d9de02c604546d.tar.gz
tor-82922ea45a24e7f79ac4c1ddf4d9de02c604546d.zip
Be more proactive about closing unused circuits.
We need to ensure that we close timeout measurement circuits. While we're at it, we should close really old circuits of certain types that aren't in use, and log really old circuits of other types.
-rw-r--r--src/or/circuituse.c30
-rw-r--r--src/or/or.h3
2 files changed, 23 insertions, 10 deletions
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 5027eb5a28..0187448aaa 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -717,17 +717,27 @@ circuit_expire_old_circuits_clientside(time_t now)
circ->n_circ_id, (int)(now - circ->timestamp_dirty),
circ->purpose);
circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
- // XXX: Do we ever mark non-dirty odd-purpose circuits for close?
- // XXX: See irc backlog. Want to log for those circuits not mentioned.
- // But remember to add flag. this is called 1x/sec
- } else if (!circ->timestamp_dirty &&
- circ->state == CIRCUIT_STATE_OPEN &&
- circ->purpose == CIRCUIT_PURPOSE_C_GENERAL) {
+ } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) {
if (circ->timestamp_created < cutoff) {
- log_debug(LD_CIRC,
- "Closing circuit that has been unused for %d seconds.",
- (int)(now - circ->timestamp_created));
- circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
+ if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL ||
+ circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT ||
+ circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
+ circ->purpose == CIRCUIT_PURPOSE_TESTING ||
+ (circ->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
+ circ->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) ||
+ circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) {
+ log_debug(LD_CIRC,
+ "Closing circuit that has been unused for %d seconds.",
+ (int)(now - circ->timestamp_created));
+ circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
+ } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) {
+ log_notice(LD_CIRC,
+ "Ancient non-dirty circuit %d is still around after "
+ "%ld seconds.",
+ TO_ORIGIN_CIRCUIT(circ)->global_identifier,
+ now - circ->timestamp_created);
+ TO_ORIGIN_CIRCUIT(circ)->is_ancient = 1;
+ }
}
}
}
diff --git a/src/or/or.h b/src/or/or.h
index e1483e6466..cd6841522b 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2157,6 +2157,9 @@ typedef struct origin_circuit_t {
* to the specification? */
unsigned int remaining_relay_early_cells : 4;
+ /** Set if this circuit insanely old and if we already informed the user */
+ unsigned int is_ancient : 1;
+
/** What commands were sent over this circuit that decremented the
* RELAY_EARLY counter? This is for debugging task 878. */
uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT];