mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Move dummy authority.z fetch out of update_router_descriptor_downloads
To make sure that a server learns if its IP has changed, the server sometimes launches authority.z descriptor fetches from update_router_descriptor_downloads. That's nice, but we're moving towards a situation where update_router_descriptor_downloads doesn't always get called. So this patch breaks the authority.z check-and-fetch into a new function. This function also renames last_routerdesc_download to a more appropriate last_descriptor_download, and adds a new update_all_descriptor_downloads() function. (For now, this is unnecessary, since servers don't actually use microdescriptors. But that could change, or bridges could start using microdescriptors, and then we'll be glad this is refactored nicely.)
This commit is contained in:
parent
4cc348e896
commit
711100c597
@ -872,13 +872,11 @@ directory_info_has_arrived(time_t now, int from_cache)
|
|||||||
log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
|
log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
|
||||||
"I learned some more directory information, but not enough to "
|
"I learned some more directory information, but not enough to "
|
||||||
"build a circuit: %s", get_dir_info_status_string());
|
"build a circuit: %s", get_dir_info_status_string());
|
||||||
update_router_descriptor_downloads(now);
|
update_all_descriptor_downloads(now);
|
||||||
update_microdesc_downloads(now);
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (directory_fetches_from_authorities(options)) {
|
if (directory_fetches_from_authorities(options)) {
|
||||||
update_router_descriptor_downloads(now);
|
update_all_descriptor_downloads(now);
|
||||||
update_microdesc_downloads(now);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we have enough dir info, then update our guard status with
|
/* if we have enough dir info, then update our guard status with
|
||||||
@ -1110,9 +1108,8 @@ run_scheduled_events(time_t now)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (time_to_try_getting_descriptors < now) {
|
if (time_to_try_getting_descriptors < now) {
|
||||||
update_router_descriptor_downloads(now);
|
update_all_descriptor_downloads(now);
|
||||||
update_extrainfo_downloads(now);
|
update_extrainfo_downloads(now);
|
||||||
update_microdesc_downloads(now);
|
|
||||||
if (options->UseBridges)
|
if (options->UseBridges)
|
||||||
fetch_bridge_descriptors(options, now);
|
fetch_bridge_descriptors(options, now);
|
||||||
if (router_have_minimum_dir_info())
|
if (router_have_minimum_dir_info())
|
||||||
|
@ -56,6 +56,8 @@ static const char *signed_descriptor_get_body_impl(
|
|||||||
int with_annotations);
|
int with_annotations);
|
||||||
static void list_pending_downloads(digestmap_t *result,
|
static void list_pending_downloads(digestmap_t *result,
|
||||||
int purpose, const char *prefix);
|
int purpose, const char *prefix);
|
||||||
|
static void launch_dummy_descriptor_download_as_needed(time_t now,
|
||||||
|
or_options_t *options);
|
||||||
|
|
||||||
DECLARE_TYPED_DIGESTMAP_FNS(sdmap_, digest_sd_map_t, signed_descriptor_t)
|
DECLARE_TYPED_DIGESTMAP_FNS(sdmap_, digest_sd_map_t, signed_descriptor_t)
|
||||||
DECLARE_TYPED_DIGESTMAP_FNS(rimap_, digest_ri_map_t, routerinfo_t)
|
DECLARE_TYPED_DIGESTMAP_FNS(rimap_, digest_ri_map_t, routerinfo_t)
|
||||||
@ -97,7 +99,7 @@ static smartlist_t *warned_nicknames = NULL;
|
|||||||
/** The last time we tried to download any routerdesc, or 0 for "never". We
|
/** The last time we tried to download any routerdesc, or 0 for "never". We
|
||||||
* use this to rate-limit download attempts when the number of routerdescs to
|
* use this to rate-limit download attempts when the number of routerdescs to
|
||||||
* download is low. */
|
* download is low. */
|
||||||
static time_t last_routerdesc_download_attempted = 0;
|
static time_t last_descriptor_download_attempted = 0;
|
||||||
|
|
||||||
/** When we last computed the weights to use for bandwidths on directory
|
/** When we last computed the weights to use for bandwidths on directory
|
||||||
* requests, what were the total weighted bandwidth, and our share of that
|
* requests, what were the total weighted bandwidth, and our share of that
|
||||||
@ -3991,6 +3993,16 @@ signed_desc_digest_is_recognized(signed_descriptor_t *desc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update downloads for router descriptors and/or microdescriptors as
|
||||||
|
* appropriate. */
|
||||||
|
void
|
||||||
|
update_all_descriptor_downloads(time_t now)
|
||||||
|
{
|
||||||
|
update_router_descriptor_downloads(now);
|
||||||
|
update_microdesc_downloads(now);
|
||||||
|
launch_dummy_descriptor_download_as_needed(now, get_options());
|
||||||
|
}
|
||||||
|
|
||||||
/** Clear all our timeouts for fetching v2 and v3 directory stuff, and then
|
/** Clear all our timeouts for fetching v2 and v3 directory stuff, and then
|
||||||
* give it all a try again. */
|
* give it all a try again. */
|
||||||
void
|
void
|
||||||
@ -3999,8 +4011,7 @@ routerlist_retry_directory_downloads(time_t now)
|
|||||||
router_reset_status_download_failures();
|
router_reset_status_download_failures();
|
||||||
router_reset_descriptor_download_failures();
|
router_reset_descriptor_download_failures();
|
||||||
update_networkstatus_downloads(now);
|
update_networkstatus_downloads(now);
|
||||||
update_router_descriptor_downloads(now);
|
update_all_descriptor_downloads(now);
|
||||||
update_microdesc_downloads(now);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return 1 if all running sufficiently-stable routers we can use will reject
|
/** Return 1 if all running sufficiently-stable routers we can use will reject
|
||||||
@ -4354,15 +4365,15 @@ launch_descriptor_downloads(int purpose,
|
|||||||
descname);
|
descname);
|
||||||
should_delay = 0;
|
should_delay = 0;
|
||||||
} else {
|
} else {
|
||||||
should_delay = (last_routerdesc_download_attempted +
|
should_delay = (last_descriptor_download_attempted +
|
||||||
MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
|
MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
|
||||||
if (!should_delay && n_downloadable) {
|
if (!should_delay && n_downloadable) {
|
||||||
if (last_routerdesc_download_attempted) {
|
if (last_descriptor_download_attempted) {
|
||||||
log_info(LD_DIR,
|
log_info(LD_DIR,
|
||||||
"There are not many downloadable %ss, but we've "
|
"There are not many downloadable %ss, but we've "
|
||||||
"been waiting long enough (%d seconds). Downloading.",
|
"been waiting long enough (%d seconds). Downloading.",
|
||||||
descname,
|
descname,
|
||||||
(int)(now-last_routerdesc_download_attempted));
|
(int)(now-last_descriptor_download_attempted));
|
||||||
} else {
|
} else {
|
||||||
log_info(LD_DIR,
|
log_info(LD_DIR,
|
||||||
"There are not many downloadable %ss, but we haven't "
|
"There are not many downloadable %ss, but we haven't "
|
||||||
@ -4425,7 +4436,7 @@ launch_descriptor_downloads(int purpose,
|
|||||||
downloadable, i, i+n_per_request,
|
downloadable, i, i+n_per_request,
|
||||||
pds_flags);
|
pds_flags);
|
||||||
}
|
}
|
||||||
last_routerdesc_download_attempted = now;
|
last_descriptor_download_attempted = now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4709,12 +4720,32 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote,
|
|||||||
* do this only when we aren't seeing incoming data. see bug 652. */
|
* do this only when we aren't seeing incoming data. see bug 652. */
|
||||||
#define DUMMY_DOWNLOAD_INTERVAL (20*60)
|
#define DUMMY_DOWNLOAD_INTERVAL (20*60)
|
||||||
|
|
||||||
|
/** As needed, launch a dummy router descriptor fetch to see if our
|
||||||
|
* address has changed. */
|
||||||
|
static void
|
||||||
|
launch_dummy_descriptor_download_as_needed(time_t now, or_options_t *options)
|
||||||
|
{
|
||||||
|
static time_t last_dummy_download = 0;
|
||||||
|
/* XXXX023 we could be smarter here; see notes on bug 652. */
|
||||||
|
/* If we're a server that doesn't have a configured address, we rely on
|
||||||
|
* directory fetches to learn when our address changes. So if we haven't
|
||||||
|
* tried to get any routerdescs in a long time, try a dummy fetch now. */
|
||||||
|
if (!options->Address &&
|
||||||
|
server_mode(options) &&
|
||||||
|
last_descriptor_download_attempted + DUMMY_DOWNLOAD_INTERVAL < now &&
|
||||||
|
last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) {
|
||||||
|
last_dummy_download = now;
|
||||||
|
directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC,
|
||||||
|
ROUTER_PURPOSE_GENERAL, "authority.z",
|
||||||
|
PDS_RETRY_IF_NO_SERVERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Launch downloads for router status as needed. */
|
/** Launch downloads for router status as needed. */
|
||||||
void
|
void
|
||||||
update_router_descriptor_downloads(time_t now)
|
update_router_descriptor_downloads(time_t now)
|
||||||
{
|
{
|
||||||
or_options_t *options = get_options();
|
or_options_t *options = get_options();
|
||||||
static time_t last_dummy_download = 0;
|
|
||||||
if (should_delay_dir_fetches(options))
|
if (should_delay_dir_fetches(options))
|
||||||
return;
|
return;
|
||||||
if (!we_fetch_router_descriptors(options))
|
if (!we_fetch_router_descriptors(options))
|
||||||
@ -4725,22 +4756,6 @@ update_router_descriptor_downloads(time_t now)
|
|||||||
|
|
||||||
update_consensus_router_descriptor_downloads(now, 0,
|
update_consensus_router_descriptor_downloads(now, 0,
|
||||||
networkstatus_get_reasonably_live_consensus(now, FLAV_NS));
|
networkstatus_get_reasonably_live_consensus(now, FLAV_NS));
|
||||||
|
|
||||||
/* XXXX023 we could be smarter here; see notes on bug 652. */
|
|
||||||
/* XXXX NM Microdescs: if we're not fetching microdescriptors, we need
|
|
||||||
* to make something else invoke this. */
|
|
||||||
/* If we're a server that doesn't have a configured address, we rely on
|
|
||||||
* directory fetches to learn when our address changes. So if we haven't
|
|
||||||
* tried to get any routerdescs in a long time, try a dummy fetch now. */
|
|
||||||
if (!options->Address &&
|
|
||||||
server_mode(options) &&
|
|
||||||
last_routerdesc_download_attempted + DUMMY_DOWNLOAD_INTERVAL < now &&
|
|
||||||
last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) {
|
|
||||||
last_dummy_download = now;
|
|
||||||
directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC,
|
|
||||||
ROUTER_PURPOSE_GENERAL, "authority.z",
|
|
||||||
PDS_RETRY_IF_NO_SERVERS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Launch extrainfo downloads as needed. */
|
/** Launch extrainfo downloads as needed. */
|
||||||
@ -5023,7 +5038,7 @@ void
|
|||||||
router_reset_descriptor_download_failures(void)
|
router_reset_descriptor_download_failures(void)
|
||||||
{
|
{
|
||||||
networkstatus_reset_download_failures();
|
networkstatus_reset_download_failures();
|
||||||
last_routerdesc_download_attempted = 0;
|
last_descriptor_download_attempted = 0;
|
||||||
if (!routerlist)
|
if (!routerlist)
|
||||||
return;
|
return;
|
||||||
SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri,
|
SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri,
|
||||||
|
@ -144,6 +144,7 @@ int any_trusted_dir_is_v1_authority(void);
|
|||||||
void update_consensus_router_descriptor_downloads(time_t now, int is_vote,
|
void update_consensus_router_descriptor_downloads(time_t now, int is_vote,
|
||||||
networkstatus_t *consensus);
|
networkstatus_t *consensus);
|
||||||
void update_router_descriptor_downloads(time_t now);
|
void update_router_descriptor_downloads(time_t now);
|
||||||
|
void update_all_descriptor_downloads(time_t now);
|
||||||
void update_extrainfo_downloads(time_t now);
|
void update_extrainfo_downloads(time_t now);
|
||||||
int router_have_minimum_dir_info(void);
|
int router_have_minimum_dir_info(void);
|
||||||
void router_dir_info_changed(void);
|
void router_dir_info_changed(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user