[Dnsmasq-discuss] [PATCH] lease: prune lease as soon as expired

Simon Kelley simon at thekelleys.org.uk
Wed Feb 27 21:33:44 GMT 2019


Nice catch.

Patch applied.

Thanks for your work with that one.


Cheers,

Simon.



On 11/02/2019 16:04, Florent Fourcot wrote:
> 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 at wifirst.fr>
> ---
>  src/lease.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/lease.c b/src/lease.c
> index 97bee21..7299227 100644
> --- a/src/lease.c
> +++ b/src/lease.c
> @@ -563,7 +563,7 @@ void lease_prune(struct dhcp_lease *target, time_t now)
>    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)
> 




More information about the Dnsmasq-discuss mailing list