2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-29 13:28:14 +00:00

- 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]
This commit is contained in:
David Hankins 2008-08-19 18:00:24 +00:00
parent 7d6180be3e
commit 8fbb55ff3f
2 changed files with 51 additions and 10 deletions

View File

@ -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.

View File

@ -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 {
if (pool -> free)
*peer_has_leases = 1;
candl = pool -> backup;
}
}
} else {
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;