|
@@ -225,6 +225,35 @@ rend_cache_free_all(void)
|
|
|
rend_cache_total_allocation = 0;
|
|
|
}
|
|
|
|
|
|
+/** Remove all entries that re REND_CACHE_FAILURE_MAX_AGE old. This is
|
|
|
+ * called every second.
|
|
|
+ *
|
|
|
+ * We have to clean these regurlarly else if for whatever reasons an hidden
|
|
|
+ * service goes offline and a client tries to connect to it during that
|
|
|
+ * time, a failure entry is created and the client will be unable to connect
|
|
|
+ * for a while even though the service has return online. */
|
|
|
+void
|
|
|
+rend_cache_failure_clean(time_t now)
|
|
|
+{
|
|
|
+ time_t cutoff = now - REND_CACHE_FAILURE_MAX_AGE;
|
|
|
+ STRMAP_FOREACH_MODIFY(rend_cache_failure, key,
|
|
|
+ rend_cache_failure_t *, ent) {
|
|
|
+ /* Free and remove every intro failure object that match the cutoff. */
|
|
|
+ DIGESTMAP_FOREACH_MODIFY(ent->intro_failures, ip_key,
|
|
|
+ rend_cache_failure_intro_t *, ip_ent) {
|
|
|
+ if (ip_ent->created_ts < cutoff) {
|
|
|
+ rend_cache_failure_intro_entry_free(ip_ent);
|
|
|
+ MAP_DEL_CURRENT(ip_key);
|
|
|
+ }
|
|
|
+ } DIGESTMAP_FOREACH_END;
|
|
|
+ /* If the entry is now empty of intro point failures, remove it. */
|
|
|
+ if (digestmap_isempty(ent->intro_failures)) {
|
|
|
+ rend_cache_failure_entry_free(ent);
|
|
|
+ MAP_DEL_CURRENT(key);
|
|
|
+ }
|
|
|
+ } STRMAP_FOREACH_END;
|
|
|
+}
|
|
|
+
|
|
|
/** Removes all old entries from the service descriptor cache.
|
|
|
*/
|
|
|
void
|