Преглед на файлове

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 преди 14 години
родител
ревизия
68ae5afa5a
променени са 3 файла, в които са добавени 16 реда и са изтрити 3 реда
  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*/);