Browse Source

Fix bug noted by roger: rebuild extrainfo store from time to time, even if we have never actually downloaded an extrainfo. Bridge authorities need this, or they never clean the extrainfo store.

svn:r14792
Nick Mathewson 17 years ago
parent
commit
6bfa96bfc7
2 changed files with 15 additions and 6 deletions
  1. 2 0
      ChangeLog
  2. 13 6
      src/or/routerlist.c

+ 2 - 0
ChangeLog

@@ -54,6 +54,8 @@ Changes in version 0.2.1.1-alpha - 2008-??-??
     - When tunneling an encrypted directory connection, and its first circuit
     - When tunneling an encrypted directory connection, and its first circuit
       fails do not leave it unattached and ask the controller to deal.  Fixes
       fails do not leave it unattached and ask the controller to deal.  Fixes
       the second part of bug 681.
       the second part of bug 681.
+    - Make bridge authorities correctly clean extrainfo store from time to
+      time.  Bugfix on 0.2.0.x.
 
 
   o Minor features:
   o Minor features:
     - Allow separate log levels to be configured for different logging
     - Allow separate log levels to be configured for different logging

+ 13 - 6
src/or/routerlist.c

@@ -559,15 +559,18 @@ _compare_signed_descriptors_by_age(const void **_a, const void **_b)
   return (int)(r1->published_on - r2->published_on);
   return (int)(r1->published_on - r2->published_on);
 }
 }
 
 
-/** If the journal is too long, or if <b>force</b> is true, then atomically
+#define RRS_FORCE 1
- * replace the router store with the routers currently in our routerlist, and
+#define RRS_DONT_REMOVE_OLD 2
- * clear the journal.  Return 0 on success, -1 on failure.
+
+/** If the journal is too long, or if RRS_FORCE is set in <b>flags</b>, then
+ * atomically replace the router store with the routers currently in our
+ * routerlist, and clear the journal.  Return 0 on success, -1 on failure.
  *
  *
  * If <b>extrainfo</b> is true, rebuild the extrainfo store; else rebuild the
  * If <b>extrainfo</b> is true, rebuild the extrainfo store; else rebuild the
  * router descriptor store.
  * router descriptor store.
  */
  */
 static int
 static int
-router_rebuild_store(int force, desc_store_t *store)
+router_rebuild_store(int flags, desc_store_t *store)
 {
 {
   smartlist_t *chunk_list = NULL;
   smartlist_t *chunk_list = NULL;
   char *fname = NULL, *fname_tmp = NULL;
   char *fname = NULL, *fname_tmp = NULL;
@@ -577,6 +580,7 @@ router_rebuild_store(int force, desc_store_t *store)
   int nocache=0;
   int nocache=0;
   size_t total_expected_len = 0;
   size_t total_expected_len = 0;
   int had_any;
   int had_any;
+  int force = flags & RRS_FORCE;
 
 
   if (!force && !router_should_rebuild_store(store))
   if (!force && !router_should_rebuild_store(store))
     return 0;
     return 0;
@@ -590,7 +594,8 @@ router_rebuild_store(int force, desc_store_t *store)
                smartlist_len(routerlist->old_routers))>0;
                smartlist_len(routerlist->old_routers))>0;
 
 
   /* Don't save deadweight. */
   /* Don't save deadweight. */
-  routerlist_remove_old_routers();
+  if (!(flags & RRS_DONT_REMOVE_OLD))
+    routerlist_remove_old_routers();
 
 
   log_info(LD_DIR, "Rebuilding %s cache", store->description);
   log_info(LD_DIR, "Rebuilding %s cache", store->description);
 
 
@@ -781,7 +786,7 @@ router_reload_router_list_impl(desc_store_t *store)
 
 
   if (store->journal_len || read_from_old_location) {
   if (store->journal_len || read_from_old_location) {
     /* Always clear the journal on startup.*/
     /* Always clear the journal on startup.*/
-    router_rebuild_store(1, store);
+    router_rebuild_store(RRS_FORCE, store);
   } else if (!extrainfo) {
   } else if (!extrainfo) {
     /* Don't cache expired routers. (This is in an else because
     /* Don't cache expired routers. (This is in an else because
      * router_rebuild_store() also calls remove_old_routers().) */
      * router_rebuild_store() also calls remove_old_routers().) */
@@ -3193,6 +3198,8 @@ routerlist_remove_old_routers(void)
 
 
  done:
  done:
   digestset_free(retain);
   digestset_free(retain);
+  router_rebuild_store(RRS_DONT_REMOVE_OLD, &routerlist->desc_store);
+  router_rebuild_store(RRS_DONT_REMOVE_OLD,&routerlist->extrainfo_store);
 }
 }
 
 
 /** We just added a new set of descriptors. Take whatever extra steps
 /** We just added a new set of descriptors. Take whatever extra steps