From 60164f057c4ac5471754f0326ab631448cd7c120 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 27 Oct 2017 09:13:43 -0400 Subject: [PATCH 1/8] dirvote: Move code. No behavior change Needed for next commit to address #23623. Signed-off-by: David Goulet --- src/or/dirvote.c | 76 ++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/or/dirvote.c b/src/or/dirvote.c index ba0ab7a77..ddaadb387 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -2787,44 +2787,6 @@ dirvote_get_start_of_next_interval(time_t now, int interval, int offset) return next; } -/* Using the time now, return the next voting valid-after time. */ -time_t -get_next_valid_after_time(time_t now) -{ - time_t next_valid_after_time; - const or_options_t *options = get_options(); - voting_schedule_t *new_voting_schedule = - get_voting_schedule(options, now, LOG_INFO); - tor_assert(new_voting_schedule); - - next_valid_after_time = new_voting_schedule->interval_starts; - voting_schedule_free(new_voting_schedule); - - return next_valid_after_time; -} - -static voting_schedule_t voting_schedule; - -/** Set voting_schedule to hold the timing for the next vote we should be - * doing. */ -void -dirvote_recalculate_timing(const or_options_t *options, time_t now) -{ - voting_schedule_t *new_voting_schedule; - - if (!authdir_mode_v3(options)) { - return; - } - - /* get the new voting schedule */ - new_voting_schedule = get_voting_schedule(options, now, LOG_NOTICE); - tor_assert(new_voting_schedule); - - /* Fill in the global static struct now */ - memcpy(&voting_schedule, new_voting_schedule, sizeof(voting_schedule)); - voting_schedule_free(new_voting_schedule); -} - /* Populate and return a new voting_schedule_t that can be used to schedule * voting. The object is allocated on the heap and it's the responsibility of * the caller to free it. Can't fail. */ @@ -2891,6 +2853,44 @@ voting_schedule_free(voting_schedule_t *voting_schedule_to_free) tor_free(voting_schedule_to_free); } +static voting_schedule_t voting_schedule; + +/* Using the time now, return the next voting valid-after time. */ +time_t +get_next_valid_after_time(time_t now) +{ + time_t next_valid_after_time; + const or_options_t *options = get_options(); + voting_schedule_t *new_voting_schedule = + get_voting_schedule(options, now, LOG_INFO); + tor_assert(new_voting_schedule); + + next_valid_after_time = new_voting_schedule->interval_starts; + voting_schedule_free(new_voting_schedule); + + return next_valid_after_time; +} + +/** Set voting_schedule to hold the timing for the next vote we should be + * doing. */ +void +dirvote_recalculate_timing(const or_options_t *options, time_t now) +{ + voting_schedule_t *new_voting_schedule; + + if (!authdir_mode_v3(options)) { + return; + } + + /* get the new voting schedule */ + new_voting_schedule = get_voting_schedule(options, now, LOG_NOTICE); + tor_assert(new_voting_schedule); + + /* Fill in the global static struct now */ + memcpy(&voting_schedule, new_voting_schedule, sizeof(voting_schedule)); + voting_schedule_free(new_voting_schedule); +} + /** Entry point: Take whatever voting actions are pending as of now. */ void dirvote_act(const or_options_t *options, time_t now) From 7ee0a2b9aa71693a09687dca431cc1880774f4f4 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 27 Oct 2017 09:16:29 -0400 Subject: [PATCH 2/8] sr: Don't use a dynamic voting schedule The exposed get_voting_schedule() allocates and return a new object everytime it is called leading to an awful lot of memory allocation when getting the start time of the current round which is done for each node in the consensus. Closes #23623 Signed-off-by: David Goulet --- src/or/dirvote.c | 17 ++++------------- src/or/dirvote.h | 7 +------ src/or/shared_random.c | 8 +------- src/or/shared_random_state.c | 17 +++++------------ src/or/shared_random_state.h | 2 +- src/test/test_shared_random.c | 17 ++++++----------- 6 files changed, 18 insertions(+), 50 deletions(-) diff --git a/src/or/dirvote.c b/src/or/dirvote.c index ddaadb387..6f237e9b2 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -2790,7 +2790,7 @@ dirvote_get_start_of_next_interval(time_t now, int interval, int offset) /* Populate and return a new voting_schedule_t that can be used to schedule * voting. The object is allocated on the heap and it's the responsibility of * the caller to free it. Can't fail. */ -voting_schedule_t * +static voting_schedule_t * get_voting_schedule(const or_options_t *options, time_t now, int severity) { int interval, vote_delay, dist_delay; @@ -2845,7 +2845,7 @@ get_voting_schedule(const or_options_t *options, time_t now, int severity) /** Frees a voting_schedule_t. This should be used instead of the generic * tor_free. */ -void +static void voting_schedule_free(voting_schedule_t *voting_schedule_to_free) { if (!voting_schedule_to_free) @@ -2857,18 +2857,9 @@ static voting_schedule_t voting_schedule; /* Using the time now, return the next voting valid-after time. */ time_t -get_next_valid_after_time(time_t now) +dirvote_get_next_valid_after_time(void) { - time_t next_valid_after_time; - const or_options_t *options = get_options(); - voting_schedule_t *new_voting_schedule = - get_voting_schedule(options, now, LOG_INFO); - tor_assert(new_voting_schedule); - - next_valid_after_time = new_voting_schedule->interval_starts; - voting_schedule_free(new_voting_schedule); - - return next_valid_after_time; + return voting_schedule.interval_starts; } /** Set voting_schedule to hold the timing for the next vote we should be diff --git a/src/or/dirvote.h b/src/or/dirvote.h index fb3e60f00..f8eb52de8 100644 --- a/src/or/dirvote.h +++ b/src/or/dirvote.h @@ -170,18 +170,13 @@ typedef struct { int have_published_consensus; } voting_schedule_t; -voting_schedule_t *get_voting_schedule(const or_options_t *options, - time_t now, int severity); - -void voting_schedule_free(voting_schedule_t *voting_schedule_to_free); - void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); time_t dirvote_get_start_of_next_interval(time_t now, int interval, int offset); void dirvote_recalculate_timing(const or_options_t *options, time_t now); void dirvote_act(const or_options_t *options, time_t now); -time_t get_next_valid_after_time(time_t now); +time_t dirvote_get_next_valid_after_time(void); /* invoked on timers and by outside triggers. */ struct pending_vote_t * dirvote_add_vote(const char *vote_body, diff --git a/src/or/shared_random.c b/src/or/shared_random.c index bbb7af0a3..b3f62a8fd 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -1333,13 +1333,7 @@ sr_act_post_consensus(const networkstatus_t *consensus) } /* Prepare our state so that it's ready for the next voting period. */ - { - voting_schedule_t *voting_schedule = - get_voting_schedule(options,time(NULL), LOG_NOTICE); - time_t interval_starts = voting_schedule->interval_starts; - sr_state_update(interval_starts); - voting_schedule_free(voting_schedule); - } + sr_state_update(dirvote_get_next_valid_after_time()); } /* Initialize shared random subsystem. This MUST be called early in the boot diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c index f74cb70a1..ae904cfda 100644 --- a/src/or/shared_random_state.c +++ b/src/or/shared_random_state.c @@ -139,25 +139,18 @@ get_voting_interval(void) * the SR protocol. For example, if it's 23:47:08, the current round thus * started at 23:47:00 for a voting interval of 10 seconds. */ STATIC time_t -get_start_time_of_current_round(time_t now) +get_start_time_of_current_round(void) { const or_options_t *options = get_options(); int voting_interval = get_voting_interval(); - voting_schedule_t *new_voting_schedule = - get_voting_schedule(options, now, LOG_DEBUG); - tor_assert(new_voting_schedule); - /* First, get the start time of the next round */ - time_t next_start = new_voting_schedule->interval_starts; + time_t next_start = dirvote_get_next_valid_after_time(); /* Now roll back next_start by a voting interval to find the start time of the current round. */ time_t curr_start = dirvote_get_start_of_next_interval( next_start - voting_interval - 1, voting_interval, options->TestingV3AuthVotingStartOffset); - - voting_schedule_free(new_voting_schedule); - return curr_start; } @@ -170,7 +163,7 @@ sr_state_get_start_time_of_current_protocol_run(time_t now) int total_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; int voting_interval = get_voting_interval(); /* Find the time the current round started. */ - time_t beginning_of_current_round = get_start_time_of_current_round(now); + time_t beginning_of_current_round = get_start_time_of_current_round(); /* Get current SR protocol round */ int current_round = (now / voting_interval) % total_rounds; @@ -208,7 +201,7 @@ get_state_valid_until_time(time_t now) voting_interval = get_voting_interval(); /* Find the time the current round started. */ - beginning_of_current_round = get_start_time_of_current_round(now); + beginning_of_current_round = get_start_time_of_current_round(); /* Find how many rounds are left till the end of the protocol run */ current_round = (now / voting_interval) % total_rounds; @@ -1370,7 +1363,7 @@ sr_state_init(int save_to_disk, int read_from_disk) /* We have a state in memory, let's make sure it's updated for the current * and next voting round. */ { - time_t valid_after = get_next_valid_after_time(now); + time_t valid_after = dirvote_get_next_valid_after_time(); sr_state_update(valid_after); } return 0; diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h index b6af6e172..866725c43 100644 --- a/src/or/shared_random_state.h +++ b/src/or/shared_random_state.h @@ -130,7 +130,7 @@ unsigned int sr_state_get_protocol_run_duration(void); STATIC int disk_state_load_from_disk_impl(const char *fname); STATIC sr_phase_t get_sr_protocol_phase(time_t valid_after); -STATIC time_t get_start_time_of_current_round(time_t now); +STATIC time_t get_start_time_of_current_round(void); STATIC time_t get_state_valid_until_time(time_t now); STATIC const char *get_phase_str(sr_phase_t phase); diff --git a/src/test/test_shared_random.c b/src/test/test_shared_random.c index a9d58e6b8..d9daa26ce 100644 --- a/src/test/test_shared_random.c +++ b/src/test/test_shared_random.c @@ -273,14 +273,9 @@ test_get_start_time_functions(void *arg) tt_assert(start_time_of_protocol_run); /* Check that the round start time of the beginning of the run, is itself */ - tt_int_op(get_start_time_of_current_round(start_time_of_protocol_run), OP_EQ, + tt_int_op(get_start_time_of_current_round(), OP_EQ, start_time_of_protocol_run); - /* Check that even if we increment the start time, we still get the start - time of the run as the beginning of the round. */ - tt_int_op(get_start_time_of_current_round(start_time_of_protocol_run+1), - OP_EQ, start_time_of_protocol_run); - done: ; } @@ -311,7 +306,7 @@ mock_networkstatus_get_live_consensus(time_t now) return mock_consensus; } -/** Test the get_next_valid_after_time() function. */ +/** Test the dirvote_get_next_valid_after_time() function. */ static void test_get_next_valid_after_time(void *arg) { @@ -324,7 +319,7 @@ test_get_next_valid_after_time(void *arg) { /* Setup a fake consensus just to get the times out of it, since - get_next_valid_after_time() needs them. */ + dirvote_get_next_valid_after_time() needs them. */ mock_consensus = tor_malloc_zero(sizeof(networkstatus_t)); retval = parse_rfc1123_time("Mon, 13 Jan 2016 16:00:00 UTC", @@ -344,7 +339,7 @@ test_get_next_valid_after_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); - valid_after_time = get_next_valid_after_time(current_time); + valid_after_time = dirvote_get_next_valid_after_time(); /* Compare it with the correct result */ format_iso_time(tbuf, valid_after_time); @@ -356,7 +351,7 @@ test_get_next_valid_after_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); - valid_after_time = get_next_valid_after_time(current_time); + valid_after_time = dirvote_get_next_valid_after_time(); /* Compare it with the correct result */ format_iso_time(tbuf, valid_after_time); @@ -367,7 +362,7 @@ test_get_next_valid_after_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:30:01 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); - valid_after_time = get_next_valid_after_time(current_time); + valid_after_time = dirvote_get_next_valid_after_time(); /* Compare it with the correct result */ format_iso_time(tbuf, valid_after_time); From ce99ebf25d3aec18ad840062a949aca4f98c14e6 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 31 Oct 2017 09:54:55 -0400 Subject: [PATCH 3/8] Make tor recalculate voting schedule even if not a dirauth Because the HS subsystem needs the voting schedule to compute time period, we need all tor type to do that. Part of #23623 Signed-off-by: David Goulet --- src/or/dirvote.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 6f237e9b2..c5ceefecb 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -2863,16 +2863,13 @@ dirvote_get_next_valid_after_time(void) } /** Set voting_schedule to hold the timing for the next vote we should be - * doing. */ + * doing. All type of tor do that because HS subsystem needs the timing as + * well to function properly. */ void dirvote_recalculate_timing(const or_options_t *options, time_t now) { voting_schedule_t *new_voting_schedule; - if (!authdir_mode_v3(options)) { - return; - } - /* get the new voting schedule */ new_voting_schedule = get_voting_schedule(options, now, LOG_NOTICE); tor_assert(new_voting_schedule); From 33da5d7672dc7ac13ce2093a5789fb6bc48e4f86 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 31 Oct 2017 14:07:41 -0400 Subject: [PATCH 4/8] test: Initialize the voting schedule in test_dir.c Signed-off-by: David Goulet --- src/test/test_dir.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/test_dir.c b/src/test/test_dir.c index b920655db..87b86c38b 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -2379,6 +2379,7 @@ test_a_networkstatus( sign_skey_2 = crypto_pk_new(); sign_skey_3 = crypto_pk_new(); sign_skey_leg1 = pk_generate(4); + dirvote_recalculate_timing(get_options(), now); sr_state_init(0, 0); tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_1, From 19d32fd0d643117cc809bafb1a68d1e004d806f3 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 31 Oct 2017 14:39:27 -0400 Subject: [PATCH 5/8] test: Fix voting schedule for shared random Part of #23623 Signed-off-by: David Goulet --- src/test/test_shared_random.c | 142 ++++++++++++++-------------------- 1 file changed, 60 insertions(+), 82 deletions(-) diff --git a/src/test/test_shared_random.c b/src/test/test_shared_random.c index d9daa26ce..cac78baec 100644 --- a/src/test/test_shared_random.c +++ b/src/test/test_shared_random.c @@ -131,7 +131,15 @@ test_get_sr_protocol_phase(void *arg) ; } -static networkstatus_t *mock_consensus = NULL; +static networkstatus_t mock_consensus; + +/* Mock function to immediately return our local 'mock_consensus'. */ +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + return &mock_consensus; +} static void test_get_state_valid_until_time(void *arg) @@ -143,11 +151,23 @@ test_get_state_valid_until_time(void *arg) (void) arg; + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + { /* Get the valid until time if called at 00:00:01 */ retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); valid_until_time = get_state_valid_until_time(current_time); /* Compare it with the correct result */ @@ -159,6 +179,7 @@ test_get_state_valid_until_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 19:22:00 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); valid_until_time = get_state_valid_until_time(current_time); format_iso_time(tbuf, valid_until_time); @@ -169,6 +190,7 @@ test_get_state_valid_until_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:00 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); valid_until_time = get_state_valid_until_time(current_time); format_iso_time(tbuf, valid_until_time); @@ -179,6 +201,7 @@ test_get_state_valid_until_time(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); valid_until_time = get_state_valid_until_time(current_time); format_iso_time(tbuf, valid_until_time); @@ -186,7 +209,7 @@ test_get_state_valid_until_time(void *arg) } done: - ; + UNMOCK(networkstatus_get_live_consensus); } /** Test the function that calculates the start time of the current SRV @@ -200,11 +223,23 @@ test_get_start_time_of_current_run(void *arg) (void) arg; + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + { /* Get start time if called at 00:00:01 */ retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); run_start_time = sr_state_get_start_time_of_current_protocol_run(current_time); @@ -217,6 +252,7 @@ test_get_start_time_of_current_run(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:59 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); run_start_time = sr_state_get_start_time_of_current_protocol_run(current_time); @@ -229,6 +265,7 @@ test_get_start_time_of_current_run(void *arg) retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", ¤t_time); tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); run_start_time = sr_state_get_start_time_of_current_protocol_run(current_time); @@ -237,6 +274,10 @@ test_get_start_time_of_current_run(void *arg) tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); } + /* Next test is testing it without a consensus to use the testing voting + * interval . */ + UNMOCK(networkstatus_get_live_consensus); + /* Now let's alter the voting schedule and check the correctness of the * function. Voting interval of 10 seconds, means that an SRV protocol run * takes 10 seconds * 24 rounds = 4 mins */ @@ -246,8 +287,8 @@ test_get_start_time_of_current_run(void *arg) options->TestingV3AuthInitialVotingInterval = 10; retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:15:32 UTC", ¤t_time); - tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); run_start_time = sr_state_get_start_time_of_current_protocol_run(current_time); @@ -266,8 +307,21 @@ static void test_get_start_time_functions(void *arg) { (void) arg; - time_t now = approx_time(); + int retval; + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + time_t now = mock_consensus.valid_after; + + dirvote_recalculate_timing(get_options(), now); time_t start_time_of_protocol_run = sr_state_get_start_time_of_current_protocol_run(now); tt_assert(start_time_of_protocol_run); @@ -276,7 +330,8 @@ test_get_start_time_functions(void *arg) tt_int_op(get_start_time_of_current_round(), OP_EQ, start_time_of_protocol_run); - done: ; + done: + UNMOCK(networkstatus_get_live_consensus); } static void @@ -298,81 +353,6 @@ test_get_sr_protocol_duration(void *arg) done: ; } -/* Mock function to immediately return our local 'mock_consensus'. */ -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - return mock_consensus; -} - -/** Test the dirvote_get_next_valid_after_time() function. */ -static void -test_get_next_valid_after_time(void *arg) -{ - time_t current_time; - time_t valid_after_time; - char tbuf[ISO_TIME_LEN + 1]; - int retval; - - (void) arg; - - { - /* Setup a fake consensus just to get the times out of it, since - dirvote_get_next_valid_after_time() needs them. */ - mock_consensus = tor_malloc_zero(sizeof(networkstatus_t)); - - retval = parse_rfc1123_time("Mon, 13 Jan 2016 16:00:00 UTC", - &mock_consensus->fresh_until); - tt_int_op(retval, OP_EQ, 0); - - retval = parse_rfc1123_time("Mon, 13 Jan 2016 15:00:00 UTC", - &mock_consensus->valid_after); - tt_int_op(retval, OP_EQ, 0); - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - } - - { - /* Get the valid after time if called at 00:00:00 */ - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - valid_after_time = dirvote_get_next_valid_after_time(); - - /* Compare it with the correct result */ - format_iso_time(tbuf, valid_after_time); - tt_str_op("2015-04-20 01:00:00", OP_EQ, tbuf); - } - - { - /* Get the valid until time if called at 00:00:01 */ - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - valid_after_time = dirvote_get_next_valid_after_time(); - - /* Compare it with the correct result */ - format_iso_time(tbuf, valid_after_time); - tt_str_op("2015-04-20 01:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:30:01 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - valid_after_time = dirvote_get_next_valid_after_time(); - - /* Compare it with the correct result */ - format_iso_time(tbuf, valid_after_time); - tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); - } - - done: - networkstatus_vote_free(mock_consensus); -} - /* In this test we are going to generate a sr_commit_t object and validate * it. We first generate our values, and then we parse them as if they were * received from the network. After we parse both the commit and the reveal, @@ -1381,8 +1361,6 @@ struct testcase_t sr_tests[] = { NULL, NULL }, { "encoding", test_encoding, TT_FORK, NULL, NULL }, - { "get_next_valid_after_time", test_get_next_valid_after_time, TT_FORK, - NULL, NULL }, { "get_start_time_of_current_run", test_get_start_time_of_current_run, TT_FORK, NULL, NULL }, { "get_start_time_functions", test_get_start_time_functions, From 814f4c6967d068f15ace98f78953a5dba0154ee7 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 31 Oct 2017 14:46:21 -0400 Subject: [PATCH 6/8] test: Fix voting schedule for hs_common.c Part of #23623 Signed-off-by: David Goulet --- src/test/test_hs_common.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/test/test_hs_common.c b/src/test/test_hs_common.c index 22fed12f1..b435a93e3 100644 --- a/src/test/test_hs_common.c +++ b/src/test/test_hs_common.c @@ -23,6 +23,7 @@ #include "config.h" #include "networkstatus.h" #include "directory.h" +#include "dirvote.h" #include "nodelist.h" #include "routerlist.h" #include "statefile.h" @@ -808,26 +809,41 @@ test_time_between_tp_and_srv(void *arg) ret = parse_rfc1123_time("Sat, 26 Oct 1985 00:00:00 UTC", &ns.valid_after); tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 01:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); ret = hs_in_period_between_tp_and_srv(&ns, 0); tt_int_op(ret, OP_EQ, 0); ret = parse_rfc1123_time("Sat, 26 Oct 1985 11:00:00 UTC", &ns.valid_after); tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); ret = hs_in_period_between_tp_and_srv(&ns, 0); tt_int_op(ret, OP_EQ, 0); ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.valid_after); tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); ret = hs_in_period_between_tp_and_srv(&ns, 0); tt_int_op(ret, OP_EQ, 1); ret = parse_rfc1123_time("Sat, 26 Oct 1985 23:00:00 UTC", &ns.valid_after); tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); ret = hs_in_period_between_tp_and_srv(&ns, 0); tt_int_op(ret, OP_EQ, 1); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 00:00:00 UTC", &ns.valid_after); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.valid_after); tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 01:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); ret = hs_in_period_between_tp_and_srv(&ns, 0); tt_int_op(ret, OP_EQ, 0); @@ -1314,6 +1330,7 @@ run_reachability_scenario(const reachability_cfg_t *cfg, int num_scenario) &mock_service_ns->valid_until); set_consensus_times(cfg->service_valid_until, &mock_service_ns->fresh_until); + dirvote_recalculate_timing(get_options(), mock_service_ns->valid_after); /* Set client consensus time. */ set_consensus_times(cfg->client_valid_after, &mock_client_ns->valid_after); @@ -1321,6 +1338,7 @@ run_reachability_scenario(const reachability_cfg_t *cfg, int num_scenario) &mock_client_ns->valid_until); set_consensus_times(cfg->client_valid_until, &mock_client_ns->fresh_until); + dirvote_recalculate_timing(get_options(), mock_client_ns->valid_after); /* New time period checks for this scenario. */ tt_int_op(hs_in_period_between_tp_and_srv(mock_service_ns, 0), OP_EQ, @@ -1544,6 +1562,7 @@ helper_set_consensus_and_system_time(networkstatus_t *ns, int position) } else { tt_assert(0); } + dirvote_recalculate_timing(get_options(), ns->valid_after); /* Set system time: pretend to be just 2 minutes before consensus expiry */ real_time = ns->valid_until - 120; From bd631a649b5cfae23fc13be08c72d5c1c0c70174 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 31 Oct 2017 14:48:27 -0400 Subject: [PATCH 7/8] test: Fix voting schedule for hs_service.c Part of #23623 Signed-off-by: David Goulet --- src/test/test_hs_service.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 462c860a9..3084c6b95 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -33,6 +33,7 @@ #include "circuitlist.h" #include "circuituse.h" #include "crypto.h" +#include "dirvote.h" #include "networkstatus.h" #include "nodelist.h" #include "relay.h" @@ -967,6 +968,7 @@ test_rotate_descriptors(void *arg) ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", &mock_ns.fresh_until); tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); /* Create a service with a default descriptor and state. It's added to the * global map. */ @@ -1004,6 +1006,7 @@ test_rotate_descriptors(void *arg) ret = parse_rfc1123_time("Sat, 27 Oct 1985 02:00:00 UTC", &mock_ns.fresh_until); tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); /* Note down what to expect for the next rotation time which is 01:00 + 23h * meaning 00:00:00. */ @@ -1065,6 +1068,7 @@ test_build_update_descriptors(void *arg) ret = parse_rfc1123_time("Sat, 26 Oct 1985 04:00:00 UTC", &mock_ns.fresh_until); tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); /* Create a service without a current descriptor to trigger a build. */ service = helper_create_service(); From 023f62bda474cb52a8a31ba2ae6de95f3e506b18 Mon Sep 17 00:00:00 2001 From: George Kadianakis Date: Tue, 7 Nov 2017 00:28:14 +0200 Subject: [PATCH 8/8] Add changes file for #23623. --- changes/bug23623 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changes/bug23623 diff --git a/changes/bug23623 b/changes/bug23623 new file mode 100644 index 000000000..1e2e5c2ac --- /dev/null +++ b/changes/bug23623 @@ -0,0 +1,4 @@ + o Minor bugfixes (onion services): + - Cache some needed onion service client information instead of + continuously computing it over and over again. Fixes bug 23623; bugfix + on 0.3.2.1-alpha.