Stop relays calling directory_fetches_from_authorities on dir downloads

This change refactors find_dl_schedule() to only call dependent functions
as needed. In particular, directory_fetches_from_authorities() only needs
to be called on clients.

Stopping spurious directory_fetches_from_authorities() calls on every
download on public relays has the following impacts:
* fewer address resolution attempts, particularly those mentioned in 21789
* fewer descriptor rebuilds
* fewer log messages, particularly those limited in 20610

Fixes 23470 in 0.2.8.1-alpha.
The original bug was introduced in commit 35bbf2e as part of prop210.
This commit is contained in:
teor 2017-09-11 14:21:48 +10:00
parent 3138fe2e69
commit c86013291b
No known key found for this signature in database
GPG Key ID: 740D9E39025272A2
2 changed files with 17 additions and 11 deletions

6
changes/bug23470 Normal file
View File

@ -0,0 +1,6 @@
o Minor bugfix (relay address resolution):
- Avoid unnecessary calls to directory_fetches_from_authorities()
on relays. This avoids spurious address resolutions and
descriptor rebuilds. This is a mitigation for 21789. The original
bug was introduced in commit 35bbf2e as part of prop210.
Fixes 23470 in 0.2.8.1-alpha.

View File

@ -3703,26 +3703,24 @@ connection_dir_finished_connecting(dir_connection_t *conn)
STATIC const smartlist_t *
find_dl_schedule(download_status_t *dls, const or_options_t *options)
{
const int dir_server = dir_server_mode(options);
const int multi_d = networkstatus_consensus_can_use_multiple_directories(
options);
const int we_are_bootstrapping = networkstatus_consensus_is_bootstrapping(
time(NULL));
const int use_fallbacks = networkstatus_consensus_can_use_extra_fallbacks(
options);
switch (dls->schedule) {
case DL_SCHED_GENERIC:
if (dir_server) {
/* Any other directory document */
if (dir_server_mode(options)) {
/* A directory authority or directory mirror */
return options->TestingServerDownloadSchedule;
} else {
return options->TestingClientDownloadSchedule;
}
case DL_SCHED_CONSENSUS:
if (!multi_d) {
if (!networkstatus_consensus_can_use_multiple_directories(options)) {
/* A public relay */
return options->TestingServerConsensusDownloadSchedule;
} else {
if (we_are_bootstrapping) {
if (!use_fallbacks) {
/* A client or bridge */
if (networkstatus_consensus_is_bootstrapping(time(NULL))) {
/* During bootstrapping */
if (!networkstatus_consensus_can_use_extra_fallbacks(options)) {
/* A bootstrapping client without extra fallback directories */
return
options->ClientBootstrapConsensusAuthorityOnlyDownloadSchedule;
@ -3738,6 +3736,8 @@ find_dl_schedule(download_status_t *dls, const or_options_t *options)
options->ClientBootstrapConsensusFallbackDownloadSchedule;
}
} else {
/* A client with a reasonably live consensus, with or without
* certificates */
return options->TestingClientConsensusDownloadSchedule;
}
}