2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-09-03 07:45:20 +00:00

- A new dhcp server option 'adaptive-lease-time-threshold' has been added

which causes the server to substantially reduce lease-times if there are
  few (configured percentage) remaining leases.  Thanks to a patch submitted
  from Christof Chen. [ISC-Bugs #15409]
This commit is contained in:
David Hankins
2006-07-31 23:17:24 +00:00
parent b543fea9d4
commit b22de5005c
5 changed files with 86 additions and 5 deletions

View File

@@ -162,6 +162,11 @@ and for prodding me into improving it.
language. Thanks to a patch written by Mattias Ronnblom, gotten to us language. Thanks to a patch written by Mattias Ronnblom, gotten to us
via Robin Breathe. via Robin Breathe.
- A new dhcp server option 'adaptive-lease-time-threshold' has been added
which causes the server to substantially reduce lease-times if there are
few (configured percentage) remaining leases. Thanks to a patch submitted
from Christof Chen.
Changes since 3.0.4 Changes since 3.0.4
- A warning that host statements declared within subnet or shared-network - A warning that host statements declared within subnet or shared-network

View File

@@ -512,6 +512,7 @@ struct lease_state {
#define SV_RESERVE_INFINITE 47 #define SV_RESERVE_INFINITE 47
#define SV_DDNS_CONFLICT_DETECT 48 #define SV_DDNS_CONFLICT_DETECT 48
#define SV_LEASEQUERY 49 #define SV_LEASEQUERY 49
#define SV_ADAPTIVE_LEASE_TIME_THRESHOLD 50
#if !defined (DEFAULT_PING_TIMEOUT) #if !defined (DEFAULT_PING_TIMEOUT)
# define DEFAULT_PING_TIMEOUT 1 # define DEFAULT_PING_TIMEOUT 1

View File

@@ -34,7 +34,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: dhcp.c,v 1.209 2006/07/25 13:26:00 shane Exp $ Copyright (c) 2004-2006 Internet Systems Consortium. All rights reserved.\n"; "$Id: dhcp.c,v 1.210 2006/07/31 23:17:24 dhankins Exp $ Copyright (c) 2004-2006 Internet Systems Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@@ -2021,6 +2021,62 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp)
} }
} }
/* CC: If there are less than
adaptive-lease-time-threshold % free leases,
hand out only short term leases */
memset(&d1, 0, sizeof(d1));
if (lease->pool &&
(oc = lookup_option(&server_universe, state->options,
SV_ADAPTIVE_LEASE_TIME_THRESHOLD)) &&
evaluate_option_cache(&d1, packet, lease, NULL,
packet->options, state->options,
&lease->scope, oc, MDL)) {
if (d1.len == 1 && d1.data[0] > 0 &&
d1.data[0] < 100) {
TIME adaptive_time;
int poolfilled, total, count;
if (min_lease_time)
adaptive_time = min_lease_time;
else
adaptive_time = DEFAULT_MIN_LEASE_TIME;
/* Allow the client to keep its lease. */
if (lease->ends - cur_time > adaptive_time)
adaptive_time = lease->ends - cur_time;
count = lease->pool->lease_count;
total = count - (lease->pool->free_leases +
lease->pool->backup_leases);
poolfilled = (total > (INT_MAX / 100)) ?
total / (count / 100) :
(total * 100) / count;
log_debug("Adap-lease: Total: %d, Free: %d, "
"Ends: %d, Adaptive: %d, Fill: %d, "
"Threshold: %d",
lease->pool->lease_count,
lease->pool->free_leases,
(int)(lease->ends - cur_time),
(int)adaptive_time, poolfilled,
d1.data[0]);
if (poolfilled >= d1.data[0] &&
lease_time > adaptive_time) {
log_info("Pool over threshold, time "
"for %s reduced from %d to "
"%d.", piaddr(lease->ip_addr),
(int)lease_time,
(int)adaptive_time);
lease_time = adaptive_time;
}
}
data_string_forget(&d1, MDL);
}
if (lease_time < min_lease_time) { if (lease_time < min_lease_time) {
if (min_lease_time) if (min_lease_time)
lease_time = min_lease_time; lease_time = min_lease_time;

View File

@@ -28,7 +28,7 @@
.\" see ``http://www.vix.com''. To learn more about Nominum, Inc., see .\" see ``http://www.vix.com''. To learn more about Nominum, Inc., see
.\" ``http://www.nominum.com''. .\" ``http://www.nominum.com''.
.\" .\"
.\" $Id: dhcpd.conf.5,v 1.78 2006/07/25 13:26:00 shane Exp $ .\" $Id: dhcpd.conf.5,v 1.79 2006/07/31 23:17:24 dhankins Exp $
.\" .\"
.TH dhcpd.conf 5 .TH dhcpd.conf 5
.SH NAME .SH NAME
@@ -617,7 +617,7 @@ The
statement statement
.RS 0.25i .RS 0.25i
.PP .PP
.B max-lease-misbalance \fIinteger\fR\fB;\fR .B max-lease-misbalance \fIpercentage\fR\fB;\fR
.PP .PP
The \fBmax-lease-misbalance\fR statement tells the DHCP server what The \fBmax-lease-misbalance\fR statement tells the DHCP server what
percentage of total free leases (as defined as the total number of percentage of total free leases (as defined as the total number of
@@ -636,7 +636,7 @@ The
statement statement
.RS 0.25i .RS 0.25i
.PP .PP
.B max-lease-ownership \fIinteger\fR\fB;\fR .B max-lease-ownership \fIpercentage\fR\fB;\fR
.PP .PP
The \fBmax-lease-ownership\fR statement tells the DHCP server what The \fBmax-lease-ownership\fR statement tells the DHCP server what
percentage of total free leases either it or its peer are normally allowed to percentage of total free leases either it or its peer are normally allowed to
@@ -1737,6 +1737,24 @@ force all clients that have been allocated addresses from this pool to
obtain new addresses immediately when they next renew. obtain new addresses immediately when they next renew.
.SH REFERENCE: PARAMETERS .SH REFERENCE: PARAMETERS
The The
.I adaptive-lease-time-threshold
statement
.RS 0.25i
.PP
.B adaptive-lease-time-threshold \fIpercentage\fR\fB;\fR
.PP
When the number of allocated leases within a pool rises above
the \fIpercentage\fR given in this statement, the DHCP server decreases
the lease length for new clients within this pool to \fImin-lease-time\fR
seconds. Clients renewing an already valid (long) leases get at least the
remaining time from the current lease. Since the leases expire faster,
the server may either recover more quickly or avoid pool exhaustion
entirely. Once the number of allocated leases drop below the threshold,
the server reverts back to normal lease times. Valid percentages are
between 1 and 99.
.RE
.PP
The
.I always-broadcast .I always-broadcast
statement statement
.RS 0.25i .RS 0.25i

View File

@@ -34,7 +34,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: stables.c,v 1.32 2006/07/19 17:14:55 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n"; "$Id: stables.c,v 1.33 2006/07/31 23:17:24 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@@ -234,6 +234,7 @@ static struct option server_options[] = {
{ "ping-timeout", "T", &server_universe, 46, 1 }, { "ping-timeout", "T", &server_universe, 46, 1 },
{ "infinite-is-reserved", "f", &server_universe, 47, 1 }, { "infinite-is-reserved", "f", &server_universe, 47, 1 },
{ "update-conflict-detection", "f", &server_universe, 48, 1 }, { "update-conflict-detection", "f", &server_universe, 48, 1 },
{ "adaptive-lease-time-threshold", "B", &server_universe, 50, 1 },
{ NULL, NULL, NULL, 0, 0 } { NULL, NULL, NULL, 0, 0 }
}; };