summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2006-01-07 03:56:56 +0000
committerRoger Dingledine <arma@torproject.org>2006-01-07 03:56:56 +0000
commit1dd8ebf6154fa4273d0d6f8184c7697052c570ff (patch)
tree000dd8cf9d3dc15e2cc7d6d2395b9a33eaf776a3
parent9796733e89072eb26340c258219c38152d243e8e (diff)
downloadtor-1dd8ebf6154fa4273d0d6f8184c7697052c570ff.tar.gz
tor-1dd8ebf6154fa4273d0d6f8184c7697052c570ff.zip
bugfix: we were leaving open duplicate connections to other ORs
for a week, rather than closing them once we detect a duplicate. also, avoid some duplicate mark-for-closes in connection-housekeeping. svn:r5752
-rw-r--r--src/or/main.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/or/main.c b/src/or/main.c
index 640a502fad..81e0770d6c 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -592,9 +592,13 @@ run_connection_housekeeping(int i, time_t now)
if (conn->outbuf && !buf_datalen(conn->outbuf))
conn->timestamp_lastempty = now;
+ if (conn->marked_for_close) {
+ /* nothing to do here */
+ return;
+ }
+
/* Expire any directory connections that haven't sent anything for 5 min */
if (conn->type == CONN_TYPE_DIR &&
- !conn->marked_for_close &&
conn->timestamp_lastwritten + 5*60 < now) {
info(LD_DIR,"Expiring wedged directory conn (fd %d, purpose %d)",
conn->s, conn->purpose);
@@ -615,12 +619,20 @@ run_connection_housekeeping(int i, time_t now)
return; /* we're all done here, the rest is just for OR conns */
#define TIME_BEFORE_OR_CONN_IS_OBSOLETE (60*60*24*7) /* a week */
- if (!conn->is_obsolete &&
- conn->timestamp_created + TIME_BEFORE_OR_CONN_IS_OBSOLETE < now) {
- info(LD_OR, "Marking OR conn to %s:%d obsolete (fd %d, %d secs old).",
- conn->address, conn->port, conn->s,
- (int)(now - conn->timestamp_created));
- conn->is_obsolete = 1;
+ if (!conn->is_obsolete) {
+ if (conn->timestamp_created + TIME_BEFORE_OR_CONN_IS_OBSOLETE < now) {
+ info(LD_OR, "Marking OR conn to %s:%d obsolete (fd %d, %d secs old).",
+ conn->address, conn->port, conn->s,
+ (int)(now - conn->timestamp_created));
+ conn->is_obsolete = 1;
+ } else if (connection_or_get_by_identity_digest(conn->identity_digest) !=
+ conn) {
+ info(LD_OR,
+ "Marking duplicate conn to %s:%d obsolete (fd %d, %d secs old).",
+ conn->address, conn->port, conn->s,
+ (int)(now - conn->timestamp_created));
+ conn->is_obsolete = 1;
+ }
}
if (conn->is_obsolete && conn->n_circuits == 0) {