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. - 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. - Fixed a coredump when adding a class via OMAPI.
- Check whether files are zero length before trying to parse them. - 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. */ * XXX result in its being allocated. */
/* Skip to the most expired lease in the pool that is not /* Skip to the most expired lease in the pool that is not
* owned by a failover peer. */ * owned by a failover peer. */
if (pool -> failover_peer) { if (pool->failover_peer != NULL) {
if (pool -> failover_peer -> i_am == primary) { if (pool->failover_peer->i_am == primary) {
if (pool -> backup) candl = pool->free;
*peer_has_leases = 1;
candl = pool -> free; /*
if (!candl) * In normal operation, we never want to touch
candl = pool -> abandoned; * 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 { } else {
if (pool -> free) candl = pool->backup;
*peer_has_leases = 1;
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 } else
#endif #endif
{ {
@ -3945,6 +3974,15 @@ int allocate_lease (struct lease **lp, struct packet *packet,
candl = pool -> abandoned; 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)) if (!candl || (candl -> ends > cur_time))
continue; continue;