From: David Hankins Date: Tue, 19 Aug 2008 18:00:24 +0000 (+0000) Subject: - A partner-down failover server no longer emits 'peer holds all free leases' X-Git-Tag: v4_1_0a2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8fbb55ff3f1b770adfa91681f49a652b2e5de45c;p=thirdparty%2Fdhcp.git - A partner-down failover server no longer emits 'peer holds all free leases' if it is able to newly-allocate one of the peer's leases. [ISC-Bugs #18437] --- diff --git a/RELNOTES b/RELNOTES index d9f71f7a9..6223570b0 100644 --- a/RELNOTES +++ b/RELNOTES @@ -60,6 +60,9 @@ work on other platforms. Please report any problems and suggested fixes to - The server wasn't always sending the FQDN option when it should. +- A partner-down failover server no longer emits 'peer holds all free leases' + if it is able to newly-allocate one of the peer's leases. + - Fixed a coredump when adding a class via OMAPI. - Check whether files are zero length before trying to parse them. diff --git a/server/dhcp.c b/server/dhcp.c index 30097f552..72e34382c 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -3924,18 +3924,47 @@ int allocate_lease (struct lease **lp, struct packet *packet, * XXX result in its being allocated. */ /* Skip to the most expired lease in the pool that is not * owned by a failover peer. */ - if (pool -> failover_peer) { - if (pool -> failover_peer -> i_am == primary) { - if (pool -> backup) - *peer_has_leases = 1; - candl = pool -> free; - if (!candl) - candl = pool -> abandoned; + if (pool->failover_peer != NULL) { + if (pool->failover_peer->i_am == primary) { + candl = pool->free; + + /* + * In normal operation, we never want to touch + * the peer's leases. In partner-down + * operation, we need to be able to pick up + * the peer's leases after STOS+MCLT. + */ + if (pool->backup != NULL) { + if (((candl == NULL) || + (candl->ends > + pool->backup->ends)) && + lease_mine_to_reallocate( + pool->backup)) { + candl = pool->backup; + } else { + *peer_has_leases = 1; + } + } } else { - if (pool -> free) - *peer_has_leases = 1; - candl = pool -> backup; + candl = pool->backup; + + if (pool->free != NULL) { + if (((candl == NULL) || + (candl->ends > + pool->free->ends)) && + lease_mine_to_reallocate( + pool->free)) { + candl = pool->free; + } else { + *peer_has_leases = 1; + } + } } + + if ((candl == NULL) && + (pool->abandoned != NULL) && + lease_mine_to_reallocate(pool->abandoned)) + candl = pool->abandoned; } else #endif { @@ -3945,6 +3974,15 @@ int allocate_lease (struct lease **lp, struct packet *packet, candl = pool -> abandoned; } + /* + * XXX: This may not match with documented expectation. + * It's expected that when we OFFER a lease, we set its + * ends time forward 2 minutes so that it gets sorted to + * the end of its free list (avoiding a similar allocation + * to another client). It is not expected that we issue a + * "no free leases" error when the last lease has been + * offered, but it's not exactly broken either. + */ if (!candl || (candl -> ends > cur_time)) continue;