when our onehop circuits were failing, nobody was telling the

streams. so they waited 120 seconds before timing out. this
was particularly bad during bootstrapping, if an authority is
down or not answering right.


svn:r14163
This commit is contained in:
Roger Dingledine 2008-03-24 05:48:51 +00:00
parent c26c77d24d
commit a9acdb8f53
3 changed files with 33 additions and 0 deletions

View File

@ -744,6 +744,9 @@ circuit_build_failed(origin_circuit_t *circ)
n_conn->_base.or_is_obsolete = 1; n_conn->_base.or_is_obsolete = 1;
entry_guard_register_connect_status(n_conn->identity_digest, 0, entry_guard_register_connect_status(n_conn->identity_digest, 0,
time(NULL)); time(NULL));
/* if there are any one-hop streams waiting on this circuit, fail
* them now so they can retry elsewhere. */
connection_ap_fail_onehop(n_conn->identity_digest);
} }
} }

View File

@ -460,6 +460,35 @@ connection_ap_attach_pending(void)
}); });
} }
/** Tell any AP streams that are waiting for a onehop tunnel to
* <b>failed_digest</b> that they are going to fail. */
/* XXX021 We should get rid of this function, and instead attach
* onehop streams to circ->p_streams so they get marked in
* circuit_mark_for_close like normal p_streams. */
void
connection_ap_fail_onehop(const char *failed_digest)
{
edge_connection_t *edge_conn;
char digest[DIGEST_LEN];
smartlist_t *conns = get_connection_array();
SMARTLIST_FOREACH(conns, connection_t *, conn,
{
if (conn->marked_for_close ||
conn->type != CONN_TYPE_AP ||
conn->state != AP_CONN_STATE_CIRCUIT_WAIT)
continue;
edge_conn = TO_EDGE_CONN(conn);
if (!edge_conn->want_onehop)
continue;
if (!hexdigest_to_digest(edge_conn->chosen_exit_name, digest) &&
!memcmp(digest, failed_digest, DIGEST_LEN)) {
log_info(LD_APP, "Closing onehop stream to '%s' because the OR conn "
"just failed.", edge_conn->chosen_exit_name);
connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_TIMEOUT);
}
});
}
/** A circuit failed to finish on its last hop <b>info</b>. If there /** A circuit failed to finish on its last hop <b>info</b>. If there
* are any streams waiting with this exit node in mind, but they * are any streams waiting with this exit node in mind, but they
* don't absolutely require it, make them give up on it. * don't absolutely require it, make them give up on it.

View File

@ -2812,6 +2812,7 @@ int connection_edge_is_rendezvous_stream(edge_connection_t *conn);
int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit); int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit);
void connection_ap_expire_beginning(void); void connection_ap_expire_beginning(void);
void connection_ap_attach_pending(void); void connection_ap_attach_pending(void);
void connection_ap_fail_onehop(const char *failed_digest);
void circuit_discard_optional_exit_enclaves(extend_info_t *info); void circuit_discard_optional_exit_enclaves(extend_info_t *info);
int connection_ap_detach_retriable(edge_connection_t *conn, int connection_ap_detach_retriable(edge_connection_t *conn,
origin_circuit_t *circ, origin_circuit_t *circ,