mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-01 08:03:31 +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;
|
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case 0:
|
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 */
|
/* queue the command on the outbuf */
|
||||||
directory_send_command(conn, dir_purpose, 1, resource,
|
directory_send_command(conn, dir_purpose, 1, resource,
|
||||||
payload, payload_len,
|
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));
|
connection_mark_for_close(TO_CONN(conn));
|
||||||
return;
|
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;
|
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||||
/* queue the command on the outbuf */
|
/* queue the command on the outbuf */
|
||||||
directory_send_command(conn, dir_purpose, 0, resource,
|
directory_send_command(conn, dir_purpose, 0, resource,
|
||||||
@ -3686,41 +3676,6 @@ connection_dir_finished_flushing(dir_connection_t *conn)
|
|||||||
return 0;
|
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
|
/* Check if we would close excess consensus connections. If we would, any
|
||||||
* new consensus connection would become excess immediately, so return 1.
|
* new consensus connection would become excess immediately, so return 1.
|
||||||
* Otherwise, return 0. */
|
* Otherwise, return 0. */
|
||||||
@ -3751,59 +3706,6 @@ connection_dir_avoid_extra_connection_for_purpose(unsigned int purpose)
|
|||||||
return 0;
|
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
|
/* We just got a new consensus! If there are other in-progress requests
|
||||||
* for this consensus flavor (for example because we launched several in
|
* for this consensus flavor (for example because we launched several in
|
||||||
* parallel), cancel them.
|
* 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.",
|
log_debug(LD_HTTP,"Dir connection to router %s:%u established.",
|
||||||
conn->base_.address,conn->base_.port);
|
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 */
|
/* start flushing conn */
|
||||||
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
|
||||||
return 0;
|
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,
|
const char *payload, size_t payload_len,
|
||||||
time_t if_modified_since);
|
time_t if_modified_since);
|
||||||
int connection_dir_avoid_extra_connection_for_purpose(unsigned int purpose);
|
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_HEX (1<<0)
|
||||||
#define DSR_BASE64 (1<<1)
|
#define DSR_BASE64 (1<<1)
|
||||||
@ -146,7 +145,6 @@ STATIC int directory_handle_command_get(dir_connection_t *conn,
|
|||||||
const char *headers,
|
const char *headers,
|
||||||
const char *req_body,
|
const char *req_body,
|
||||||
size_t req_body_len);
|
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,
|
STATIC int download_status_schedule_get_delay(download_status_t *dls,
|
||||||
const smartlist_t *schedule,
|
const smartlist_t *schedule,
|
||||||
time_t now);
|
time_t now);
|
||||||
|
Loading…
Reference in New Issue
Block a user