|
@@ -29,7 +29,6 @@ static trusted_dir_server_t *router_pick_trusteddirserver_impl(
|
|
|
static void mark_all_trusteddirservers_up(void);
|
|
|
static int router_nickname_is_in_list(routerinfo_t *router, const char *list);
|
|
|
static int router_nickname_matches(routerinfo_t *router, const char *nickname);
|
|
|
-static routerstatus_t *router_get_combined_status_by_digest(const char *d);
|
|
|
static void routerstatus_list_update_from_networkstatus(time_t now);
|
|
|
|
|
|
/****************************************************************************/
|
|
@@ -1292,7 +1291,7 @@ router_load_routers_from_string(const char *s, int from_cache,
|
|
|
|
|
|
router_parse_list_from_string(&s, routers);
|
|
|
|
|
|
- routers_update_status_from_networkstatus(routers);
|
|
|
+ routers_update_status_from_networkstatus(routers, !from_cache);
|
|
|
|
|
|
SMARTLIST_FOREACH(routers, routerinfo_t *, ri,
|
|
|
{
|
|
@@ -1554,7 +1553,8 @@ networkstatus_find_entry(networkstatus_t *ns, const char *digest)
|
|
|
_compare_digest_to_routerstatus_entry);
|
|
|
}
|
|
|
|
|
|
-static routerstatus_t *
|
|
|
+/*DOCDOC*/
|
|
|
+routerstatus_t *
|
|
|
router_get_combined_status_by_digest(const char *digest)
|
|
|
{
|
|
|
if (!routerstatus_list)
|
|
@@ -1563,7 +1563,6 @@ router_get_combined_status_by_digest(const char *digest)
|
|
|
_compare_digest_to_routerstatus_entry);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/* XXXX These should be configurable, perhaps? NM */
|
|
|
#define AUTHORITY_NS_CACHE_INTERVAL 10*60
|
|
|
#define NONAUTHORITY_NS_CACHE_INTERVAL 15*60
|
|
@@ -1995,7 +1994,7 @@ routers_update_all_from_networkstatus(void)
|
|
|
if (networkstatus_list_has_changed)
|
|
|
routerstatus_list_update_from_networkstatus(now);
|
|
|
|
|
|
- routers_update_status_from_networkstatus(routerlist->routers);
|
|
|
+ routers_update_status_from_networkstatus(routerlist->routers, 0);
|
|
|
|
|
|
me = router_get_my_routerinfo();
|
|
|
if (me) {
|
|
@@ -2003,7 +2002,7 @@ routers_update_all_from_networkstatus(void)
|
|
|
* dirservers list us as named, valid, etc. */
|
|
|
smartlist_t *lst = smartlist_create();
|
|
|
smartlist_add(lst, me);
|
|
|
- routers_update_status_from_networkstatus(lst);
|
|
|
+ routers_update_status_from_networkstatus(lst, 1);
|
|
|
if (me->is_verified == 0) {
|
|
|
log_fn(LOG_WARN, "Many directory servers list us as unverified. Please consider sending your identity fingerprint to the tor-ops.");
|
|
|
have_warned_about_unverified_status = 1;
|
|
@@ -2179,7 +2178,7 @@ routerstatus_list_update_from_networkstatus(time_t now)
|
|
|
* is_named, is_verified, and is_running fields according to our current
|
|
|
* networkstatus_t documents. */
|
|
|
void
|
|
|
-routers_update_status_from_networkstatus(smartlist_t *routers)
|
|
|
+routers_update_status_from_networkstatus(smartlist_t *routers, int reset_failures)
|
|
|
{
|
|
|
trusted_dir_server_t *ds;
|
|
|
routerstatus_t *rs;
|
|
@@ -2198,6 +2197,9 @@ routers_update_status_from_networkstatus(smartlist_t *routers)
|
|
|
if (!rs)
|
|
|
continue;
|
|
|
|
|
|
+ if (reset_failures)
|
|
|
+ rs->n_download_failures = 0;
|
|
|
+
|
|
|
if (!namingdir)
|
|
|
router->is_named = rs->is_named;
|
|
|
|
|
@@ -2250,8 +2252,10 @@ router_list_downloadable(void)
|
|
|
// log_fn(LOG_NOTICE, "No status for %s", fp);
|
|
|
continue;
|
|
|
}
|
|
|
- if (!memcmp(ri->signed_descriptor_digest,rs->descriptor_digest,DIGEST_LEN)
|
|
|
- || rs->published_on <= ri->published_on) {
|
|
|
+ /*XXXX001 reset max_routerdesc_download_failures somewhere! */
|
|
|
+ if (rs->n_download_failures >= MAX_ROUTERDESC_DOWNLOAD_FAILURES ||
|
|
|
+ !memcmp(ri->signed_descriptor_digest,rs->descriptor_digest,DIGEST_LEN)||
|
|
|
+ rs->published_on <= ri->published_on) {
|
|
|
/* Same digest, or earlier. No need to download it. */
|
|
|
// log_fn(LOG_NOTICE, "Up-to-date status for %s", fp);
|
|
|
strmap_remove(status_map, fp);
|