summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2013-10-10 20:09:16 -0400
committerRoger Dingledine <arma@torproject.org>2013-10-12 10:42:27 -0400
commit8f9fb63cdb188e27e39cf063c6a9e94df66cf239 (patch)
tree96634e92e75f223997b3fc3f637eb60ecb75d436
parent7ef2939e5a902c6159227de176622ee9388e34a4 (diff)
downloadtor-8f9fb63cdb188e27e39cf063c6a9e94df66cf239.tar.gz
tor-8f9fb63cdb188e27e39cf063c6a9e94df66cf239.zip
be willing to bootstrap from all three of our directory guards
Also fix a bug where if the guard we choose first doesn't answer, we would try the second guard, but once we connected to the second guard we would abandon it and retry the first one, slowing down bootstrapping. The fix in both cases is to treat all our initially chosen guards as acceptable to use. Fixes bug 9946.
-rw-r--r--changes/bug994611
-rw-r--r--src/or/entrynodes.c22
2 files changed, 28 insertions, 5 deletions
diff --git a/changes/bug9946 b/changes/bug9946
new file mode 100644
index 0000000000..5d1c888743
--- /dev/null
+++ b/changes/bug9946
@@ -0,0 +1,11 @@
+ o Minor bugfixes:
+ - If the guard we choose first doesn't answer, we would try the
+ second guard, but once we connected to the second guard we would
+ abandon it and retry the first one, slowing down bootstrapping.
+ The fix is to treat all our initially chosen guards as acceptable
+ to use. Fixes bug 9946; bugfix on 0.1.1.11-alpha.
+
+ o Major bugfixes:
+ - Stop trying to fetch all our directory information from our first
+ guard. Discovered while fixing bug 9946; bugfix on 0.2.4.8-alpha.
+
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index f1af75aefb..2aa063cda4 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -345,7 +345,7 @@ control_event_guard_deferred(void)
* Else, put the one we pick at the end of the list. */
static const node_t *
add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
- int for_directory)
+ int for_discovery, int for_directory)
{
const node_t *node;
entry_guard_t *entry;
@@ -404,6 +404,18 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
* this guard. For details, see the Jan 2010 or-dev thread. */
entry->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30);
entry->chosen_by_version = tor_strdup(VERSION);
+
+ /* Are we picking this guard because all of our current guards are
+ * down so we need another one (for_discovery is 1), or because we
+ * decided we need more variety in our guard list (for_discovery is 0)?
+ *
+ * Currently we hack this behavior into place by setting "made_contact"
+ * for guards of the latter variety, so we'll be willing to use any of
+ * them right off the bat.
+ */
+ if (!for_discovery)
+ entry->made_contact = 1;
+
((node_t*)node)->using_as_guard = 1;
if (prepend)
smartlist_insert(entry_guards, 0, entry);
@@ -437,7 +449,7 @@ pick_entry_guards(const or_options_t *options, int for_directory)
tor_assert(entry_guards);
while (num_live_entry_guards(for_directory) < num_needed) {
- if (!add_an_entry_guard(NULL, 0, 0, for_directory))
+ if (!add_an_entry_guard(NULL, 0, 0, 0, for_directory))
break;
changed = 1;
}
@@ -870,7 +882,7 @@ entry_guards_set_from_config(const or_options_t *options)
/* Next, the rest of EntryNodes */
SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) {
- add_an_entry_guard(node, 0, 0, 0);
+ add_an_entry_guard(node, 0, 0, 1, 0);
if (smartlist_len(entry_guards) > options->NumEntryGuards * 10)
break;
} SMARTLIST_FOREACH_END(node);
@@ -1054,7 +1066,7 @@ choose_random_entry_impl(cpath_build_state_t *state, int for_directory,
/* XXX if guard doesn't imply fast and stable, then we need
* to tell add_an_entry_guard below what we want, or it might
* be a long time til we get it. -RD */
- node = add_an_entry_guard(NULL, 0, 0, for_directory);
+ node = add_an_entry_guard(NULL, 0, 0, 1, for_directory);
if (node) {
entry_guards_changed();
/* XXX we start over here in case the new node we added shares
@@ -2095,7 +2107,7 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
node = node_get_mutable_by_id(ri->cache_info.identity_digest);
tor_assert(node);
rewrite_node_address_for_bridge(bridge, node);
- add_an_entry_guard(node, 1, 1, 0);
+ add_an_entry_guard(node, 1, 1, 0, 0);
log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname,
from_cache ? "cached" : "fresh", router_describe(ri));