[tor-commits] [tor/master] Fix If-Modified-Since in rapidly updating Tor networks

nickm at torproject.org nickm at torproject.org
Tue Dec 23 19:25:51 UTC 2014


commit 8a8797f1e45e6124ac93e3a8fb277b5758d7c935
Author: teor <teor2345 at gmail.com>
Date:   Sat Dec 20 21:59:17 2014 +1100

    Fix If-Modified-Since in rapidly updating Tor networks
    
    When V3AuthVotingInterval is low, decrease the delay on the
    If-Modified-Since header passed to directory servers.
    This allows us to obtain consensuses promptly when the consensus
    interval is very short.
    
    This assists in bootstrapping a testing Tor network.
    
    Fixes bugs 13718 & 13963.
---
 changes/bug13963-decrease-if-modified-since-delay |    7 ++++++
 src/or/directory.c                                |   27 ++++++++++++++++++---
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/changes/bug13963-decrease-if-modified-since-delay b/changes/bug13963-decrease-if-modified-since-delay
new file mode 100644
index 0000000..6237144
--- /dev/null
+++ b/changes/bug13963-decrease-if-modified-since-delay
@@ -0,0 +1,7 @@
+  o Minor bugfixes:
+    - When V3AuthVotingInterval is low, decrease the delay on the
+      If-Modified-Since header passed to directory servers.
+      This allows us to obtain consensuses promptly when the consensus
+      interval is very short.
+      This assists in bootstrapping a testing Tor network.
+      Fixes bugs 13718 & 13963.
diff --git a/src/or/directory.c b/src/or/directory.c
index cca4b54..b88c9d9 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -433,18 +433,33 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
     if (resource)
       flav = networkstatus_parse_flavor_name(resource);
 
+    /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus
+     * period of 1 hour.
+     */
+#define DEFAULT_IF_MODIFIED_SINCE_DELAY (180)
     if (flav != -1) {
       /* IF we have a parsed consensus of this type, we can do an
        * if-modified-time based on it. */
       v = networkstatus_get_latest_consensus_by_flavor(flav);
-      if (v)
-        if_modified_since = v->valid_after + 180;
+      if (v) {
+        /* In networks with particularly short V3AuthVotingIntervals,
+         * ask for the consensus if it's been modified since half the
+         * V3AuthVotingInterval of the most recent consensus. */
+        time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY;
+        if (v->fresh_until > v->valid_after
+            && ims_delay > (v->fresh_until - v->valid_after)/2) {
+          ims_delay = (v->fresh_until - v->valid_after)/2;
+        }
+        if_modified_since = v->valid_after + ims_delay;
+      }
     } else {
       /* Otherwise it might be a consensus we don't parse, but which we
        * do cache.  Look at the cached copy, perhaps. */
       cached_dir_t *cd = dirserv_get_consensus(resource);
+      /* We have no method of determining the voting interval from an
+       * unparsed consensus, so we use the default. */
       if (cd)
-        if_modified_since = cd->published + 180;
+        if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY;
     }
   }
 
@@ -2258,6 +2273,7 @@ write_http_status_line(dir_connection_t *conn, int status,
     log_warn(LD_BUG,"status line too long.");
     return;
   }
+  log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase);
   connection_write_to_buf(buf, strlen(buf), TO_CONN(conn));
 }
 
@@ -2554,8 +2570,11 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
   if ((header = http_get_header(headers, "If-Modified-Since: "))) {
     struct tm tm;
     if (parse_http_time(header, &tm) == 0) {
-      if (tor_timegm(&tm, &if_modified_since)<0)
+      if (tor_timegm(&tm, &if_modified_since)<0) {
         if_modified_since = 0;
+      } else {
+        log_debug(LD_DIRSERV, "If-Modified-Since is '%s'.", escaped(header));
+      }
     }
     /* The correct behavior on a malformed If-Modified-Since header is to
      * act as if no If-Modified-Since header had been given. */





More information about the tor-commits mailing list