[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r8491: backport weasel's r8398: - If we're a directory mirror and w (in tor/branches/tor-0_1_1-patches: . src/or)



Author: arma
Date: 2006-09-24 19:11:24 -0400 (Sun, 24 Sep 2006)
New Revision: 8491

Modified:
   tor/branches/tor-0_1_1-patches/ChangeLog
   tor/branches/tor-0_1_1-patches/src/or/directory.c
   tor/branches/tor-0_1_1-patches/src/or/or.h
   tor/branches/tor-0_1_1-patches/src/or/routerlist.c
Log:
backport weasel's r8398:
 - If we're a directory mirror and we ask for "all" network status
      documents, we would forget that's what we wanted and discard most
      of them when they arrived.


Modified: tor/branches/tor-0_1_1-patches/ChangeLog
===================================================================
--- tor/branches/tor-0_1_1-patches/ChangeLog	2006-09-24 23:09:35 UTC (rev 8490)
+++ tor/branches/tor-0_1_1-patches/ChangeLog	2006-09-24 23:11:24 UTC (rev 8491)
@@ -6,6 +6,9 @@
       whether we have enough directory information every time we want to
       do something, only check when the directory information has changed.
       This should improve client CPU usage by 25-50%.
+    - If we're a directory mirror and we ask for "all" network status
+      documents, we would forget that's what we wanted and discard most
+      of them when they arrived.
 
   o Minor bugfixes:
     - Allow Tor to start when RunAsDaemon is set but no logs are set.

Modified: tor/branches/tor-0_1_1-patches/src/or/directory.c
===================================================================
--- tor/branches/tor-0_1_1-patches/src/or/directory.c	2006-09-24 23:09:35 UTC (rev 8490)
+++ tor/branches/tor-0_1_1-patches/src/or/directory.c	2006-09-24 23:11:24 UTC (rev 8491)
@@ -977,6 +977,7 @@
 
   if (conn->purpose == DIR_PURPOSE_FETCH_NETWORKSTATUS) {
     smartlist_t *which = NULL;
+    int source;
     char *cp;
     log_info(LD_DIR,"Received networkstatus objects (size %d) from server "
              "'%s:%d'",(int) body_len, conn->address, conn->port);
@@ -993,11 +994,13 @@
     note_request(was_compressed?"dl/status.z":"dl/status", orig_len);
     if (conn->requested_resource &&
         !strcmpstart(conn->requested_resource,"fp/")) {
+      source = NS_FROM_DIR_BY_FP;
       which = smartlist_create();
       dir_split_resource_into_fingerprints(conn->requested_resource+3,
                                            which, NULL, 0);
     } else if (conn->requested_resource &&
                !strcmpstart(conn->requested_resource, "all")) {
+      source = NS_FROM_DIR_ALL;
       which = smartlist_create();
       SMARTLIST_FOREACH(router_get_trusted_dir_servers(),
                         trusted_dir_server_t *, ds,
@@ -1006,6 +1009,8 @@
           base16_encode(cp, HEX_DIGEST_LEN+1, ds->digest, DIGEST_LEN);
           smartlist_add(which, cp);
         });
+    } else {
+      source = NS_FROM_DIR_BY_FP; /* probably not reached */
     }
     cp = body;
     while (*cp) {
@@ -1013,7 +1018,7 @@
       if (next)
         next[1] = '\0';
       /* learn from it, and then remove it from 'which' */
-      if (router_set_networkstatus(cp, time(NULL), NS_FROM_DIR, which)<0)
+      if (router_set_networkstatus(cp, time(NULL), source, which)<0)
         break;
       if (next) {
         next[1] = 'n';

Modified: tor/branches/tor-0_1_1-patches/src/or/or.h
===================================================================
--- tor/branches/tor-0_1_1-patches/src/or/or.h	2006-09-24 23:09:35 UTC (rev 8490)
+++ tor/branches/tor-0_1_1-patches/src/or/or.h	2006-09-24 23:11:24 UTC (rev 8491)
@@ -2363,7 +2363,7 @@
 void router_load_routers_from_string(const char *s, int from_cache,
                                      smartlist_t *requested_fingerprints);
 typedef enum {
-  NS_FROM_CACHE, NS_FROM_DIR, NS_GENERATED
+  NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
 } networkstatus_source_t;
 int router_set_networkstatus(const char *s, time_t arrived_at,
                              networkstatus_source_t source,

Modified: tor/branches/tor-0_1_1-patches/src/or/routerlist.c
===================================================================
--- tor/branches/tor-0_1_1-patches/src/or/routerlist.c	2006-09-24 23:09:35 UTC (rev 8490)
+++ tor/branches/tor-0_1_1-patches/src/or/routerlist.c	2006-09-24 23:11:24 UTC (rev 8491)
@@ -2093,7 +2093,8 @@
   if (!networkstatus_list)
     networkstatus_list = smartlist_create();
 
-  if (source == NS_FROM_DIR && router_digest_is_me(ns->identity_digest)) {
+  if ( (source == NS_FROM_DIR_BY_FP || source == NS_FROM_DIR_ALL) &&
+       router_digest_is_me(ns->identity_digest)) {
     /* Don't replace our own networkstatus when we get it from somebody else.*/
     networkstatus_free(ns);
     return 0;
@@ -2105,12 +2106,14 @@
     } else {
       char *requested =
         smartlist_join_strings(requested_fingerprints," ",0,NULL);
-      log_warn(LD_DIR,
+      if (source != NS_FROM_DIR_ALL) {
+        log_warn(LD_DIR,
                "We received a network status with a fingerprint (%s) that we "
                "never requested. (We asked for: %s.) Dropping.",
                fp, requested);
-      tor_free(requested);
-      return 0;
+        tor_free(requested);
+        return 0;
+      }
     }
   }
 
@@ -2119,6 +2122,9 @@
       /* We got a non-trusted networkstatus, and we're a directory cache.
        * This means that we asked an authority, and it told us about another
        * authority we didn't recognize. */
+      log_info(LD_DIR,
+               "We do not recognize authority (%s) but we are willing "
+               "to cache it", fp);
       add_networkstatus_to_cache(s, source, ns);
       networkstatus_free(ns);
     }
@@ -2181,7 +2187,8 @@
 
   log_info(LD_DIR, "Setting networkstatus %s %s (published %s)",
            source == NS_FROM_CACHE?"cached from":
-           (source==NS_FROM_DIR?"downloaded from":"generated for"),
+           ((source == NS_FROM_DIR_BY_FP || source == NS_FROM_DIR_ALL) ?
+             "downloaded from":"generated for"),
            trusted_dir->description, published);
   networkstatus_list_has_changed = 1;
   router_dir_info_changed();