From: Shawn Routhier Date: Tue, 15 May 2012 21:07:41 +0000 (+0000) Subject: - Rotate the lease file when running in v6 mode. X-Git-Tag: v4_2_4rc2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a310e68e7c3b4d07061aaa28df15a7a4c06ab198;p=thirdparty%2Fdhcp.git - Rotate the lease file when running in v6 mode. [ISC-Bugs #24887] --- diff --git a/RELNOTES b/RELNOTES index 5b352e37c..18a4ee109 100644 --- a/RELNOTES +++ b/RELNOTES @@ -39,6 +39,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 . + Changes since 4.2.4brc1 + +- 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.4b1 - None diff --git a/includes/dhcpd.h b/includes/dhcpd.h index f54864836..0ba5984a2 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -2779,6 +2779,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 d41aa485d..d32a88ef7 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 70f398115..afdf3bb50 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 e6d0a1ade..f82e301d3 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. */