]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Clean old descriptors from the service-side rend cache
authorDonncha O'Cearbhaill <donncha@donncha.is>
Tue, 25 Aug 2015 14:35:35 +0000 (16:35 +0200)
committerDonncha O'Cearbhaill <donncha@donncha.is>
Tue, 8 Sep 2015 10:34:05 +0000 (12:34 +0200)
Parameterize the rend_cache_clean() function to allow it clean
old rendezvous descriptors from the service-side cache as well as
the client descriptor cache.

src/or/main.c
src/or/rendcache.c
src/or/rendcache.h

index 0b0207b975ac279fcc07422b83b401b7bdb6bd08..9e798583f789d2fc8133af966b54e516bc446c8b 100644 (file)
@@ -1518,7 +1518,8 @@ run_scheduled_events(time_t now)
   /* Remove old information from rephist and the rend cache. */
   if (time_to.clean_caches < now) {
     rep_history_clean(now - options->RephistTrackTime);
-    rend_cache_clean(now);
+    rend_cache_clean(now, REND_CACHE_TYPE_CLIENT);
+    rend_cache_clean(now, REND_CACHE_TYPE_SERVICE);
     rend_cache_clean_v2_descs_as_dir(now, 0);
     microdesc_cache_rebuild(NULL, 0);
 #define CLEAN_CACHES_INTERVAL (30*60)
index aae37ebbf7d7c9273978523293ed099925849582..09f435ca8e8a8256343fce1c4aada8b2b32f7d75 100644 (file)
@@ -260,24 +260,33 @@ rend_cache_failure_clean(time_t now)
   } STRMAP_FOREACH_END;
 }
 
-/** Removes all old entries from the service descriptor cache.
+/** Removes all old entries from the client or service descriptor cache.
 */
 void
-rend_cache_clean(time_t now)
+rend_cache_clean(time_t now, rend_cache_type_t cache_type)
 {
   strmap_iter_t *iter;
   const char *key;
   void *val;
   rend_cache_entry_t *ent;
   time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW;
-  for (iter = strmap_iter_init(rend_cache); !strmap_iter_done(iter); ) {
+  strmap_t *cache = NULL;
+
+  if (cache_type == REND_CACHE_TYPE_CLIENT) {
+    cache = rend_cache;
+  } else if (cache_type == REND_CACHE_TYPE_SERVICE)  {
+    cache = rend_cache_service;
+  }
+  tor_assert(cache);
+
+  for (iter = strmap_iter_init(cache); !strmap_iter_done(iter); ) {
     strmap_iter_get(iter, &key, &val);
     ent = (rend_cache_entry_t*)val;
     if (ent->parsed->timestamp < cutoff) {
-      iter = strmap_iter_next_rmv(rend_cache, iter);
+      iter = strmap_iter_next_rmv(cache, iter);
       rend_cache_entry_free(ent);
     } else {
-      iter = strmap_iter_next(rend_cache, iter);
+      iter = strmap_iter_next(cache, iter);
     }
   }
 }
index e13c9b4d1dea69415742de7aa78480c0c5565d8b..f04d0871aed0cb67a2a5e3e3ed7aa82b8ddb767c 100644 (file)
@@ -54,7 +54,7 @@ typedef enum {
 } rend_cache_type_t;
 
 void rend_cache_init(void);
-void rend_cache_clean(time_t now);
+void rend_cache_clean(time_t now, rend_cache_type_t cache_type);
 void rend_cache_failure_clean(time_t now);
 void rend_cache_clean_v2_descs_as_dir(time_t now, size_t min_to_remove);
 void rend_cache_purge(void);