Commit dce0b015 authored by Shawn Routhier's avatar Shawn Routhier
Browse files

- Rotate the lease file when running in v6 mode.

  [ISC-Bugs #24887]
parent cb366cd2
......@@ -52,6 +52,13 @@ The system has only been tested on Linux, FreeBSD, and Solaris, and may not
work on other platforms. Please report any problems and suggested fixes to
<dhcp-users@isc.org>.
Changes since 4.1-ESV-R5rc1
- Rotate the lease file when running in v6 mode.
Thanks to Christoph Moench-Tegeder at Astaro for the
report and the first version of the patch.
[ISC-Bugs #24887]
Changes since 4.1-ESV-R5b1
- None
......
......@@ -2572,6 +2572,7 @@ int write_billing_class (struct class *);
void commit_leases_timeout (void *);
void commit_leases_readerdry(void *);
int commit_leases (void);
int commit_leases_timed (void);
void db_startup (int);
int new_lease_file (void);
int group_writer (struct group_object *);
......
......@@ -36,6 +36,8 @@
#include <ctype.h>
#include <errno.h>
#define LEASE_REWRITE_PERIOD 3600
static isc_result_t write_binding_scope(FILE *db_file, struct binding *bnd,
char *prepend);
......@@ -988,7 +990,7 @@ int commit_leases ()
/* If we haven't rewritten the lease database in over an
hour, rewrite it now. (The length of time should probably
be configurable. */
if (count && cur_time - write_time > 3600) {
if (count && cur_time - write_time > LEASE_REWRITE_PERIOD) {
count = 0;
write_time = cur_time;
new_lease_file ();
......@@ -996,6 +998,21 @@ int commit_leases ()
return 1;
}
/*
* rewrite the lease file about once an hour
* This is meant as a quick patch for ticket 24887. It allows
* us to rotate the v6 lease file without adding too many fsync()
* calls. In the future wes should revisit this area and add
* something similar to the delayed ack code for v4.
*/
int commit_leases_timed()
{
if ((count != 0) && (cur_time - write_time > LEASE_REWRITE_PERIOD)) {
return (commit_leases());
}
return (1);
}
void db_startup (testp)
int testp;
{
......
......@@ -1206,6 +1206,10 @@ pick_v6_prefix(struct iasubopt **pref, int plen,
}
/*
*! \file server/dhcpv6.c
*
* \brief construct a reply containing information about a client's lease
*
* lease_to_client() is called from several messages to construct a
* reply that contains all that we know about the client's correct lease
* (or projected lease).
......@@ -1227,8 +1231,15 @@ pick_v6_prefix(struct iasubopt **pref, int plen,
* validate and echo back any contents that can be. If the client-supplied
* data does not error out (on renew/rebind as above), but we did not send
* any addresses, attempt to allocate one.
*
* At the end of the this function we call commit_leases_timed() to
* fsync and rotate the file as necessary. commit_leases_timed() will
* check that we have written at least one lease to the file and that
* some time has passed before doing any fsync or file rewrite so we
* don't bother tracking if we did a write_ia during this function.
*/
/* TODO: look at client hints for lease times */
static void
lease_to_client(struct data_string *reply_ret,
struct packet *packet,
......@@ -1486,6 +1497,9 @@ lease_to_client(struct data_string *reply_ret,
memcpy(reply_ret->buffer->data, reply.buf.data, reply.cursor);
reply_ret->data = reply_ret->buffer->data;
/* If appropriate commit and rotate the lease file */
(void) commit_leases_timed();
exit:
/* Cleanup. */
if (reply.shared != NULL)
......
......@@ -1716,6 +1716,13 @@ lease_timeout_support(void *vpool) {
iasubopt_dereference(&lease, MDL);
}
/*
* If appropriate commit and rotate the lease file
* As commit_leases_timed() checks to see if we've done any writes
* we don't bother tracking if this function called write _ia
*/
(void) commit_leases_timed();
/*
* Do some cleanup of our expired leases.
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment