[tor-commits] [tor/master] Add support for offsetting the voting interval in order to bootstrap faster.

nickm at torproject.org nickm at torproject.org
Thu Jun 13 16:45:06 UTC 2013


commit 4d54b9774d11f47c6a670ab9b380e027a524f5f9
Author: Linus Nordberg <linus at torproject.org>
Date:   Wed Jun 5 15:48:57 2013 +0200

    Add support for offsetting the voting interval in order to bootstrap faster.
    
    A new option TestingV3AuthVotingStartOffset is added which offsets the
    starting time of the voting interval. This is possible only when
    TestingTorNetwork is set.
    
    This patch makes run_scheduled_events() check for new consensus
    downloads every second when TestingTorNetwork, instead of every
    minute. This should be fine, see #8532 for reasoning.
    
    This patch also brings MIN_VOTE_SECONDS and MIN_DIST_SECONDS down from
    20 to 2 seconds, unconditionally. This makes sanity checking of
    misconfiguration slightly less sane.
    
    Addresses #8532.
---
 changes/bug8532  |    4 ++++
 doc/tor.1.txt    |    4 ++++
 src/or/config.c  |   10 ++++++++++
 src/or/dirserv.c |    3 ++-
 src/or/dirvote.c |   21 ++++++++++++++-------
 src/or/dirvote.h |    8 +++++---
 src/or/main.c    |   15 ++++++++++++---
 src/or/or.h      |    4 ++++
 8 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/changes/bug8532 b/changes/bug8532
new file mode 100644
index 0000000..e9fd068
--- /dev/null
+++ b/changes/bug8532
@@ -0,0 +1,4 @@
+  o Minor features
+    - Add support for offsetting the voting interval in order to
+      bootstrap a network faster by adding configuration option
+      TestingV3AuthVotingStartOffset. Addresses #8532.
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index 72f75eb..37d374b 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -2032,6 +2032,10 @@ The following options are used for running a testing Tor network.
     the first consensus has been created. Changing this requires that
     **TestingTorNetwork** is set. (Default: 5 minutes)
 
+**TestingV3AuthVotingStartOffset** __N__ **seconds**|**minutes**|**hours**::
+    Directory authorities offset voting start time by this much.
+    Changing this requires that **TestingTorNetwork** is set. (Default: 0)
+
 **TestingAuthDirTimeToLearnReachability** __N__ **minutes**|**hours**::
     After starting as an authority, do not make claims about whether routers
     are Running until this much time has passed. Changing this requires
diff --git a/src/or/config.c b/src/or/config.c
index 2cdf5b2..f0cf312 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -413,6 +413,7 @@ static config_var_t option_vars_[] = {
   V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"),
   V(TestingV3AuthInitialVoteDelay, INTERVAL, "5 minutes"),
   V(TestingV3AuthInitialDistDelay, INTERVAL, "5 minutes"),
+  V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
   V(V3AuthVotingInterval,        INTERVAL, "1 hour"),
   V(V3AuthVoteDelay,             INTERVAL, "5 minutes"),
   V(V3AuthDistDelay,             INTERVAL, "5 minutes"),
@@ -475,6 +476,7 @@ static const config_var_t testing_tor_network_defaults[] = {
   V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
   V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
   V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"),
+  V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
   V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"),
   V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"),
   V(MinUptimeHidServDirectoryV2, INTERVAL, "0 minutes"),
@@ -3224,6 +3226,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
   CHECK_DEFAULT(TestingV3AuthInitialVotingInterval);
   CHECK_DEFAULT(TestingV3AuthInitialVoteDelay);
   CHECK_DEFAULT(TestingV3AuthInitialDistDelay);
+  CHECK_DEFAULT(TestingV3AuthVotingStartOffset);
   CHECK_DEFAULT(TestingAuthDirTimeToLearnReachability);
   CHECK_DEFAULT(TestingEstimatedDescriptorPropagationTime);
   CHECK_DEFAULT(TestingServerDownloadSchedule);
@@ -3261,6 +3264,13 @@ options_validate(or_options_t *old_options, or_options_t *options,
            "must be less than half TestingV3AuthInitialVotingInterval");
   }
 
+  if (options->TestingV3AuthVotingStartOffset >
+      MIN(options->TestingV3AuthInitialVotingInterval,
+          options->V3AuthVotingInterval)) {
+    REJECT("TestingV3AuthVotingStartOffset is higher than the voting "
+           "interval.");
+  }
+
   if (options->TestingAuthDirTimeToLearnReachability < 0) {
     REJECT("TestingAuthDirTimeToLearnReachability must be non-negative.");
   } else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) {
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index c75f638..8bc55a8 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -3093,7 +3093,8 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
     else
       last_consensus_interval = options->TestingV3AuthInitialVotingInterval;
     v3_out->valid_after =
-      dirvote_get_start_of_next_interval(now, (int)last_consensus_interval);
+      dirvote_get_start_of_next_interval(now, (int)last_consensus_interval,
+                                      options->TestingV3AuthVotingStartOffset);
     format_iso_time(tbuf, v3_out->valid_after);
     log_notice(LD_DIR,"Choosing valid-after time in vote as %s: "
                "consensus_set=%d, last_interval=%d",
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 0c386e6..4f0ab68 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -2523,12 +2523,13 @@ dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out)
   timing_out->dist_delay = options->V3AuthDistDelay;
 }
 
