From: David Hankins Date: Tue, 22 May 2007 22:56:21 +0000 (+0000) Subject: - A flaw in failover startup sequences was repaired that sometimes left X-Git-Tag: v4_0_0a2~58 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc3b9c907d9164f6557d21ed63a6ea83af8a7904;p=thirdparty%2Fdhcp.git - A flaw in failover startup sequences was repaired that sometimes left the primary DHCP server's pool rebalance schedules unscheduled. [ISC-Bugs #16621] --- diff --git a/RELNOTES b/RELNOTES index 73d832dac..a844f984b 100644 --- a/RELNOTES +++ b/RELNOTES @@ -165,6 +165,9 @@ suggested fixes to . - 'dhcp.c(3953): non-null pointer' has been repaired. This fixes a flaw wherein the DHCPv4 server may ignore a configured server-identifier. +- A flaw in failover startup sequences was repaired that sometimes left + the primary DHCP server's pool rebalance schedules unscheduled. + Changes since 3.1.0a3 - Some spelling fixes. diff --git a/server/failover.c b/server/failover.c index e7fa66f44..90661639a 100644 --- a/server/failover.c +++ b/server/failover.c @@ -34,7 +34,7 @@ #ifndef lint static char copyright[] = -"$Id: failover.c,v 1.71 2007/05/19 19:16:27 dhankins Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; +"$Id: failover.c,v 1.72 2007/05/22 22:56:21 dhankins Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -52,6 +52,7 @@ static isc_result_t failover_message_reference (failover_message_t **, static isc_result_t failover_message_dereference (failover_message_t **, const char *file, int line); +static void dhcp_failover_pool_balance(dhcp_failover_state_t *state); static void dhcp_failover_pool_reqbalance(dhcp_failover_state_t *state); static int dhcp_failover_pool_dobalance(dhcp_failover_state_t *state); static INLINE int secondary_not_hoarding(dhcp_failover_state_t *state, @@ -1739,8 +1740,11 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state, switch (new_state) { case normal: /* Upon entering normal state, the server is expected to retransmit - * all pending binding updates. + * all pending binding updates. This is a good opportunity to + * rebalance the pool (potentially making new pending updates), + * which also schedules the next pool rebalance. */ + dhcp_failover_pool_balance(state); dhcp_failover_generate_update_queue(state, 0); if (state->update_queue_tail != NULL) { @@ -1748,8 +1752,6 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state, log_info("Sending updates to %s.", state->name); } - if (state -> partner.state == normal) - dhcp_failover_state_pool_check (state); break; case potential_conflict: @@ -2226,22 +2228,42 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state, return ISC_R_SUCCESS; } -/* Entry from timer. */ -void dhcp_failover_pool_rebalance(void *failover_state) +/* Balance operation manual entry. */ +static void +dhcp_failover_pool_balance(dhcp_failover_state_t *state) +{ + /* Cancel pending event. */ + cancel_timeout(dhcp_failover_pool_rebalance, state); + state->sched_balance = 0; + + dhcp_failover_pool_dobalance(state); +} + +/* Balance operation entry from timer event. */ +void +dhcp_failover_pool_rebalance(void *failover_state) { dhcp_failover_state_t *state; state = (dhcp_failover_state_t *)failover_state; + /* Clear scheduled event indicator. */ + state->sched_balance = 0; + if (dhcp_failover_pool_dobalance(state)) dhcp_failover_send_updates(state); } -/* Entry from POOLREQ. */ -static void dhcp_failover_pool_reqbalance(dhcp_failover_state_t *state) +/* Balance operation entry from POOLREQ protocol message. */ +static void +dhcp_failover_pool_reqbalance(dhcp_failover_state_t *state) { int queued; + /* Cancel pending event. */ + cancel_timeout(dhcp_failover_pool_rebalance, state); + state->sched_balance = 0; + queued = dhcp_failover_pool_dobalance(state); dhcp_failover_send_poolresp(state, queued); @@ -2273,8 +2295,6 @@ static int dhcp_failover_pool_dobalance(dhcp_failover_state_t *state) return 0; state->last_balance = cur_time; - cancel_timeout(dhcp_failover_pool_rebalance, state); - state->sched_balance = 0; for (s = shared_networks ; s ; s = s->next) { for (p = s->pools ; p ; p = p->next) {