Quellcode durchsuchen

Change who calls microdesc_cache_rebuild().

Previously we ensured that it would get called periodically by doing
it from inside the code that added microdescriptors.  That won't work
though: it would interfere with our code that tried to read microdescs
from disk initially.  Instead, we should consider rebuilding the cache
periodically, and on startup.
Nick Mathewson vor 14 Jahren
Ursprung
Commit
68ae5afa5a
3 geänderte Dateien mit 16 neuen und 3 gelöschten Zeilen
  1. 6 0
      changes/bug2230_part4
  2. 2 0
      src/or/main.c
  3. 8 3
      src/or/microdesc.c

+ 6 - 0
changes/bug2230_part4

@@ -0,0 +1,6 @@
+  o Minor bugfixes:
+    - Authorities now clean their microdesc cache periodically and when
+      reading from disk initially, not only when adding new descriptors.
+      This prevents a bug where we could lose microdescriptors.  Bugfix
+      on 0.2.2.6-alpha.
+

+ 2 - 0
src/or/main.c

@@ -1075,6 +1075,8 @@ run_scheduled_events(time_t now)
     rep_history_clean(now - options->RephistTrackTime);
     rend_cache_clean();
     rend_cache_clean_v2_descs_as_dir();
+    if (authdir_mode_v3(options))
+      microdesc_cache_rebuild(NULL, 0);
 #define CLEAN_CACHES_INTERVAL (30*60)
     time_to_clean_caches = now + CLEAN_CACHES_INTERVAL;
   }

+ 8 - 3
src/or/microdesc.c

@@ -208,8 +208,6 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
   if (f)
     finish_writing_to_file(open_file); /*XXX Check me.*/
 
-  microdesc_cache_rebuild(cache, 0/* only as needed */);
-
   return added;
 }
 
@@ -230,6 +228,7 @@ microdesc_cache_clear(microdesc_cache_t *cache)
   }
   cache->total_len_seen = 0;
   cache->n_seen = 0;
+  cache->bytes_dropped = 0;
 }
 
 /** Reload the contents of <b>cache</b> from disk.  If it is empty, load it
@@ -271,7 +270,7 @@ microdesc_cache_reload(microdesc_cache_t *cache)
   log_notice(LD_DIR, "Reloaded microdescriptor cache.  Found %d descriptors.",
              total);
 
-  microdesc_cache_clean(cache, 0, 0);
+  microdesc_cache_rebuild(cache, 0 /* don't force */);
 
   return 0;
 }
@@ -354,6 +353,12 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
   off_t off = 0;
   int orig_size, new_size;
 
+  if (cache == NULL) {
+    cache = the_microdesc_cache;
+    if (cache == NULL)
+      return 0;
+  }
+
   /* Remove dead descriptors */
   microdesc_cache_clean(cache, 0/*cutoff*/, 0/*force*/);