-/** Return the start of the next interval of size <b>interval</b> (in seconds)
- * after <b>now</b>.  Midnight always starts a fresh interval, and if the last
- * interval of a day would be truncated to less than half its size, it is
- * rolled into the previous interval. */
+/** Return the start of the next interval of size <b>interval</b> (in
+ * seconds) after <b>now</b>, plus <b>offset</b>. Midnight always
+ * starts a fresh interval, and if the last interval of a day would be
+ * truncated to less than half its size, it is rolled into the
+ * previous interval. */
 time_t
-dirvote_get_start_of_next_interval(time_t now, int interval)
+dirvote_get_start_of_next_interval(time_t now, int interval, int offset)
 {
   struct tm tm;
   time_t midnight_today=0;
@@ -2556,6 +2557,10 @@ dirvote_get_start_of_next_interval(time_t now, int interval)
   if (next + interval/2 > midnight_tomorrow)
     next = midnight_tomorrow;
 
+  next += offset;
+  if (next - interval > now)
+    next -= interval;
+
   return next;
 }
 
@@ -2619,8 +2624,10 @@ dirvote_recalculate_timing(const or_options_t *options, time_t now)
     vote_delay = dist_delay = interval / 4;
 
   start = voting_schedule.interval_starts =
-    dirvote_get_start_of_next_interval(now,interval);
-  end = dirvote_get_start_of_next_interval(start+1, interval);
+    dirvote_get_start_of_next_interval(now,interval,
+                                      options->TestingV3AuthVotingStartOffset);
+  end = dirvote_get_start_of_next_interval(start+1, interval,
+                                      options->TestingV3AuthVotingStartOffset);
 
   tor_assert(end > start);
 
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index b236452..a3e6cc0 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -13,9 +13,9 @@
 #define TOR_DIRVOTE_H
 
 /** Lowest allowable value for VoteSeconds. */
-#define MIN_VOTE_SECONDS 20
+#define MIN_VOTE_SECONDS 2
 /** Lowest allowable value for DistSeconds. */
-#define MIN_DIST_SECONDS 20
+#define MIN_DIST_SECONDS 2
 /** Smallest allowable voting interval. */
 #define MIN_VOTE_INTERVAL 300
 
@@ -86,7 +86,9 @@ authority_cert_t *authority_cert_dup(authority_cert_t *cert);
 
 /* vote scheduling */
 void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out);
-time_t dirvote_get_start_of_next_interval(time_t now, int interval);
+time_t dirvote_get_start_of_next_interval(time_t now,
+                                          int interval,
+                                          int offset);
 void dirvote_recalculate_timing(const or_options_t *options, time_t now);
 void dirvote_act(const or_options_t *options, time_t now);
 
diff --git a/src/or/main.c b/src/or/main.c
index 90ffba3..9e4efef 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -1153,6 +1153,7 @@ run_scheduled_events(time_t now)
   static time_t time_to_check_v3_certificate = 0;
   static time_t time_to_check_listeners = 0;
   static time_t time_to_check_descriptor = 0;
+  static time_t time_to_download_networkstatus = 0;
   static time_t time_to_shrink_memory = 0;
   static time_t time_to_try_getting_descriptors = 0;
   static time_t time_to_reset_descriptor_failures = 0;
@@ -1442,10 +1443,18 @@ run_scheduled_events(time_t now)
     networkstatus_v2_list_clean(now);
     /* Remove dead routers. */
     routerlist_remove_old_routers();
+  }
 
-    /* Also, once per minute, check whether we want to download any
-     * networkstatus documents.
-     */
+  /* 2c. Every minute (or every second if TestingTorNetwork), check
+   * whether we want to download any networkstatus documents. */
+
+/* How often do we check whether we should download network status
+ * documents? */
+#define CHECK_NETWORKSTATUS_DOWNLOAD_INTERVAL (60)
+
+  if (time_to_download_networkstatus < now && !options->DisableNetwork) {
+    time_to_download_networkstatus = now +
+      options->TestingTorNetwork ? 1 : CHECK_NETWORKSTATUS_DOWNLOAD_INTERVAL;
     update_networkstatus_downloads(now);
   }
 
diff --git a/src/or/or.h b/src/or/or.h
index daff6de..3e36eed 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3897,6 +3897,10 @@ typedef struct {
    * signatures.  Only altered on testing networks.*/
   int TestingV3AuthInitialDistDelay;
 
+  /** Offset in seconds added to the starting time for consensus
+      voting. Only altered on testing networks. */
+  int TestingV3AuthVotingStartOffset;
+
   /** If an authority has been around for less than this amount of time, it
    * does not believe its reachability information is accurate.  Only
    * altered on testing networks. */





More information about the tor-commits mailing list