]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Don't set unreachable from dirvote unless we've been running a while.
authorNick Mathewson <nickm@torproject.org>
Thu, 2 Jul 2009 17:56:52 +0000 (13:56 -0400)
committerNick Mathewson <nickm@torproject.org>
Sat, 10 Oct 2009 19:23:00 +0000 (15:23 -0400)
This is a possible fix for bug 1023, where if we vote (or make a v2
consensus networkstatus) right after we come online, we can call
rep_hist_note_router_unreachable() on every router we haven't connected
to yet, and thereby make all their uptime values reset.

ChangeLog
src/or/dirserv.c

index 8fd700fc6c9e89af93ca32bb81f00e22896b10a3..a4b7173431a91efe00dcdb1f3f5d5c79ff1ec1cb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -28,6 +28,9 @@ Changes in version 0.2.2.4-alpha - 2009-10-??
     - Don't count one-hop circuits when we're estimating how long it
       takes circuits to build on average. Otherwise we'll set our circuit
       build timeout lower than we should. Bugfix on 0.2.2.2-alpha.
+    - Directory authorities no longer change their opinion of, or vote on,
+      whether a router is Running, unless they have themselves been online
+      long enough to have some idea.  Fix for bug 1023.
 
   o Code simplifications and refactoring:
     - Revise our unit tests to use the "tinytest" framework, so we
index 5deb0ea413c858fc8b95956f74726599efc76c49..47dc0384545fe06d8b996d885e7f9561cfdf70e3 100644 (file)
@@ -896,6 +896,13 @@ list_single_server_status(routerinfo_t *desc, int is_live)
   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
  * than this number of seconds ago, or he is listed as down in
  * the directory. */
@@ -907,6 +914,10 @@ list_single_server_status(routerinfo_t *desc, int is_live)
 void
 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;
 
   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 ||
              now < router->last_reachable + REACHABLE_TIMEOUT;
 
-  if (!answer) {
+  if (!answer && running_long_enough_to_decide_unreachable()) {
     /* not considered reachable. tell rephist. */
     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;
   vote_timing_t timing;
   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(cert);
 
-  if (now - time_of_process_start <
-      options->TestingAuthDirTimeToLearnReachability)
-    vote_on_reachability = 0;
-
   if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) {
     log_warn(LD_NET, "Couldn't resolve my hostname");
     return NULL;