diff options
author | Taylor Yu <catalyst@torproject.org> | 2018-08-31 12:56:23 -0500 |
---|---|---|
committer | Taylor Yu <catalyst@torproject.org> | 2018-09-10 15:20:50 -0500 |
commit | 617160895ce9bb403fe5a864925ffb1894f9086c (patch) | |
tree | 812b243a81dd6c54516cbc6e3cde2b8e5859ceb4 /src/feature | |
parent | 687bf3ea645ef8c5ce8c9f02a25274121ca13318 (diff) | |
download | tor-617160895ce9bb403fe5a864925ffb1894f9086c.tar.gz tor-617160895ce9bb403fe5a864925ffb1894f9086c.zip |
Defer reporting directory bootstrap progress
Existing cached directory information can cause misleadingly high
bootstrap percentages. To improve user experience, defer reporting of
directory information progress until at least one connection has
succeeded to a relay or bridge.
Closes ticket 27169.
Diffstat (limited to 'src/feature')
-rw-r--r-- | src/feature/control/control.c | 39 | ||||
-rw-r--r-- | src/feature/control/control.h | 2 | ||||
-rw-r--r-- | src/feature/dircache/directory.c | 8 | ||||
-rw-r--r-- | src/feature/nodelist/nodelist.c | 4 |
4 files changed, 47 insertions, 6 deletions
diff --git a/src/feature/control/control.c b/src/feature/control/control.c index d68f1e3b07..2fac3bd6de 100644 --- a/src/feature/control/control.c +++ b/src/feature/control/control.c @@ -7178,6 +7178,45 @@ control_event_bootstrap(bootstrap_status_t status, int progress) } } +/** Flag whether we've opened an OR_CONN yet */ +static int bootstrap_first_orconn = 0; + +/** Like bootstrap_phase, but for (possibly deferred) directory progress */ +static int bootstrap_dir_phase = BOOTSTRAP_STATUS_UNDEF; + +/** Like bootstrap_problems, but for (possibly deferred) directory progress */ +static int bootstrap_dir_progress = BOOTSTRAP_STATUS_UNDEF; + +/** Defer directory info bootstrap events until we have successfully + * completed our first connection to a router. */ +void +control_event_boot_dir(bootstrap_status_t status, int progress) +{ + if (status > bootstrap_dir_progress) { + bootstrap_dir_progress = status; + bootstrap_dir_phase = status; + } + if (progress && progress >= bootstrap_dir_progress) { + bootstrap_dir_progress = progress; + } + + /* Don't report unless we have successfully opened at least one OR_CONN */ + if (!bootstrap_first_orconn) + return; + + control_event_bootstrap(status, progress); +} + +/** Set a flag to allow reporting of directory bootstrap progress. + * (Code that reports completion of an OR_CONN calls this.) Also, + * report directory progress so far. */ +void +control_event_boot_first_orconn(void) +{ + bootstrap_first_orconn = 1; + control_event_bootstrap(bootstrap_dir_phase, bootstrap_dir_progress); +} + /** Called when Tor has failed to make bootstrapping progress in a way * that indicates a problem. <b>warn</b> gives a human-readable hint * as to why, and <b>reason</b> provides a controller-facing short diff --git a/src/feature/control/control.h b/src/feature/control/control.h index 7f57228e5c..3445eb0a9d 100644 --- a/src/feature/control/control.h +++ b/src/feature/control/control.h @@ -195,6 +195,8 @@ void control_event_bootstrap(bootstrap_status_t status, int progress); MOCK_DECL(void, control_event_bootstrap_prob_or,(const char *warn, int reason, or_connection_t *or_conn)); +void control_event_boot_dir(bootstrap_status_t status, int progress); +void control_event_boot_first_orconn(void); void control_event_bootstrap_problem(const char *warn, const char *reason, const connection_t *conn, int dowarn); diff --git a/src/feature/dircache/directory.c b/src/feature/dircache/directory.c index de0bcdbfa7..b94c5317af 100644 --- a/src/feature/dircache/directory.c +++ b/src/feature/dircache/directory.c @@ -2226,8 +2226,8 @@ load_downloaded_routers(const char *body, smartlist_t *which, added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, descriptor_digests, buf); if (added && general) - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); + control_event_boot_dir(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); return added; } @@ -2949,8 +2949,8 @@ handle_response_fetch_microdesc(dir_connection_t *conn, dir_microdesc_download_failed(which, status_code, conn->identity_digest); } if (mds && smartlist_len(mds)) { - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); + control_event_boot_dir(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); directory_info_has_arrived(now, 0, 1); } SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); diff --git a/src/feature/nodelist/nodelist.c b/src/feature/nodelist/nodelist.c index 6dd501ea34..50dc8f7d3c 100644 --- a/src/feature/nodelist/nodelist.c +++ b/src/feature/nodelist/nodelist.c @@ -2528,7 +2528,7 @@ update_router_have_minimum_dir_info(void) (int)(paths*100), status); tor_free(status); res = 0; - control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); + control_event_boot_dir(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); goto done; } @@ -2553,7 +2553,7 @@ update_router_have_minimum_dir_info(void) /* If paths have just become available in this update. */ if (res && !have_min_dir_info) { control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO"); - control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0); + control_event_boot_dir(BOOTSTRAP_STATUS_CONN_OR, 0); log_info(LD_DIR, "We now have enough directory information to build circuits."); } |