Merge remote-tracking branch 'dgoulet/bug24975_032_01' into maint-0.3.2

This commit is contained in:
Nick Mathewson 2018-01-31 13:46:58 -05:00
commit 1c39d969b9
2 changed files with 18 additions and 4 deletions

6
changes/bug24975 Normal file
View File

@ -0,0 +1,6 @@
o Major bugfixes (scheduler, consensus):
- A logic in the code was preventing the scheduler subystem to properly
make a decision based on the latest consensus when it arrives. This lead
to the scheduler failing to notice any consensus parameters that might
change from one consensus to another. Fixes bug 24975; bugfix on
0.3.2.1-alpha.

View File

@ -1564,7 +1564,11 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c,
smartlist_free(changed);
}
/* Called when the consensus has changed from old_c to new_c. */
/* Called when the consensus has changed from old_c to new_c.
*
* IMPORTANT: This is called _after_ the new consensus has been set in the
* global state so this is safe for anything getting the latest consensus from
* that state. */
static void
notify_networkstatus_changed(const networkstatus_t *old_c,
const networkstatus_t *new_c)
@ -1897,9 +1901,6 @@ networkstatus_set_current_consensus(const char *consensus,
const int is_usable_flavor = flav == usable_consensus_flavor();
if (is_usable_flavor) {
notify_networkstatus_changed(networkstatus_get_latest_consensus(), c);
}
if (flav == FLAV_NS) {
if (current_ns_consensus) {
networkstatus_copy_old_consensus_info(c, current_ns_consensus);
@ -1922,6 +1923,13 @@ networkstatus_set_current_consensus(const char *consensus,
free_consensus = 0; /* avoid free */
}
/* Called _after_ the consensus is set in its global variable so any
* functions called from this notification can safely get the latest
* consensus being the new one. */
if (is_usable_flavor) {
notify_networkstatus_changed(networkstatus_get_latest_consensus(), c);
}
waiting = &consensus_waiting_for_certs[flav];
if (waiting->consensus &&
waiting->consensus->valid_after <= c->valid_after) {