mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-29 05:17:57 +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.
|
||||
|
||||
- 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.
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user