Browse Source

weight guard choice by bandwidth; discard old guards

Roger Dingledine 15 years ago
parent
commit
0642ab2428
2 changed files with 31 additions and 9 deletions
  1. 11 0
      ChangeLog
  2. 20 9
      src/or/circuitbuild.c

+ 11 - 0
ChangeLog

@@ -1,3 +1,14 @@
+Changes in version 0.2.1.23 - 2010-0?-??
+  o Major bugfixes (performance):
+    - We were selecting our guards uniformly at random, and then weighting
+      which of our guards we'd use uniformly at random. This imbalance
+      meant that Tor clients were severely limited on throughput (and
+      probably latency too) by the first hop in their circuit. Now we
+      select guards weighted by currently advertised bandwidth. We also
+      automatically discard guards picked using the old algorithm. Fixes
+      bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry.
+
+
 Changes in version 0.2.1.22 - 2010-01-19
 Changes in version 0.2.1.22 - 2010-01-19
   Tor 0.2.1.22 fixes a critical privacy problem in bridge directory
   Tor 0.2.1.22 fixes a critical privacy problem in bridge directory
   authorities -- it would tell you its whole history of bridge descriptors
   authorities -- it would tell you its whole history of bridge descriptors

+ 20 - 9
src/or/circuitbuild.c

@@ -1697,7 +1697,7 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state)
   routerinfo_t *r, *choice;
   routerinfo_t *r, *choice;
   smartlist_t *excluded;
   smartlist_t *excluded;
   or_options_t *options = get_options();
   or_options_t *options = get_options();
-  router_crn_flags_t flags = 0;
+  router_crn_flags_t flags = CRN_NEED_GUARD;
 
 
   if (state && options->UseEntryGuards &&
   if (state && options->UseEntryGuards &&
       (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) {
       (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) {
@@ -1734,7 +1734,6 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state)
   }
   }
 
 
   if (state) {
   if (state) {
-    flags |= CRN_NEED_GUARD;
     if (state->need_uptime)
     if (state->need_uptime)
       flags |= CRN_NEED_UPTIME;
       flags |= CRN_NEED_UPTIME;
     if (state->need_capacity)
     if (state->need_capacity)
@@ -2203,13 +2202,25 @@ remove_obsolete_entry_guards(void)
     } else if (tor_version_parse(ver, &v)) {
     } else if (tor_version_parse(ver, &v)) {
       msg = "does not seem to be from any recognized version of Tor";
       msg = "does not seem to be from any recognized version of Tor";
       version_is_bad = 1;
       version_is_bad = 1;
-    } else if ((tor_version_as_new_as(ver, "0.1.0.10-alpha") &&
-                !tor_version_as_new_as(ver, "0.1.2.16-dev")) ||
-               (tor_version_as_new_as(ver, "0.2.0.0-alpha") &&
-                !tor_version_as_new_as(ver, "0.2.0.6-alpha"))) {
-      msg = "was selected without regard for guard bandwidth";
-      version_is_bad = 1;
-    } else if (entry->chosen_on_date + 3600*24*35 < this_month) {
+    } else {
+      size_t len = strlen(ver)+5;
+      char *tor_ver = tor_malloc(len);
+      tor_snprintf(tor_ver, len, "Tor %s", ver);
+      if ((tor_version_as_new_as(tor_ver, "0.1.0.10-alpha") &&
+           !tor_version_as_new_as(tor_ver, "0.1.2.16-dev")) ||
+          (tor_version_as_new_as(tor_ver, "0.2.0.0-alpha") &&
+           !tor_version_as_new_as(tor_ver, "0.2.0.6-alpha")) ||
+          /* above are bug 440; below are bug 1217 */
+          (tor_version_as_new_as(tor_ver, "0.2.1.3-alpha") &&
+           !tor_version_as_new_as(tor_ver, "0.2.1.23")) ||
+          (tor_version_as_new_as(tor_ver, "0.2.2.0-alpha") &&
+           !tor_version_as_new_as(tor_ver, "0.2.2.7-alpha"))) {
+        msg = "was selected without regard for guard bandwidth";
+        version_is_bad = 1;
+      }
+      tor_free(tor_ver);
+    }
+    if (!version_is_bad && entry->chosen_on_date + 3600*24*35 < this_month) {
       /* It's been more than a month, and probably more like two since
       /* It's been more than a month, and probably more like two since
        * chosen_on_date is clipped to the beginning of its month. */
        * chosen_on_date is clipped to the beginning of its month. */
       msg = "was selected several months ago";
       msg = "was selected several months ago";