From 4a1904c12665b98c356aba8e7b73a3f3fd508a5b Mon Sep 17 00:00:00 2001 From: David Goulet Date: Thu, 26 May 2016 15:26:09 -0400 Subject: prop250: Use the new dirvote_get_intermediate_param_value for AuthDirNumSRVAgreements Signed-off-by: David Goulet --- src/or/shared_random.c | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) (limited to 'src/or/shared_random.c') diff --git a/src/or/shared_random.c b/src/or/shared_random.c index 79151255fa..5cdf3d0287 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -105,6 +105,12 @@ static const char current_srv_str[] = "shared-rand-current-value"; static const char commit_ns_str[] = "shared-rand-commit"; static const char sr_flag_ns_str[] = "shared-rand-participate"; +/* The value of the consensus param AuthDirNumSRVAgreements found in the + * vote. This is set once the consensus creation subsystem requests the + * SRV(s) that should be put in the consensus. We use this value to decide + * if we keep or not an SRV. */ +static int32_t num_srv_agreements_from_vote; + /* Return a heap allocated copy of the SRV orig. */ STATIC sr_srv_t * srv_dup(const sr_srv_t *orig) @@ -737,18 +743,6 @@ save_commit_to_state(sr_commit_t *commit) } } -/* Return the number of required participants of the SR protocol. This is based - * on a consensus params. */ -static int -get_n_voters_for_srv_agreement(void) -{ - int num_dirauths = get_n_authorities(V3_DIRINFO); - /* If the params is not found, default value should always be the maximum - * number of trusted authorities. Let's not take any chances. */ - return networkstatus_get_param(NULL, "AuthDirNumSRVAgreements", - num_dirauths, 1, num_dirauths); -} - /* Return 1 if we should we keep an SRV voted by n_agreements auths. * Return 0 if we should ignore it. */ static int @@ -769,11 +763,9 @@ should_keep_srv(int n_agreements) * to keep it. */ if (sr_state_srv_is_fresh()) { /* Check if we have super majority for this new SRV value. */ - int num_required_agreements = get_n_voters_for_srv_agreement(); - - if (n_agreements < num_required_agreements) { + if (n_agreements < num_srv_agreements_from_vote) { log_notice(LD_DIR, "SR: New SRV didn't reach agreement [%d/%d]!", - n_agreements, num_required_agreements); + n_agreements, num_srv_agreements_from_vote); return 0; } } @@ -1253,9 +1245,14 @@ sr_get_string_for_vote(void) * * This is called when a consensus (any flavor) is bring created thus it * should NEVER change the state nor the state should be changed in between - * consensus creation. */ + * consensus creation. + * + * num_srv_agreements is taken from the votes thus the voted value + * that should be used. + * */ char * -sr_get_string_for_consensus(const smartlist_t *votes) +sr_get_string_for_consensus(const smartlist_t *votes, + int32_t num_srv_agreements) { char *srv_str; const or_options_t *options = get_options(); @@ -1269,6 +1266,9 @@ sr_get_string_for_consensus(const smartlist_t *votes) goto end; } + /* Set the global value of AuthDirNumSRVAgreements found in the votes. */ + num_srv_agreements_from_vote = num_srv_agreements; + /* Check the votes and figure out if SRVs should be included in the final * consensus. */ sr_srv_t *prev_srv = get_majority_srv_from_votes(votes, 0); @@ -1340,3 +1340,15 @@ sr_save_and_cleanup(void) sr_state_save(); sr_cleanup(); } + +#ifdef TOR_UNIT_TESTS + +/* Set the global value of number of SRV agreements so the test can play + * along by calling specific functions that don't parse the votes prior for + * the AuthDirNumSRVAgreements value. */ +void set_num_srv_agreements(int32_t value) +{ + num_srv_agreements_from_vote = value; +} + +#endif /* TOR_UNIT_TESTS */ -- cgit v1.2.3-54-g00ecf