diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 1e96fc7f54..c71a93beae 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -3442,9 +3442,13 @@ guards_retry_optimistic(const or_options_t *options) /** * Check if we are missing any crucial dirinfo for the guard subsystem to * work. Return NULL if everything went well, otherwise return a newly - * allocated string with an informative error message. */ + * allocated string with an informative error message. In the latter case, use + * the genreal descriptor information using_mds, num_present and + * num_usable to improve the error message. */ char * -guard_selection_get_dir_info_status_str(guard_selection_t *gs) +guard_selection_get_dir_info_status_str(guard_selection_t *gs, + int using_mds, + int num_present, int num_usable) { if (!gs->primary_guards_up_to_date) entry_guards_update_primary(gs); @@ -3478,8 +3482,9 @@ guard_selection_get_dir_info_status_str(guard_selection_t *gs) /* otherwise return a helpful error string */ tor_asprintf(&ret_str, "We're missing descriptors for %d/%d of our " - "primary entry guards", - n_missing_descriptors, num_primary_to_check); + "primary entry guards (total %sdescriptors: %d/%d).", + n_missing_descriptors, num_primary_to_check, + using_mds?"micro":"", num_present, num_usable); return ret_str; } @@ -3487,10 +3492,12 @@ guard_selection_get_dir_info_status_str(guard_selection_t *gs) /** As guard_selection_have_enough_dir_info_to_build_circuits, but uses * the default guard selection. */ char * -entry_guards_get_dir_info_status_str(void) +entry_guards_get_dir_info_status_str(int using_mds, + int num_present, int num_usable) { - return guard_selection_get_dir_info_status_str( - get_guard_selection_info()); + return guard_selection_get_dir_info_status_str(get_guard_selection_info(), + using_mds, + num_present, num_usable); } /** Free one guard selection context */ diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index d049a88cda..ca9fb489e6 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -572,8 +572,11 @@ int getinfo_helper_entry_guards(control_connection_t *conn, int entries_known_but_down(const or_options_t *options); void entries_retry_all(const or_options_t *options); -char *entry_guards_get_dir_info_status_str(void); -char *guard_selection_get_dir_info_status_str(guard_selection_t *gs); +char *entry_guards_get_dir_info_status_str(int using_mds, + int num_present, int num_usable); +char *guard_selection_get_dir_info_status_str(guard_selection_t *gs, + int using_mds, + int num_present, int num_usable); void entry_guards_free_all(void); diff --git a/src/or/nodelist.c b/src/or/nodelist.c index ff26065ff2..6ca9bd6d4b 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -2282,6 +2282,7 @@ update_router_have_minimum_dir_info(void) { time_t now = time(NULL); int res; + int num_present=0, num_usable=0; const or_options_t *options = get_options(); const networkstatus_t *consensus = networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor()); @@ -2303,7 +2304,6 @@ update_router_have_minimum_dir_info(void) /* Check fraction of available paths */ { char *status = NULL; - int num_present=0, num_usable=0; double paths = compute_frac_paths_available(consensus, options, now, &num_present, &num_usable, &status); @@ -2325,7 +2325,9 @@ update_router_have_minimum_dir_info(void) } { /* Check entry guard dirinfo status */ - char *guard_error = entry_guards_get_dir_info_status_str(); + char *guard_error = entry_guards_get_dir_info_status_str(using_md, + num_present, + num_usable); if (guard_error) { strlcpy(dir_info_status, guard_error, sizeof(dir_info_status)); tor_free(guard_error); @@ -2334,7 +2336,6 @@ update_router_have_minimum_dir_info(void) } } - done: /* If paths have just become available in this update. */ diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index 36e457bdf1..472383f382 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -1641,9 +1641,9 @@ test_entry_guard_manage_primary(void *arg) /* Do some dirinfo checks */ { - /* Check that we have all required dirinfo for the primaries (that's done in - * big_fake_network_setup()) */ - char *dir_info_str = guard_selection_get_dir_info_status_str(gs); + /* Check that we have all required dirinfo for the primaries (that's done + * in big_fake_network_setup()) */ + char *dir_info_str = guard_selection_get_dir_info_status_str(gs, 0, 0, 0); tt_assert(!dir_info_str); /* Now artificially remove the first primary's descriptor and re-check */ @@ -1652,9 +1652,10 @@ test_entry_guard_manage_primary(void *arg) /* Change the first primary's identity digest so that the mocked functions * can't find its descriptor */ memset(first_primary->identity, 9, sizeof(first_primary->identity)); - dir_info_str = guard_selection_get_dir_info_status_str(gs); + dir_info_str = guard_selection_get_dir_info_status_str(gs, 1, 2, 3); tt_str_op(dir_info_str, OP_EQ, - "We're missing descriptors for 1/2 of our primary entry guards"); + "We're missing descriptors for 1/2 of our primary entry guards " + "(total microdescriptors: 2/3)."); tor_free(dir_info_str); }