diff options
author | Roger Dingledine <arma@torproject.org> | 2009-01-05 16:56:11 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2009-01-05 16:56:11 +0000 |
commit | 9e75c06197e449457ec83f98c6eb537716f352a9 (patch) | |
tree | 8af964a35ea278a968b0e17bd0d34fd4290f3519 /src/or/networkstatus.c | |
parent | cec0a57dc80faa8f8c8ef38fcfb08602638ca81c (diff) | |
download | tor-9e75c06197e449457ec83f98c6eb537716f352a9.tar.gz tor-9e75c06197e449457ec83f98c6eb537716f352a9.zip |
If the cached networkstatus consensus is more than five days old,
discard it rather than trying to use it. In theory it could
be useful because it lists alternate directory mirrors, but in
practice it just means we spend many minutes trying directory
mirrors that are long gone from the network. Helps bug 887 a bit;
bugfix on 0.2.0.x.
svn:r17917
Diffstat (limited to 'src/or/networkstatus.c')
-rw-r--r-- | src/or/networkstatus.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index e942567403..0290832c3a 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -211,7 +211,8 @@ router_reload_consensus_networkstatus(void) s = read_file_to_str(options->FallbackNetworkstatusFile, RFTS_IGNORE_MISSING, NULL); if (s) { - if (networkstatus_set_current_consensus(s, flags)) { + if (networkstatus_set_current_consensus(s, + flags|NSSET_ACCEPT_OBSOLETE)) { log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"", options->FallbackNetworkstatusFile); } else { @@ -1371,6 +1372,8 @@ networkstatus_copy_old_consensus_info(networkstatus_t *new_c, * cache. If flags & NSSET_WAS_WAITING_FOR_CERTS, this networkstatus was * already received, but we were waiting for certificates on it. If flags & * NSSET_DONT_DOWNLOAD_CERTS, do not launch certificate downloads as needed. + * If flags & NSSET_ACCEPT_OBSOLETE, then we should be willing to take this + * consensus, even if it comes from many days in the past. * * Return 0 on success, <0 on failure. On failure, caller should increment * the failure count as appropriate. @@ -1388,6 +1391,7 @@ networkstatus_set_current_consensus(const char *consensus, unsigned flags) const unsigned from_cache = flags & NSSET_FROM_CACHE; const unsigned was_waiting_for_certs = flags & NSSET_WAS_WAITING_FOR_CERTS; const unsigned dl_certs = !(flags & NSSET_DONT_DOWNLOAD_CERTS); + const unsigned accept_obsolete = flags & NSSET_ACCEPT_OBSOLETE; /* Make sure it's parseable. */ c = networkstatus_parse_vote_from_string(consensus, NULL, NS_TYPE_CONSENSUS); @@ -1397,6 +1401,15 @@ networkstatus_set_current_consensus(const char *consensus, unsigned flags) goto done; } + if (from_cache && !accept_obsolete && + c->valid_until < now-OLD_ROUTER_DESC_MAX_AGE) { + /* XXX022 when we try to make fallbackconsensus work again, we should + * consider taking this out. Until then, believing obsolete consensuses + * is causing more harm than good. See also bug 887. */ + log_info(LD_DIR, "Loaded an obsolete consensus. Discarding."); + goto done; + } + if (current_consensus && !memcmp(c->networkstatus_digest, current_consensus->networkstatus_digest, DIGEST_LEN)) { |