- Compilation problem with gcc4.5 and omshell.c resolved. [ISC-Bugs #23831]
+- If a client renews before 'dhcp-cache-threshold' percent of its lease
+ has elapsed (default 25%), the server will reuse the allocated lease
+ (provide a lease within the currently allocated lease-time) rather
+ than extend or renew the lease. This absolves the server of needing
+ to perform an fsync() operation on the lease database before reply,
+ which improves performance. [ISC-Bugs #22228]
+
Changes since 4.2.1rc1
- None
- Modify the dlpi code to accept getmsg() returning a positive value.
[ISC-Bugs #22824]
-
Changes since 4.2.0
- 'get-host-names true;' now also works even if 'use-host-decl-names true;'
#define SV_LIMIT_PREFS_PER_IA 57
#define SV_DELAYED_ACK 58
#define SV_MAX_ACK_DELAY 59
+#if defined(LDAP_CONFIGURATION)
+# define SV_LDAP_SERVER 60
+# define SV_LDAP_PORT 61
+# define SV_LDAP_USERNAME 62
+# define SV_LDAP_PASSWORD 63
+# define SV_LDAP_BASE_DN 64
+# define SV_LDAP_METHOD 65
+# define SV_LDAP_DEBUG_FILE 66
+# define SV_LDAP_DHCP_SERVER_CN 67
+# define SV_LDAP_REFERRALS 68
+#if defined (LDAP_USE_SSL)
+# define SV_LDAP_SSL 69
+# define SV_LDAP_TLS_REQCERT 70
+# define SV_LDAP_TLS_CA_FILE 71
+# define SV_LDAP_TLS_CA_DIR 72
+# define SV_LDAP_TLS_CERT 73
+# define SV_LDAP_TLS_KEY 74
+# define SV_LDAP_TLS_CRLCHECK 75
+# define SV_LDAP_TLS_CIPHERS 76
+# define SV_LDAP_TLS_RANDFILE 77
+#endif
+#endif
+#define SV_CACHE_THRESHOLD 78
#if !defined (DEFAULT_PING_TIMEOUT)
# define DEFAULT_PING_TIMEOUT 1
# define DEFAULT_MIN_ACK_DELAY_USECS 10000 /* 1/100 second */
#endif
-#if defined(LDAP_CONFIGURATION)
-# define SV_LDAP_SERVER 60
-# define SV_LDAP_PORT 61
-# define SV_LDAP_USERNAME 62
-# define SV_LDAP_PASSWORD 63
-# define SV_LDAP_BASE_DN 64
-# define SV_LDAP_METHOD 65
-# define SV_LDAP_DEBUG_FILE 66
-# define SV_LDAP_DHCP_SERVER_CN 67
-# define SV_LDAP_REFERRALS 68
-#if defined (LDAP_USE_SSL)
-# define SV_LDAP_SSL 69
-# define SV_LDAP_TLS_REQCERT 70
-# define SV_LDAP_TLS_CA_FILE 71
-# define SV_LDAP_TLS_CA_DIR 72
-# define SV_LDAP_TLS_CERT 73
-# define SV_LDAP_TLS_KEY 74
-# define SV_LDAP_TLS_CRLCHECK 75
-# define SV_LDAP_TLS_CIPHERS 76
-# define SV_LDAP_TLS_RANDFILE 77
-#endif
+#if !defined (DEFAULT_CACHE_THRESHOLD)
+# define DEFAULT_CACHE_THRESHOLD 25
#endif
#if !defined (DEFAULT_DEFAULT_LEASE_TIME)
struct in_addr from;
TIME remaining_time;
struct iaddr cip;
+#if defined(DELAYED_ACK)
+ isc_boolean_t enqueue = ISC_TRUE;
+#endif
+ int use_old_lease = 0;
unsigned i, j;
int s1;
packet -> raw -> chaddr,
sizeof packet -> raw -> chaddr); /* XXX */
} else {
+ int commit = (!offer || (offer == DHCPACK));
+ int thresh = DEFAULT_CACHE_THRESHOLD;
+
+ /*
+ * Check if the lease was issued recently, if so replay the
+ * current lease and do not require a database sync event.
+ * Recently is defined as being issued less than a given
+ * percentage of the lease previously. The percentage can be
+ * chosen either from a default value or via configuration.
+ *
+ */
+ if ((oc = lookup_option(&server_universe, state->options,
+ SV_CACHE_THRESHOLD)) &&
+ evaluate_option_cache(&d1, packet, lt, NULL,
+ packet->options, state->options,
+ <->scope, oc, MDL)) {
+ if (d1.len == 1 &&
+ (d1.data[0] >= 0) && (d1.data[0] < 100))
+ thresh = d1.data[0];
+
+ data_string_forget(&d1, MDL);
+ }
+
+ if ((thresh > 0) && (offer == DHCPACK) &&
+ (lease->binding_state == FTS_ACTIVE)) {
+ int limit;
+ int prev_lease = lease->ends - lease->starts;
+
+ /* it is better to avoid division by 0 */
+ if (prev_lease <= (INT_MAX / thresh))
+ limit = prev_lease * thresh / 100;
+ else
+ limit = prev_lease / 100 * thresh;
+
+ if ((lt->starts - lease->starts) <= limit) {
+ lt->starts = lease->starts;
+ state->offered_expiry = lt->ends = lease->ends;
+ commit = 0;
+ use_old_lease = 1;
+ }
+ }
+
#if !defined(DELAYED_ACK)
/* Install the new information on 'lt' onto the lease at
* 'lease'. If this is a DHCPOFFER, it is a 'soft' promise,
* the same lease to another client later, and that would be
* a conflict.
*/
- if (!supersede_lease(lease, lt, !offer || (offer == DHCPACK),
+ if (!use_old_lease && !supersede_lease(lease, lt, commit,
offer == DHCPACK, offer == DHCPACK)) {
#else /* defined(DELAYED_ACK) */
+ /*
+ * If there already isn't a need for a lease commit, and we
+ * can just answer right away, set a flag to indicate this.
+ */
+ if (commit && !(lease->flags & STATIC_LEASE) &&
+ (!offer || (offer == DHCPACK)))
+ enqueue = ISC_TRUE;
+ else
+ enqueue = ISC_FALSE;
+
/* Install the new information on 'lt' onto the lease at
* 'lease'. We will not 'commit' this information to disk
* yet (fsync()), we will 'propogate' the information if
} else {
lease->cltt = cur_time;
#if defined(DELAYED_ACK)
- if (!(lease->flags & STATIC_LEASE) &&
- (!offer || (offer == DHCPACK)))
+ if (enqueue)
delayed_ack_enqueue(lease);
else
#endif
.\" Support and other services are available for ISC products - see
.\" https://www.isc.org for more information or to learn more about ISC.
.\"
-.\" $Id: dhcpd.conf.5,v 1.106.18.3 2011/04/25 23:49:52 sar Exp $
+.\" $Id: dhcpd.conf.5,v 1.106.18.4 2011/05/12 14:01:15 tomasz Exp $
.\"
.TH dhcpd.conf 5
.SH NAME
with \'./configure --enable-delayed-ack\'.
.RE
.PP
+The
+.I dhcp-cache-threshold
+statement
+.RS 0.25i
+.PP
+.B dhcp-cache-threshold \fIpercentage\fB;\fR
+.PP
+The \fIdhcp-cache-threshold\fR statement takes one integer parameter
+with allowed values between 0 and 100. The default value is 25 (25% of
+the lease time). This parameter expresses the percentage of the total
+lease time, measured from the beginning, during which a
+client's attempt to renew its lease will result in getting
+the already assigned lease, rather than an extended lease.
+.PP
+Clients that attempt renewal frequently can cause the server to
+update and write the database frequently resulting in a performance
+impact on the server. The \fIdhcp-cache-threshold\fR
+statement instructs the DHCP server to avoid updating leases too
+frequently thus avoiding this behavior. Instead the server assigns the
+same lease with no modifications except for CLTT (Client Last
+Transmission Time) which does not require disk operations. This
+feature applies to IPv4 only.
+.RE
+.PP
The
.I do-forward-updates
statement
{ "ldap-tls-randfile", "t", &server_universe, 77, 1 },
#endif /* LDAP_USE_SSL */
#endif /* LDAP_CONFIGURATION */
+ { "dhcp-cache-threshold", "B", &server_universe, 78, 1 },
{ NULL, NULL, NULL, 0, 0 }
};