From c6952f65ef535b3b59dd07b947315e1ac1116c8e Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Mon, 22 Feb 2016 02:47:57 -0500 Subject: [PATCH 1/4] new microdescs mean progress towards bootstrapping Now, when a user who has set EntryNodes finishes bootstrapping, Tor automatically repopulates the guard set based on this new directory information. Fixes bug 16825; bugfix on 0.2.3.1-alpha. --- changes/bug16825 | 7 +++++++ src/or/directory.c | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 changes/bug16825 diff --git a/changes/bug16825 b/changes/bug16825 new file mode 100644 index 0000000000..75c5627efd --- /dev/null +++ b/changes/bug16825 @@ -0,0 +1,7 @@ + o Minor bugfixes: + - Count receipt of new microdescriptors as progress towards + bootstrapping. Now, when a user who has set EntryNodes finishes + bootstrapping, Tor automatically repopulates the guard set based + on this new directory information. Fixes bug 16825; bugfix on + 0.2.3.1-alpha. + diff --git a/src/or/directory.c b/src/or/directory.c index ecf6da8ac1..b3af6f9c23 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -2168,6 +2168,8 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, count_loading_descriptors_progress()); + if (mds && smartlist_len(mds)) + directory_info_has_arrived(now, 0); SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); smartlist_free(which); smartlist_free(mds); From 43193ec888cbc15689b6db784d59c45c34a1e7f1 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Mon, 22 Feb 2016 02:54:32 -0500 Subject: [PATCH 2/4] refactor directory_info_has_arrived so we can quiet the logs no actual behavior changes --- src/or/directory.c | 8 ++++---- src/or/main.c | 6 +++--- src/or/main.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/or/directory.c b/src/or/directory.c index b3af6f9c23..b686286458 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1965,7 +1965,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) routers_update_all_from_networkstatus(now, 3); update_microdescs_from_networkstatus(now); update_microdesc_downloads(now); - directory_info_has_arrived(now, 0); + directory_info_has_arrived(now, 0, 0); log_info(LD_DIR, "Successfully loaded consensus."); } @@ -2001,7 +2001,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) * ones got flushed to disk so it's safe to call this on them */ connection_dir_download_cert_failed(conn, status_code); } else { - directory_info_has_arrived(now, 0); + directory_info_has_arrived(now, 0, 0); log_info(LD_DIR, "Successfully loaded certificates from fetch."); } } else { @@ -2115,7 +2115,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) if (load_downloaded_routers(body, which, descriptor_digests, conn->router_purpose, conn->base_.address)) - directory_info_has_arrived(now, 0); + directory_info_has_arrived(now, 0, 0); } } if (which) { /* mark remaining ones as failed */ @@ -2169,7 +2169,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, count_loading_descriptors_progress()); if (mds && smartlist_len(mds)) - directory_info_has_arrived(now, 0); + directory_info_has_arrived(now, 0, 0); SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); smartlist_free(which); smartlist_free(mds); diff --git a/src/or/main.c b/src/or/main.c index 408f2447c1..96a56fcb90 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1002,12 +1002,12 @@ directory_all_unreachable(time_t now) /** This function is called whenever we successfully pull down some new * network statuses or server descriptors. */ void -directory_info_has_arrived(time_t now, int from_cache) +directory_info_has_arrived(time_t now, int from_cache, int suppress_logs) { const or_options_t *options = get_options(); if (!router_have_minimum_dir_info()) { - int quiet = from_cache || + int quiet = suppress_logs || from_cache || directory_too_idle_to_fetch_descriptors(options, now); tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, "I learned some more directory information, but not enough to " @@ -2391,7 +2391,7 @@ do_main_loop(void) * appropriate.) */ now = time(NULL); - directory_info_has_arrived(now, 1); + directory_info_has_arrived(now, 1, 0); if (server_mode(get_options())) { /* launch cpuworkers. Need to do this *after* we've read the onion key. */ diff --git a/src/or/main.h b/src/or/main.h index 37e93d79d3..74071166e8 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -48,7 +48,7 @@ MOCK_DECL(void,connection_start_writing,(connection_t *conn)); void connection_stop_reading_from_linked_conn(connection_t *conn); void directory_all_unreachable(time_t now); -void directory_info_has_arrived(time_t now, int from_cache); +void directory_info_has_arrived(time_t now, int from_cache, int suppress_logs); void ip_address_changed(int at_interface); void dns_servers_relaunch_checks(void); From 56c5e282a733912776f6dacbe4f5df66b4fb9606 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Mon, 22 Feb 2016 02:55:42 -0500 Subject: [PATCH 3/4] avoid extra LOG_NOTICE for every new microdesc batch We already write out bootstrapping progress (see bug 9927) per new microdesc batch. There's no need to do a full "I learned some more directory information, but not enough to..." line each time too. --- src/or/directory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/or/directory.c b/src/or/directory.c index b686286458..7c3bfe5529 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -2169,7 +2169,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, count_loading_descriptors_progress()); if (mds && smartlist_len(mds)) - directory_info_has_arrived(now, 0, 0); + directory_info_has_arrived(now, 0, 1); SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); smartlist_free(which); smartlist_free(mds); From e3eaee1d2cbd0bc03a40e374376ca72195a9d64d Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Mon, 22 Feb 2016 03:02:01 -0500 Subject: [PATCH 4/4] avoid redundant bootstrap events if the number of descs we just fetched is 0 --- src/or/directory.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/or/directory.c b/src/or/directory.c index 7c3bfe5529..964b159512 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1764,7 +1764,7 @@ load_downloaded_routers(const char *body, smartlist_t *which, added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, descriptor_digests, buf); - if (general) + if (added && general) control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, count_loading_descriptors_progress()); return added; @@ -2166,10 +2166,11 @@ connection_dir_client_reached_eof(dir_connection_t *conn) /* Mark remaining ones as failed. */ dir_microdesc_download_failed(which, status_code); } - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - if (mds && smartlist_len(mds)) + if (mds && smartlist_len(mds)) { + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); directory_info_has_arrived(now, 0, 1); + } SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); smartlist_free(which); smartlist_free(mds);