Browse Source

Move consdiffmgr_rescan() into a mainloop event.

The change here was very simple, since there is a flag set whenever
we want to schedule this event.

Closes ticket 25391.
m
Nick Mathewson 6 years ago
parent
commit
8a81a70878
3 changed files with 40 additions and 8 deletions
  1. 9 0
      changes/ticket25931
  2. 31 2
      src/or/consdiffmgr.c
  3. 0 6
      src/or/main.c

+ 9 - 0
changes/ticket25931

@@ -0,0 +1,9 @@
+  o Minor features (mainloop):
+    - Move responsibility for
+      rescanning the consensus cache
+      from a once-per-second callback to a callback that is only scheduled as
+      needed.  Once enough items are removed from our once-per-second
+      callback, we can eliminate it entirely to conserve CPU when idle.
+      Closes ticket:
+      25931.
+

+ 31 - 2
src/or/consdiffmgr.c

@@ -99,6 +99,14 @@ static const compress_method_t compress_diffs_with[] = {
 #endif
 };
 
+/**
+ * Event for rescanning the cache.
+ */
+static mainloop_event_t *consdiffmgr_rescan_ev = NULL;
+
+static void consdiffmgr_rescan_cb(mainloop_event_t *ev, void *arg);
+static void mark_cdm_cache_dirty(void);
+
 /** How many different methods will we try to use for diff compression? */
 STATIC unsigned
 n_diff_compression_methods(void)
@@ -372,7 +380,9 @@ cdm_cache_init(void)
   } else {
     consdiffmgr_set_cache_flags();
   }
-  cdm_cache_dirty = 1;
+  consdiffmgr_rescan_ev =
+    mainloop_event_postloop_new(consdiffmgr_rescan_cb, NULL);
+  mark_cdm_cache_dirty();
   cdm_cache_loaded = 0;
 }
 
@@ -1095,6 +1105,24 @@ consdiffmgr_rescan(void)
   cdm_cache_dirty = 0;
 }
 
+/** Callback wrapper for consdiffmgr_rescan */
+static void
+consdiffmgr_rescan_cb(mainloop_event_t *ev, void *arg)
+{
+  (void)ev;
+  (void)arg;
+  consdiffmgr_rescan();
+}
+
+/** Mark the cache as dirty, and schedule a rescan event. */
+static void
+mark_cdm_cache_dirty(void)
+{
+  cdm_cache_dirty = 1;
+  tor_assert(consdiffmgr_rescan_ev);
+  mainloop_event_activate(consdiffmgr_rescan_ev);
+}
+
 /**
  * Helper: compare two files by their from-valid-after and valid-after labels,
  * trying to sort in ascending order by from-valid-after (when present) and
@@ -1219,6 +1247,7 @@ consdiffmgr_free_all(void)
   memset(latest_consensus, 0, sizeof(latest_consensus));
   consensus_cache_free(cons_diff_cache);
   cons_diff_cache = NULL;
+  mainloop_event_free(consdiffmgr_rescan_ev);
 }
 
 /* =====
@@ -1750,7 +1779,7 @@ consensus_compress_worker_replyfn(void *work_)
                  compress_consensus_with,
                  job->out,
                  "consensus");
-  cdm_cache_dirty = 1;
+  mark_cdm_cache_dirty();
 
   unsigned u;
   consensus_flavor_t f = job->flavor;

+ 0 - 6
src/or/main.c

@@ -1730,12 +1730,6 @@ run_scheduled_events(time_t now)
   /* 11b. check pending unconfigured managed proxies */
   if (!net_is_disabled() && pt_proxies_configuration_pending())
     pt_configure_remaining_proxies();
-
-  /* 12. launch diff computations.  (This is free if there are none to
-   * launch.) */
-  if (dir_server_mode(options)) {
-    consdiffmgr_rescan();
-  }
 }
 
 /* Periodic callback: rotate the onion keys after the period defined by the