diff options
Diffstat (limited to 'package/network/services/dnsmasq/patches/0035-lease-prune-lease-as-soon-as-expired.patch')
-rw-r--r-- | package/network/services/dnsmasq/patches/0035-lease-prune-lease-as-soon-as-expired.patch | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/package/network/services/dnsmasq/patches/0035-lease-prune-lease-as-soon-as-expired.patch b/package/network/services/dnsmasq/patches/0035-lease-prune-lease-as-soon-as-expired.patch new file mode 100644 index 0000000000..e1cfde86ba --- /dev/null +++ b/package/network/services/dnsmasq/patches/0035-lease-prune-lease-as-soon-as-expired.patch @@ -0,0 +1,42 @@ +From df6636bff61aa53ed7ad4b34d940805193c0bc74 Mon Sep 17 00:00:00 2001 +From: Florent Fourcot <florent.fourcot@wifirst.fr> +Date: Mon, 11 Feb 2019 17:04:44 +0100 +Subject: [PATCH 35/57] lease: prune lease as soon as expired + +We detected a performance issue on a dnsmasq running many dhcp sessions +(more than 10 000). At the end of the day, the server was only releasing +old DHCP leases but was consuming a lot of CPU. + +It looks like curent dhcp pruning: + 1) it's pruning old sessions (iterate on all current leases). It's + important to note that it's only pruning session expired since more + than one second + 2) it's looking for next lease to expire (iterate on all current leases + again) + 3) it launchs an alarm to catch next expiration found in step 2). This + value can be zero for leases just expired (but not pruned). + +So, for a second, dnsmasq could fall in a "prune loop" by doing: + * Not pruning anything, since difftime() is not > 0 + * Run alarm again with zero as argument + +On a server with very large number of leases and releasing often +sessions, that can waste a very big CPU time. + +Signed-off-by: Florent Fourcot <florent.fourcot@wifirst.fr> +Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> +--- + src/lease.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/src/lease.c ++++ b/src/lease.c +@@ -558,7 +558,7 @@ void lease_prune(struct dhcp_lease *targ + for (lease = leases, up = &leases; lease; lease = tmp) + { + tmp = lease->next; +- if ((lease->expires != 0 && difftime(now, lease->expires) > 0) || lease == target) ++ if ((lease->expires != 0 && difftime(now, lease->expires) >= 0) || lease == target) + { + file_dirty = 1; + if (lease->hostname) |