From cbbd2714d61e93f0c9115d705b706fd042bbfe0f Mon Sep 17 00:00:00 2001 From: Shawn Routhier Date: Tue, 15 May 2012 21:07:17 +0000 Subject: [PATCH] - Rotate the lease file when running in v6 mode. [ISC-Bugs #24887] --- RELNOTES | 5 +++++ includes/dhcpd.h | 1 + server/db.c | 19 ++++++++++++++++++- server/dhcpv6.c | 14 ++++++++++++++ server/mdb6.c | 7 +++++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/RELNOTES b/RELNOTES index b513813d..7e930b94 100644 --- a/RELNOTES +++ b/RELNOTES @@ -147,6 +147,11 @@ work on other platforms. Please report any problems and suggested fixes to The use of a boolean test instead of a bitwise test in dst. [ISC-Bugs #28941] +- 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.2.2 - Fix the code that checks for an existing DDNS transaction to cancel diff --git a/includes/dhcpd.h b/includes/dhcpd.h index 6e7817c6..98ba0751 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -2761,6 +2761,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 *); diff --git a/server/db.c b/server/db.c index 6cb84f71..5be1684a 100644 --- a/server/db.c +++ b/server/db.c @@ -36,6 +36,8 @@ #include #include +#define LEASE_REWRITE_PERIOD 3600 + static isc_result_t write_binding_scope(FILE *db_file, struct binding *bnd, char *prepend); @@ -1002,7 +1004,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 (); @@ -1010,6 +1012,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; { diff --git a/server/dhcpv6.c b/server/dhcpv6.c index e1f6e526..9d5fa1d1 100644 --- a/server/dhcpv6.c +++ b/server/dhcpv6.c @@ -1207,6 +1207,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). @@ -1228,8 +1232,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, @@ -1493,6 +1504,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) diff --git a/server/mdb6.c b/server/mdb6.c index e6d0a1ad..f82e301d 100644 --- a/server/mdb6.c +++ b/server/mdb6.c @@ -1714,6 +1714,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. */