]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r14531@catbus: nickm | 2007-08-13 14:46:25 -0400
authorNick Mathewson <nickm@torproject.org>
Mon, 13 Aug 2007 18:47:22 +0000 (18:47 +0000)
committerNick Mathewson <nickm@torproject.org>
Mon, 13 Aug 2007 18:47:22 +0000 (18:47 +0000)
 Cache v3 networkstatus consensuses on disk.

svn:r11086

ChangeLog
doc/TODO
src/or/dirvote.c
src/or/main.c
src/or/or.h
src/or/routerlist.c

index 564cc02ec0aadfd726fba568a7e610e02b049103..83cca79e42c0d667246a93f9f971d3a6321f8716 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,10 @@ Changes in version 0.2.0.5-alpha - 2007-??-??
     - Fix compile on platforms without getaddrinfo: bug found by Li-Hui
       Zhou.
 
+  o Minor features (directory voting):
+    - Store v3 consensus status consensuses on disk, and reload them
+      on startup.
+
   o Minor featuers (security):
     - Warn about unsafe ControlPort configurations.
 
index 238946f3dca6f934a0dc3f9bcf962f0687ce5d1d..98f32308b1ac832f178baeb565bdf51674ad32f2 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -92,7 +92,7 @@ Things we'd like to do in 0.2.0.x:
           * Detect whether votes are really all for the same period.
         - Push/pull documents as appropriate.
           - Pull votes and signatures if we don't get them.
-        - Store consensuses
+        o Store consensuses
         - Cache votes and signatures on disk.
         o Have clients know which authorities are v3 authorities, and what
           their keys are.
index ad15c0422605fa3d3b95825c0d436a934c83ef2b..e9b991d39e678a1b42d20fefae625b90ff315e21 100644 (file)
@@ -1400,7 +1400,7 @@ dirvote_publish_consensus(void)
       networkstatus_check_consensus_signature(pending_consensus)<0)
     return -1;
 
-  networkstatus_set_current_consensus(pending_consensus_body);
+  networkstatus_set_current_consensus(pending_consensus_body, 0);
   return 0;
 }
 
index 0086168a4d50b3beb0ec42c30f6703a3bcabb789..3719afe58c9702ac1274b878af98b5cdf65ed576 100644 (file)
@@ -1353,6 +1353,9 @@ do_main_loop(void)
   if (router_reload_networkstatus()) {
     return -1;
   }
+  if (router_reload_consensus_networkstatus()) {
+    return -1;
+  }
   directory_info_has_arrived(time(NULL),1);
 
   if (authdir_mode_tests_reachability(get_options())) {
index 142f5352c085c69f9c0783312294f2fc508d281e..96d0e74153cceab60b0fba7d2b093c69d99ee97c 100644 (file)
@@ -3427,9 +3427,10 @@ local_routerstatus_t *router_get_combined_status_by_descriptor_digest(
                                                           const char *digest);
 
 /* for consensuses. */
+int router_reload_consensus_networkstatus(void);
 networkstatus_vote_t *networkstatus_get_latest_consensus(void);
 networkstatus_vote_t *networkstatus_get_live_consensus(time_t now);
-int networkstatus_set_current_consensus(const char *consensus);
+int networkstatus_set_current_consensus(const char *consensus, int from_cache);
 
 //routerstatus_t *routerstatus_get_by_hexdigest(const char *hexdigest);
 int should_delay_dir_fetches(or_options_t *options);
index 0cff1709fde48999a89ded0a8c5b8f5fe83ea4fb..39518b6face4d1ec287824c37fda9aceaa5bc39d 100644 (file)
@@ -175,6 +175,27 @@ router_reload_networkstatus(void)
   return 0;
 }
 
+/**DOCDOC */
+int
+router_reload_consensus_networkstatus(void)
+{
+  char filename[512];
+  char *s;
+
+  tor_snprintf(filename,sizeof(filename),"%s"PATH_SEPARATOR"cached-consensus",
+               get_options()->DataDirectory);
+  s = read_file_to_str(filename, 0, NULL);
+  if (!s)
+    return 0;
+
+  if (networkstatus_set_current_consensus(s, 1)) {
+    log_warn(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
+             filename);
+  }
+  tor_free(s);
+  return 0;
+}
+
 /** Reload the cached v3 key certificates from the cached-certs file in
  * the data directory. Return 0 on success, -1 on failure. */
 int
@@ -3837,8 +3858,9 @@ networkstatus_get_live_consensus(time_t now)
   return current_consensus;
 }
 
+/** DOCDOC */
 int
-networkstatus_set_current_consensus(const char *consensus)
+networkstatus_set_current_consensus(const char *consensus, int from_cache)
 {
   networkstatus_vote_t *c;
   /* Make sure it's parseable. */
@@ -3857,6 +3879,15 @@ networkstatus_set_current_consensus(const char *consensus)
 
   current_consensus = c;
 
+  if (!from_cache) {
+    or_options_t *options = get_options();
+    char filename[512];
+    tor_snprintf(filename, sizeof(filename),
+                 "%s"PATH_SEPARATOR"cached-consensus",
+                 options->DataDirectory);
+    write_str_to_file(filename, consensus, 0);
+  }
+
   if (get_options()->DirPort)
     dirserv_set_cached_networkstatus_v3(consensus, c->valid_after);