|
@@ -896,6 +896,13 @@ list_single_server_status(routerinfo_t *desc, int is_live)
|
|
return tor_strdup(buf);
|
|
return tor_strdup(buf);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static INLINE int
|
|
|
|
+running_long_enough_to_decide_unreachable(void)
|
|
|
|
+{
|
|
|
|
+ return time_of_process_start
|
|
|
|
+ + get_options()->TestingAuthDirTimeToLearnReachability < approx_time();
|
|
|
|
+}
|
|
|
|
+
|
|
/** Each server needs to have passed a reachability test no more
|
|
/** Each server needs to have passed a reachability test no more
|
|
* than this number of seconds ago, or he is listed as down in
|
|
* than this number of seconds ago, or he is listed as down in
|
|
* the directory. */
|
|
* the directory. */
|
|
@@ -907,6 +914,10 @@ list_single_server_status(routerinfo_t *desc, int is_live)
|
|
void
|
|
void
|
|
dirserv_set_router_is_running(routerinfo_t *router, time_t now)
|
|
dirserv_set_router_is_running(routerinfo_t *router, time_t now)
|
|
{
|
|
{
|
|
|
|
+ /*XXXX022 This function is a mess. Separate out the part that calculates
|
|
|
|
+ whether it's reachable and the part that tells rephist that the router was
|
|
|
|
+ unreachable.
|
|
|
|
+ */
|
|
int answer;
|
|
int answer;
|
|
|
|
|
|
if (router_is_me(router) && !we_are_hibernating())
|
|
if (router_is_me(router) && !we_are_hibernating())
|
|
@@ -915,7 +926,7 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
|
|
answer = get_options()->AssumeReachable ||
|
|
answer = get_options()->AssumeReachable ||
|
|
now < router->last_reachable + REACHABLE_TIMEOUT;
|
|
now < router->last_reachable + REACHABLE_TIMEOUT;
|
|
|
|
|
|
- if (!answer) {
|
|
|
|
|
|
+ if (!answer && running_long_enough_to_decide_unreachable()) {
|
|
/* not considered reachable. tell rephist. */
|
|
/* not considered reachable. tell rephist. */
|
|
rep_hist_note_router_unreachable(router->cache_info.identity_digest, now);
|
|
rep_hist_note_router_unreachable(router->cache_info.identity_digest, now);
|
|
}
|
|
}
|
|
@@ -2420,15 +2431,11 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
|
|
networkstatus_voter_info_t *voter = NULL;
|
|
networkstatus_voter_info_t *voter = NULL;
|
|
vote_timing_t timing;
|
|
vote_timing_t timing;
|
|
digestmap_t *omit_as_sybil = NULL;
|
|
digestmap_t *omit_as_sybil = NULL;
|
|
- int vote_on_reachability = 1;
|
|
|
|
|
|
+ const int vote_on_reachability = running_long_enough_to_decide_unreachable();
|
|
|
|
|
|
tor_assert(private_key);
|
|
tor_assert(private_key);
|
|
tor_assert(cert);
|
|
tor_assert(cert);
|
|
|
|
|
|
- if (now - time_of_process_start <
|
|
|
|
- options->TestingAuthDirTimeToLearnReachability)
|
|
|
|
- vote_on_reachability = 0;
|
|
|
|
-
|
|
|
|
if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) {
|
|
if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) {
|
|
log_warn(LD_NET, "Couldn't resolve my hostname");
|
|
log_warn(LD_NET, "Couldn't resolve my hostname");
|
|
return NULL;
|
|
return NULL;
|