|
@@ -1564,7 +1564,11 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c,
|
|
|
smartlist_free(changed);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+ *
|
|
|
+ * 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;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * 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) {
|