]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r15907@catbus: nickm | 2007-10-18 10:18:53 -0400
authorNick Mathewson <nickm@torproject.org>
Thu, 18 Oct 2007 14:19:56 +0000 (14:19 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 18 Oct 2007 14:19:56 +0000 (14:19 +0000)
 Fix up logic for choosing the time at which to download a consensus: Never attempt it when the current consensus is still the most recent.

svn:r12020

ChangeLog
src/or/networkstatus.c

index 2e3f0311a49f703f12b9c464dc9da034adf00332..37bbba9562b53a981917e7e90862fe42b09dc114 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -40,6 +40,8 @@ Changes in version 0.2.0.9-alpha - 2007-10-??
     - Delete unverified-consensus when the real consensus is set.
     - Consider retrying a consensus networkstatus fetch immediately after one
       fails: don't wait 60 seconds to notice.
+    - When fetching a consensus as a cache, wait until a newer consensus
+      exists before trying to replace the current one.
 
   o Minor bugfixes (controller):
     - Don't reset trusted dir server list when we set a configuration option.
index a930011464b5e0506bac0bd96abe7e973a8b8b39..eac77f2f0c6b909c4c37fd2bf279dcd1292fa522 100644 (file)
@@ -761,21 +761,24 @@ update_consensus_networkstatus_fetch_time(time_t now)
   /* XXXX020 call this when DirPort switches on or off. NMNM */
   networkstatus_vote_t *c = networkstatus_get_live_consensus(now);
   if (c) {
+    long dl_interval;
+    long interval = c->fresh_until - c->valid_after;
     time_t start;
-    long interval;
     if (dirserver_mode(options)) {
-      start = c->valid_after + 120; /*XXXX020 make this a macro. */
-      /* XXXX020 too much magic. */
-      interval = (c->fresh_until - c->valid_after) / 2;
+      start = c->fresh_until + 120; /*XXXX020 make this a macro. */
+      dl_interval = interval/2;
     } else {
-      start = c->fresh_until;
+      start = c->fresh_until + (interval*3)/4;
       /* XXXX020 too much magic. */
-      interval = (c->valid_until - c->fresh_until) * 7 / 8;
+      dl_interval = (c->valid_until - start) * 7 / 8;
     }
-    if (interval < 1)
-      interval = 1;
-    tor_assert(start+interval < c->valid_until);
-    time_to_download_next_consensus = start + crypto_rand_int(interval);
+    if (dl_interval < 1)
+      dl_interval = 1;
+    /* We must not try to replace c while it's still the most valid: */
+    tor_assert(c->fresh_until < start);
+    /* We must download the next one before c is invalid: */
+    tor_assert(start+dl_interval < c->valid_until);
+    time_to_download_next_consensus = start + crypto_rand_int(dl_interval);
     {
       char tbuf[ISO_TIME_LEN+1];
       format_local_iso_time(tbuf, time_to_download_next_consensus);