mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
get rid of the scattered checks to cancel a consensus fetch
We'll back off from the request in connection_ap_handshake_attach_circuit, or cancel it in connection_dir_close_consensus_fetches, and those are the only places we need to check.
This commit is contained in:
parent
a7665df2f8
commit
e230e80ab3
@ -1219,11 +1219,6 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
|
||||
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||
/* fall through */
|
||||
case 0:
|
||||
/* Close this connection if there's another consensus connection
|
||||
* downloading (during bootstrap), or connecting (after bootstrap). */
|
||||
if (connection_dir_close_consensus_conn_if_extra(conn)) {
|
||||
return;
|
||||
}
|
||||
/* queue the command on the outbuf */
|
||||
directory_send_command(conn, dir_purpose, 1, resource,
|
||||
payload, payload_len,
|
||||
@ -1271,11 +1266,6 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
|
||||
connection_mark_for_close(TO_CONN(conn));
|
||||
return;
|
||||
}
|
||||
/* Close this connection if there's another consensus connection
|
||||
* downloading (during bootstrap), or connecting (after bootstrap). */
|
||||
if (connection_dir_close_consensus_conn_if_extra(conn)) {
|
||||
return;
|
||||
}
|
||||
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||
/* queue the command on the outbuf */
|
||||
directory_send_command(conn, dir_purpose, 0, resource,
|
||||
@ -3686,41 +3676,6 @@ connection_dir_finished_flushing(dir_connection_t *conn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A helper function for connection_dir_close_consensus_conn_if_extra()
|
||||
* that returns 0 if
|
||||
* we can't have, or don't want to close, excess consensus connections. */
|
||||
STATIC int
|
||||
connection_dir_would_close_consensus_conn_helper(void)
|
||||
{
|
||||
const or_options_t *options = get_options();
|
||||
|
||||
/* we're only interested in closing excess connections if we could
|
||||
* have created any in the first place */
|
||||
if (!networkstatus_consensus_can_use_multiple_directories(options)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We want to close excess connections downloading a consensus.
|
||||
* If there aren't any excess, we don't have anything to close. */
|
||||
if (!networkstatus_consensus_has_excess_connections()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we have excess connections, but none of them are downloading a
|
||||
* consensus, and we are still bootstrapping (that is, we have no usable
|
||||
* consensus), we don't want to close any until one starts downloading. */
|
||||
if (!networkstatus_consensus_is_downloading_usable_flavor()
|
||||
&& networkstatus_consensus_is_bootstrapping(time(NULL))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we have just stopped bootstrapping (that is, just parsed a consensus),
|
||||
* we might still have some excess connections hanging around. So we still
|
||||
* have to check if we want to close any, even if we've stopped
|
||||
* bootstrapping. */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Check if we would close excess consensus connections. If we would, any
|
||||
* new consensus connection would become excess immediately, so return 1.
|
||||
* Otherwise, return 0. */
|
||||
@ -3751,59 +3706,6 @@ connection_dir_avoid_extra_connection_for_purpose(unsigned int purpose)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if we have more than one consensus download connection attempt, and
|
||||
* close conn:
|
||||
* - if we don't have a consensus, and we're downloading a consensus, and conn
|
||||
* is not downloading a consensus yet;
|
||||
* - if we do have a consensus, and there's more than one consensus connection.
|
||||
*
|
||||
* Post-bootstrap consensus connection attempts are initiated one at a time.
|
||||
* So this function won't close any consensus connection attempts that
|
||||
* are initiated after bootstrap.
|
||||
*/
|
||||
int
|
||||
connection_dir_close_consensus_conn_if_extra(dir_connection_t *conn)
|
||||
{
|
||||
tor_assert(conn);
|
||||
tor_assert(conn->base_.type == CONN_TYPE_DIR);
|
||||
|
||||
/* We're not interested in connections that aren't fetching a consensus. */
|
||||
if (conn->base_.purpose != DIR_PURPOSE_FETCH_CONSENSUS) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The connection has already been closed */
|
||||
if (conn->base_.marked_for_close) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Only close this connection if there's another consensus connection
|
||||
* downloading (during bootstrap), or connecting (after bootstrap).
|
||||
* Post-bootstrap consensus connection attempts won't be closed, because
|
||||
* they only occur one at a time. */
|
||||
if (!connection_dir_would_close_consensus_conn_helper()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const int we_are_bootstrapping = networkstatus_consensus_is_bootstrapping(
|
||||
time(NULL));
|
||||
|
||||
/* We don't want to check other connections to see if they are downloading,
|
||||
* as this is prone to race-conditions. So leave it for
|
||||
* connection_dir_close_extra_consensus_conns(() to clean up.
|
||||
*
|
||||
* But if conn has just started connecting, or we have a consensus already,
|
||||
* we can be sure it's not needed any more. */
|
||||
if (!we_are_bootstrapping
|
||||
|| conn->base_.state == DIR_CONN_STATE_CONNECTING) {
|
||||
connection_close_immediate(&conn->base_);
|
||||
connection_mark_for_close(&conn->base_);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We just got a new consensus! If there are other in-progress requests
|
||||
* for this consensus flavor (for example because we launched several in
|
||||
* parallel), cancel them.
|
||||
@ -3847,12 +3749,6 @@ connection_dir_finished_connecting(dir_connection_t *conn)
|
||||
log_debug(LD_HTTP,"Dir connection to router %s:%u established.",
|
||||
conn->base_.address,conn->base_.port);
|
||||
|
||||
/* Close this connection if there's another consensus connection
|
||||
* downloading (during bootstrap), or connecting (after bootstrap). */
|
||||
if (connection_dir_close_consensus_conn_if_extra(conn)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* start flushing conn */
|
||||
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||
return 0;
|
||||
|
@ -79,7 +79,6 @@ void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
|
||||
const char *payload, size_t payload_len,
|
||||
time_t if_modified_since);
|
||||
int connection_dir_avoid_extra_connection_for_purpose(unsigned int purpose);
|
||||
int connection_dir_close_consensus_conn_if_extra(dir_connection_t *conn);
|
||||
|
||||
#define DSR_HEX (1<<0)
|
||||
#define DSR_BASE64 (1<<1)
|
||||
@ -146,7 +145,6 @@ STATIC int directory_handle_command_get(dir_connection_t *conn,
|
||||
const char *headers,
|
||||
const char *req_body,
|
||||
size_t req_body_len);
|
||||
STATIC int connection_dir_would_close_consensus_conn_helper(void);
|
||||
STATIC int download_status_schedule_get_delay(download_status_t *dls,
|
||||
const smartlist_t *schedule,
|
||||
time_t now);
|
||||
|
Loading…
Reference in New Issue
Block a user