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:
parent
7d6180be3e
commit
8fbb55ff3f
3
RELNOTES
3
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.
|
- 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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user