backport r17917, r17993: tors that haven't run lately take 10+ minutes

to start, and when they do they still use incredibly obsolete descriptors.


svn:r18187
This commit is contained in:
Roger Dingledine 2009-01-20 08:10:48 +00:00
parent 08f1406cfb
commit 5954698422
5 changed files with 27 additions and 2 deletions

View File

@ -22,6 +22,13 @@ Changes in version 0.2.0.33 - 2009-01-??
to anybody who asks, now that extrainfo docs include potentially
sensitive aggregated client geoip summaries. Bugfix on
0.2.0.13-alpha.
- 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. Also discard router descriptors as
we load them if they are more than five days old, since the onion
key is probably wrong by now. Bugfix on 0.2.0.x. Fixes bug 887.
o Minor bugfixes:
- Do not mark smartlist_bsearch_idx() function as ATTR_PURE. This bug

View File

@ -17,7 +17,7 @@ Backport for 0.2.0 once better tested:
- r17886: Don't remove routerinfos as unlisted unless we have a
consensus.
- r17887: Don't accept 1.2.3 as a valid IP address.
- r17917, r17993: tors that haven't run lately take 10+ minutes to start
o r17917, r17993: tors that haven't run lately take 10+ minutes to start
- r17924: Close streams when an exit hands us a local IP.
Backport for 0.2.0, maybe:

View File

@ -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 {
@ -1372,6 +1373,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, 0);
@ -1381,6 +1383,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)) {

View File

@ -3415,6 +3415,7 @@ networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now);
#define NSSET_FROM_CACHE 1
#define NSSET_WAS_WAITING_FOR_CERTS 2
#define NSSET_DONT_DOWNLOAD_CERTS 4
#define NSSET_ACCEPT_OBSOLETE 8
int networkstatus_set_current_consensus(const char *consensus, unsigned flags);
void networkstatus_note_certs_arrived(void);
void routers_update_all_from_networkstatus(time_t now, int dir_version);

View File

@ -2864,6 +2864,12 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
}
}
if (!in_consensus && from_cache &&
router->cache_info.published_on < time(NULL) - OLD_ROUTER_DESC_MAX_AGE) {
*msg = "Router descriptor was really old.";
return -1;
}
/* We haven't seen a router with this identity before. Add it to the end of
* the list. */
routerlist_insert(routerlist, router);