From 20c976ba5675d89dbd020981306fb06e5b834021 Mon Sep 17 00:00:00 2001 From: Thomas Markwalder Date: Wed, 10 Dec 2014 16:32:24 -0500 Subject: [PATCH] [v4_1_esv] Server will move FTS_BACKUP to FTS_FREE when pool has no peer Merges in rt36960. Note that for v4_1_esv a new compile switch, CONVERT_BACKUP_TO_FREE, was created which must be defined to enable the conversion of leases. It is off by default. --- RELNOTES | 10 ++++++++++ includes/site.h | 9 +++++++++ server/mdb.c | 17 +++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/RELNOTES b/RELNOTES index 19e26538a..02dfcaf3b 100644 --- a/RELNOTES +++ b/RELNOTES @@ -143,6 +143,16 @@ by Eric Young (eay@cryptsoft.com). components. [ISC-Bugs #20558] +- During startup, when the server encounters a lease whose binding state is + FTS_BACKUP but whose pool has no configured failover peer, it will reset the + lease's binding state to FTS_FREE. This allows the leases to be reclaimed + by the server after a pool's configuration has changed from failover to + standalone. Prior to this such leases would remain stuck in the backup state + making them unavailable for assignment. This behavior is off by default. + It is enabled by defining CONVERT_BACKUP_TO_FREE in includes/site.h and + will occur whether or not the server is compiled for failover. + [ISC-Bugs #36960] + Changes since 4.1-ESV-R10rc1 - None diff --git a/includes/site.h b/includes/site.h index 6a5b724ef..c4168f811 100644 --- a/includes/site.h +++ b/includes/site.h @@ -272,3 +272,12 @@ 64 indicates that the first 64 bits are the subnet or on-link prefix. */ #define DHCLIENT_DEFAULT_PREFIX_LEN 64 + +/* Enable conversion at startup of leases from FTS_BACKUP to FTS_FREE + when either their pool has no configured failover peer or + FAILOVER_PROTOCOL is not enabled. This allows the leases to be + reclaimed by the server after a pool's configuration has changed + from failover to standalone. Prior to this such leases would remain + stuck in the backup state. */ +/* #define CONVERT_BACKUP_TO_FREE */ + diff --git a/server/mdb.c b/server/mdb.c index 4bb711764..b605ed511 100644 --- a/server/mdb.c +++ b/server/mdb.c @@ -2475,6 +2475,23 @@ lease_instantiate(const void *key, unsigned len, void *object) lease->ip_addr.len, MDL); return ISC_R_SUCCESS; } + +#if defined (CONVERT_BACKUP_TO_FREE) +#if defined (FAILOVER_PROTOCOL) + /* If the lease is in FTS_BACKUP but there is no peer, then the + * pool must have been formerly configured for failover and + * is now configured as standalone. This means we need to + * move the lease to FTS_FREE to make it available. */ + if ((lease->binding_state == FTS_BACKUP) && + (lease->pool->failover_peer == NULL)) { +#else + /* We aren't compiled for failover, so just move to FTS_FREE */ + if (lease->binding_state == FTS_BACKUP) { +#endif + lease->binding_state = FTS_FREE; + lease->next_binding_state = FTS_FREE; + } +#endif /* Put the lease on the right queue. Failure to queue is probably * due to a bogus binding state. In such a case, we claim success, -- 2.47.3