Extend get_voting_interval() so that it's callable by relays.

In the past, only authorities and clients had to use that function because of
the SRV subsystem. However, because of its use in rep_hist_hs_stats_init() it
will now also be used by relays when bootstrapping without a consensus. Make it
do something sensible.

Another approach (instead of using magic values) would be to wait
initialization of HSv3 stats until we get a consensus but that seems messy to
schedule.

Another approach would be to make dirauth_sched_get_configured_interval() also
work for relays (particularly when TestingNetwork is enabled), but that also
seems a good amount of work.
This commit is contained in:
George Kadianakis 2020-11-02 12:42:08 +02:00
parent f2eff17126
commit d0be2ae7f9

View File

@ -33,12 +33,11 @@ srv_to_control_string(const sr_srv_t *srv)
} }
/** /**
* If we have no consensus and we are not an authority, assume that this is * If we have no consensus and we are not an authority, assume that this is the
* the voting interval. We should never actually use this: only authorities * voting interval. This can be used while bootstrapping as a relay and we are
* should be trying to figure out the schedule when they don't have a * asked to initialize HS stats (see rep_hist_hs_stats_init()) */
* consensus.
**/
#define DEFAULT_NETWORK_VOTING_INTERVAL (3600) #define DEFAULT_NETWORK_VOTING_INTERVAL (3600)
#define TESTING_DEFAULT_NETWORK_VOTING_INTERVAL (20)
/* This is an unpleasing workaround for tests. Our unit tests assume that we /* This is an unpleasing workaround for tests. Our unit tests assume that we
* are scheduling all of our shared random stuff as if we were a directory * are scheduling all of our shared random stuff as if we were a directory
@ -69,11 +68,13 @@ get_voting_interval(void)
* It's better than falling back to the non-consensus case. */ * It's better than falling back to the non-consensus case. */
interval = (int)(consensus->fresh_until - consensus->valid_after); interval = (int)(consensus->fresh_until - consensus->valid_after);
} else { } else {
/* We should never be reaching this point, since a client should never /* We can reach this as a relay when bootstrapping and we are asked to
* call this code unless they have some kind of a consensus. All we can * initialize HS stats (see rep_hist_hs_stats_init()). */
* do is hope that this network is using the default voting interval. */ if (get_options()->TestingTorNetwork) {
tor_assert_nonfatal_unreached_once(); interval = TESTING_DEFAULT_NETWORK_VOTING_INTERVAL;
interval = DEFAULT_NETWORK_VOTING_INTERVAL; } else {
interval = DEFAULT_NETWORK_VOTING_INTERVAL;
}
} }
tor_assert(interval > 0); tor_assert(interval > 0);
return interval; return interval;