From: Nick Mathewson Date: Mon, 12 Jan 2015 18:59:26 +0000 (-0500) Subject: Merge branch 'bug13806_squashed' X-Git-Tag: tor-0.2.6.3-alpha~167 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c2e200cef8b910434d8b5d251597081935392377;p=thirdparty%2Ftor.git Merge branch 'bug13806_squashed' Conflicts: src/or/relay.c --- c2e200cef8b910434d8b5d251597081935392377 diff --cc src/or/relay.c index 2d11096309,50070b7d90..28211ff8ff --- a/src/or/relay.c +++ b/src/or/relay.c @@@ -2447,13 -2441,22 +2447,25 @@@ cell_queues_check_size(void size_t alloc = cell_queues_get_total_allocation(); alloc += buf_get_total_allocation(); alloc += tor_zlib_get_total_allocation(); + const size_t rend_cache_total = rend_cache_get_total_allocation(); + alloc += rend_cache_total; + if (alloc >= get_options()->MaxMemInQueues_low_threshold) { + last_time_under_memory_pressure = approx_time(); - if (alloc >= get_options()->MaxMemInQueues) { - circuits_handle_oom(alloc); - return 1; + if (alloc >= get_options()->MaxMemInQueues) { + /* If we're spending over 20% of the memory limit on hidden service + * descriptors, free them until we're down to 10%. + */ + if (rend_cache_total > get_options()->MaxMemInQueues / 5) { + const size_t bytes_to_remove = + rend_cache_total - (get_options()->MaxMemInQueues / 10); + rend_cache_clean_v2_descs_as_dir(time(NULL), bytes_to_remove); + alloc -= rend_cache_total; + alloc += rend_cache_get_total_allocation(); } + circuits_handle_oom(alloc); + return 1; + } + } return 0; }