|
@@ -36,6 +36,9 @@ static void update_networkstatus_cache_downloads(time_t now);
|
|
static void update_networkstatus_client_downloads(time_t now);
|
|
static void update_networkstatus_client_downloads(time_t now);
|
|
static void update_consensus_networkstatus_fetch_time(time_t now);
|
|
static void update_consensus_networkstatus_fetch_time(time_t now);
|
|
static void update_consensus_networkstatus_downloads(time_t now);
|
|
static void update_consensus_networkstatus_downloads(time_t now);
|
|
|
|
+static void launch_router_descriptor_downloads(smartlist_t *downloadable,
|
|
|
|
+ time_t now);
|
|
|
|
+static void update_consensus_router_descriptor_downloads(time_t now);
|
|
static int signed_desc_digest_is_recognized(signed_descriptor_t *desc);
|
|
static int signed_desc_digest_is_recognized(signed_descriptor_t *desc);
|
|
static int have_tried_downloading_all_statuses(int n_failures);
|
|
static int have_tried_downloading_all_statuses(int n_failures);
|
|
static routerstatus_t *networkstatus_find_entry(networkstatus_t *ns,
|
|
static routerstatus_t *networkstatus_find_entry(networkstatus_t *ns,
|
|
@@ -4016,7 +4019,7 @@ update_networkstatus_downloads(time_t now)
|
|
update_consensus_networkstatus_downloads(now);
|
|
update_consensus_networkstatus_downloads(now);
|
|
}
|
|
}
|
|
|
|
|
|
-/** Clear all our timeouts for fetching v2 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
|
|
routerlist_retry_directory_downloads(time_t now)
|
|
routerlist_retry_directory_downloads(time_t now)
|
|
@@ -5142,7 +5145,6 @@ update_router_descriptor_client_downloads(time_t now)
|
|
* them until they have more, or until this amount of time has passed. */
|
|
* them until they have more, or until this amount of time has passed. */
|
|
#define MAX_CLIENT_INTERVAL_WITHOUT_REQUEST (10*60)
|
|
#define MAX_CLIENT_INTERVAL_WITHOUT_REQUEST (10*60)
|
|
smartlist_t *downloadable = NULL;
|
|
smartlist_t *downloadable = NULL;
|
|
- int should_delay, n_downloadable;
|
|
|
|
or_options_t *options = get_options();
|
|
or_options_t *options = get_options();
|
|
|
|
|
|
if (options->DirPort) {
|
|
if (options->DirPort) {
|
|
@@ -5164,27 +5166,37 @@ update_router_descriptor_client_downloads(time_t now)
|
|
}
|
|
}
|
|
|
|
|
|
downloadable = router_list_client_downloadable();
|
|
downloadable = router_list_client_downloadable();
|
|
|
|
+ launch_router_descriptor_downloads(downloadable, now);
|
|
|
|
+ smartlist_free(downloadable);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/** DOCDOC */
|
|
|
|
+static void
|
|
|
|
+launch_router_descriptor_downloads(smartlist_t *downloadable, time_t now)
|
|
|
|
+{
|
|
|
|
+ int should_delay = 0, n_downloadable;
|
|
|
|
+ or_options_t *options = get_options();
|
|
|
|
+
|
|
n_downloadable = smartlist_len(downloadable);
|
|
n_downloadable = smartlist_len(downloadable);
|
|
- if (n_downloadable >= MAX_DL_TO_DELAY) {
|
|
|
|
- log_debug(LD_DIR,
|
|
|
|
- "There are enough downloadable routerdescs to launch requests.");
|
|
|
|
- should_delay = 0;
|
|
|
|
- } else if (n_downloadable == 0) {
|
|
|
|
-// log_debug(LD_DIR, "No routerdescs need to be downloaded.");
|
|
|
|
- should_delay = 1;
|
|
|
|
- } else {
|
|
|
|
- should_delay = (last_routerdesc_download_attempted +
|
|
|
|
- MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
|
|
|
|
- if (!should_delay) {
|
|
|
|
- if (last_routerdesc_download_attempted) {
|
|
|
|
- log_info(LD_DIR,
|
|
|
|
- "There are not many downloadable routerdescs, but we've "
|
|
|
|
- "been waiting long enough (%d seconds). Downloading.",
|
|
|
|
- (int)(now-last_routerdesc_download_attempted));
|
|
|
|
- } else {
|
|
|
|
- log_info(LD_DIR,
|
|
|
|
- "There are not many downloadable routerdescs, but we haven't "
|
|
|
|
- "tried downloading descriptors recently. Downloading.");
|
|
|
|
|
|
+ if (!options->DirPort) {
|
|
|
|
+ if (n_downloadable >= MAX_DL_TO_DELAY) {
|
|
|
|
+ log_debug(LD_DIR,
|
|
|
|
+ "There are enough downloadable routerdescs to launch requests.");
|
|
|
|
+ should_delay = 0;
|
|
|
|
+ } else {
|
|
|
|
+ should_delay = (last_routerdesc_download_attempted +
|
|
|
|
+ MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
|
|
|
|
+ if (!should_delay) {
|
|
|
|
+ if (last_routerdesc_download_attempted) {
|
|
|
|
+ log_info(LD_DIR,
|
|
|
|
+ "There are not many downloadable routerdescs, but we've "
|
|
|
|
+ "been waiting long enough (%d seconds). Downloading.",
|
|
|
|
+ (int)(now-last_routerdesc_download_attempted));
|
|
|
|
+ } else {
|
|
|
|
+ log_info(LD_DIR,
|
|
|
|
+ "There are not many downloadable routerdescs, but we haven't "
|
|
|
|
+ "tried downloading descriptors recently. Downloading.");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -5214,7 +5226,6 @@ update_router_descriptor_client_downloads(time_t now)
|
|
}
|
|
}
|
|
last_routerdesc_download_attempted = now;
|
|
last_routerdesc_download_attempted = now;
|
|
}
|
|
}
|
|
- smartlist_free(downloadable);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/** Launch downloads for router status as needed, using the strategy used by
|
|
/** Launch downloads for router status as needed, using the strategy used by
|
|
@@ -5359,6 +5370,44 @@ update_router_descriptor_cache_downloads(time_t now)
|
|
digestmap_free(map,NULL);
|
|
digestmap_free(map,NULL);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/** DOCDOC */
|
|
|
|
+static void
|
|
|
|
+update_consensus_router_descriptor_downloads(time_t now)
|
|
|
|
+{
|
|
|
|
+ or_options_t *options = get_options();
|
|
|
|
+ digestmap_t *map = NULL;
|
|
|
|
+ smartlist_t *downloadable = smartlist_create();
|
|
|
|
+ int authdir = authdir_mode(options);
|
|
|
|
+ if (!options->DirPort) {
|
|
|
|
+ if (rep_hist_circbuilding_dormant(now))
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (!current_consensus)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ map = digestmap_new();
|
|
|
|
+ list_pending_descriptor_downloads(map, 0);
|
|
|
|
+ SMARTLIST_FOREACH(current_consensus->routerstatus_list, routerstatus_t *, rs,
|
|
|
|
+ {
|
|
|
|
+ /* ????020 need-to-mirror? */
|
|
|
|
+ /* XXXX rate-limit retries. */
|
|
|
|
+ if (router_get_by_descriptor_digest(rs->descriptor_digest))
|
|
|
|
+ continue; /* We have it already. */
|
|
|
|
+ if (authdir && dirserv_would_reject_router(rs))
|
|
|
|
+ continue; /* We would throw it out immediately. */
|
|
|
|
+ if (!options->DirPort && !client_would_use_router(rs, now, options))
|
|
|
|
+ continue; /* We would never use it ourself. */
|
|
|
|
+ if (digestmap_get(map, rs->descriptor_digest))
|
|
|
|
+ continue; /* We have an in-progress download. */
|
|
|
|
+ smartlist_add(downloadable, rs->descriptor_digest);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ launch_router_descriptor_downloads(downloadable, now);
|
|
|
|
+
|
|
|
|
+ smartlist_free(downloadable);
|
|
|
|
+ digestmap_free(map, NULL);
|
|
|
|
+}
|
|
|
|
+
|
|
/** 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)
|
|
@@ -5368,6 +5417,7 @@ update_router_descriptor_downloads(time_t now)
|
|
return;
|
|
return;
|
|
if (options->DirPort) {
|
|
if (options->DirPort) {
|
|
update_router_descriptor_cache_downloads(now);
|
|
update_router_descriptor_cache_downloads(now);
|
|
|
|
+ update_consensus_router_descriptor_downloads(now); /*XXXX020 clients too*/
|
|
} else {
|
|
} else {
|
|
update_router_descriptor_client_downloads(now);
|
|
update_router_descriptor_client_downloads(now);
|
|
}
|
|
}
|