[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [tor/master 1/2] weight guard choice by bandwidth; discard old guards
Author: Roger Dingledine <arma@xxxxxxxxxxxxxx>
Date: Tue, 19 Jan 2010 17:30:52 -0500
Subject: weight guard choice by bandwidth; discard old guards
Commit: 0642ab242865c00816510934ea1c3f6ce6982db9
---
ChangeLog | 11 +++++++++++
src/or/circuitbuild.c | 29 ++++++++++++++++++++---------
2 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index a783590..998d14c 100644
--- a/ChangeLog
+++ b/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
Tor 0.2.1.22 fixes a critical privacy problem in bridge directory
authorities -- it would tell you its whole history of bridge descriptors
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 4b5ba62..1f4a493 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -1697,7 +1697,7 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state)
routerinfo_t *r, *choice;
smartlist_t *excluded;
or_options_t *options = get_options();
- router_crn_flags_t flags = 0;
+ router_crn_flags_t flags = CRN_NEED_GUARD;
if (state && options->UseEntryGuards &&
(purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) {
@@ -1734,7 +1734,6 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state)
}
if (state) {
- flags |= CRN_NEED_GUARD;
if (state->need_uptime)
flags |= CRN_NEED_UPTIME;
if (state->need_capacity)
@@ -2203,13 +2202,25 @@ remove_obsolete_entry_guards(void)
} else if (tor_version_parse(ver, &v)) {
msg = "does not seem to be from any recognized version of Tor";
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
* chosen_on_date is clipped to the beginning of its month. */
msg = "was selected several months ago";
--
1.6.5