diff --git a/src/or/directory.c b/src/or/directory.c index f12eb7588e..9ae04788d7 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1560,8 +1560,9 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } } if (which) { /* mark remaining ones as failed */ - log_info(LD_DIR, "Received %d/%d routers requested from %s:%d", + log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", n_asked_for-smartlist_len(which), n_asked_for, + was_ei ? "extra-info documents" : "router descriptors", conn->_base.address, (int)conn->_base.port); if (smartlist_len(which)) { dir_routerdesc_download_failed(which, status_code, diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index e8f8e4f27f..41f62119df 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -780,9 +780,16 @@ update_consensus_networkstatus_fetch_time(time_t now) tor_assert(start+dl_interval < c->valid_until); time_to_download_next_consensus = start + crypto_rand_int(dl_interval); { - char tbuf[ISO_TIME_LEN+1]; - format_local_iso_time(tbuf, time_to_download_next_consensus); - log_info(LD_DIR, "Have a live consensus; fetching next one at %s.",tbuf); + char tbuf1[ISO_TIME_LEN+1]; + char tbuf2[ISO_TIME_LEN+1]; + char tbuf3[ISO_TIME_LEN+1]; + format_local_iso_time(tbuf1, c->fresh_until); + format_local_iso_time(tbuf2, c->valid_until); + format_local_iso_time(tbuf3, time_to_download_next_consensus); + log_info(LD_DIR, "Live consensus %s the most recent until %s and will " + "expire at %s; fetching the next one at %s.", + (c->fresh_until > now) ? "will be" : "was", + tbuf1, tbuf2, tbuf3); } } else { time_to_download_next_consensus = now; diff --git a/src/or/routerlist.c b/src/or/routerlist.c index cea82a5b64..fdd7d04c0e 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -3771,24 +3771,6 @@ update_router_descriptor_downloads(time_t now) update_consensus_router_descriptor_downloads(now); } -/** Return true iff sd is the descriptor for a router descriptor that - * has an extrainfo that we don't currently have, are not currently - * downloading, and have not recently tried to download. */ -static INLINE int -should_download_extrainfo(signed_descriptor_t *sd, - const routerlist_t *rl, - const digestmap_t *pending, - time_t now) -{ - const char *d = sd->extra_info_digest; - return (!sd->is_extrainfo && - !tor_digest_is_zero(d) && - download_status_is_ready(&sd->ei_dl_status, now, - MAX_ROUTERDESC_DOWNLOAD_FAILURES) && - !eimap_get(rl->extra_info_map, d) && - !digestmap_get(pending, d)); -} - /** Launch extrainfo downloads as needed. */ void update_extrainfo_downloads(time_t now) @@ -3797,7 +3779,8 @@ update_extrainfo_downloads(time_t now) routerlist_t *rl; smartlist_t *wanted; digestmap_t *pending; - int i; + int old_routers, i; + int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0; if (! options->DownloadExtraInfo) return; if (should_delay_dir_fetches(options)) @@ -3807,20 +3790,44 @@ update_extrainfo_downloads(time_t now) list_pending_descriptor_downloads(pending, 1); rl = router_get_routerlist(); wanted = smartlist_create(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { - if (should_download_extrainfo(&ri->cache_info, rl, pending, now)) { - smartlist_add(wanted, ri->cache_info.extra_info_digest); + for (old_routers = 0; old_routers < 2; ++old_routers) { + smartlist_t *lst = old_routers ? rl->old_routers : rl->routers; + for (i = 0; i < smartlist_len(lst); ++i) { + signed_descriptor_t *sd; + char *d; + if (old_routers) + sd = smartlist_get(lst, i); + else + sd = &((routerinfo_t*)smartlist_get(lst, i))->cache_info; + if (sd->is_extrainfo) + continue; /* This should never happen. */ + d = sd->extra_info_digest; + if (tor_digest_is_zero(d)) { + ++n_no_ei; + continue; } - }); - if (dirserver_mode(options)) { - SMARTLIST_FOREACH(rl->old_routers, signed_descriptor_t *, sd, { - if (should_download_extrainfo(sd, rl, pending, now)) { - smartlist_add(wanted, sd->extra_info_digest); - } - }); + if (eimap_get(rl->extra_info_map, d)) { + ++n_have; + continue; + } + if (!download_status_is_ready(&sd->ei_dl_status, now, + MAX_ROUTERDESC_DOWNLOAD_FAILURES)) { + ++n_delay; + continue; + } + if (digestmap_get(pending, d)) { + ++n_pending; + continue; + } + smartlist_add(wanted, d); + } } digestmap_free(pending, NULL); + log_info(LD_DIR, "Extrainfo download status: %d router with no ei, %d " + "with present ei, %d delaying, %d pending, %d downloadable.", + n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted)); + smartlist_shuffle(wanted); for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) { initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO,