Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
David Goulet
Tor
Commits
32db806d
Commit
32db806d
authored
Jul 16, 2018
by
Neel Chauhan
Browse files
Teach the OOM handler about the DNS cache
parent
d807ca1b
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/core/or/relay.c
View file @
32db806d
...
...
@@ -64,6 +64,7 @@
#include "lib/crypt_ops/crypto_rand.h"
#include "lib/crypt_ops/crypto_util.h"
#include "feature/dircache/directory.h"
#include "feature/relay/dns.h"
#include "feature/stats/geoip.h"
#include "feature/hs/hs_cache.h"
#include "core/mainloop/main.h"
...
...
@@ -2537,6 +2538,7 @@ cell_queues_check_size(void)
const
size_t
geoip_client_cache_total
=
geoip_client_cache_total_allocation
();
alloc
+=
geoip_client_cache_total
;
const
size_t
dns_cache_total
=
dns_cache_total_allocation
();
if
(
alloc
>=
get_options
()
->
MaxMemInQueues_low_threshold
)
{
last_time_under_memory_pressure
=
approx_time
();
if
(
alloc
>=
get_options
()
->
MaxMemInQueues
)
{
...
...
@@ -2554,6 +2556,11 @@ cell_queues_check_size(void)
(
size_t
)(
get_options
()
->
MaxMemInQueues
/
10
);
alloc
-=
geoip_client_cache_handle_oom
(
now
,
bytes_to_remove
);
}
if
(
dns_cache_total
>
get_options
()
->
MaxMemInQueues
/
5
)
{
const
size_t
bytes_to_remove
=
dns_cache_total
-
(
size_t
)(
get_options
()
->
MaxMemInQueues
/
10
);
alloc
-=
dns_cache_handle_oom
(
now
,
bytes_to_remove
);
}
circuits_handle_oom
(
alloc
);
return
1
;
}
...
...
src/feature/relay/dns.c
View file @
32db806d
...
...
@@ -2100,6 +2100,36 @@ dump_dns_mem_usage(int severity)
(
unsigned
)
hash_mem
);
}
/* Do a round of OOM cleanup on all DNS entries. Return the amount of removed
* bytes. It is possible that the returned value is lower than min_remove_bytes
* if the caches get emptied out so the caller should be aware of this. */
size_t
dns_cache_handle_oom
(
time_t
now
,
size_t
min_remove_bytes
)
{
time_t
time_inc
=
0
;
size_t
total_bytes_removed
=
0
;
size_t
current_size
=
dns_cache_total_allocation
();
do
{
/* If no DNS entries left, break loop. */
if
(
!
dns_cache_entry_count
())
break
;
/* Get cutoff interval and remove entries. */
time_t
cutoff
=
now
+
time_inc
;
purge_expired_resolves
(
cutoff
);
/* Update amount of bytes removed and array size. */
size_t
bytes_removed
=
current_size
-
dns_cache_total_allocation
();
current_size
-=
bytes_removed
;
total_bytes_removed
+=
bytes_removed
;
time_inc
+=
3600
;
/* Increase time_inc by 1 hour. */
}
while
(
total_bytes_removed
<
min_remove_bytes
);
return
total_bytes_removed
;
}
#ifdef DEBUG_DNS_CACHE
/** Exit with an assertion if the DNS cache is corrupt. */
static
void
...
...
src/feature/relay/dns.h
View file @
32db806d
...
...
@@ -40,6 +40,7 @@ int dns_seems_to_be_broken_for_ipv6(void);
void
dns_reset_correctness_checks
(
void
);
size_t
dns_cache_total_allocation
(
void
);
void
dump_dns_mem_usage
(
int
severity
);
size_t
dns_cache_handle_oom
(
time_t
now
,
size_t
min_remove_bytes
);
#ifdef DNS_PRIVATE
#include "feature/relay/dns_structs.h"
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment