Browse Source

Merge branch 'maint-0.3.2'

Nick Mathewson 6 years ago
parent
commit
0dc1595d03
2 changed files with 18 additions and 4 deletions
  1. 6 0
      changes/bug24975
  2. 12 4
      src/or/networkstatus.c

+ 6 - 0
changes/bug24975

@@ -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.

+ 12 - 4
src/or/networkstatus.c

@@ -1600,7 +1600,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)
@@ -1934,9 +1938,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);
@@ -1959,6 +1960,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) {