[tor-commits] [tor/master] Move consdiffmgr_rescan() into a mainloop event.

nickm at torproject.org nickm at torproject.org
Thu Apr 26 17:52:23 UTC 2018


commit 8a81a70878bb0f77ebdf1e6fda436b4b6af14f9a
Author: Nick Mathewson <nickm at torproject.org>
Date:   Thu Apr 26 12:20:01 2018 -0400

    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
---
 changes/ticket25931  |  9 +++++++++
 src/or/consdiffmgr.c | 33 +++++++++++++++++++++++++++++++--
 src/or/main.c        |  6 ------
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/changes/ticket25931 b/changes/ticket25931
new file mode 100644
index 000000000..20ce76188
--- /dev/null
+++ b/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.
+
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
index 02b905a52..323f4f9ca 100644
--- a/src/or/consdiffmgr.c
+++ b/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;
diff --git a/src/or/main.c b/src/or/main.c
index ffe407329..7e489a999 100644
--- a/src/or/main.c
+++ b/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





More information about the tor-commits mailing list