--- /dev/null
+ 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.
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)
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);
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) {