diff --git a/doc/Makefile.am b/doc/Makefile.am index 115e492dfa..5e31b591de 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -12,12 +12,14 @@ nobase_dist_doc_DATA = examples/kea4/single-subnet.json nobase_dist_doc_DATA += examples/kea4/several-subnets.json nobase_dist_doc_DATA += examples/kea4/multiple-options.json nobase_dist_doc_DATA += examples/kea4/reservations.json +nobase_dist_doc_DATA += examples/kea4/leases-expiration.json nobase_dist_doc_DATA += examples/kea6/simple.json nobase_dist_doc_DATA += examples/kea6/several-subnets.json nobase_dist_doc_DATA += examples/kea6/multiple-options.json nobase_dist_doc_DATA += examples/kea6/advanced.json nobase_dist_doc_DATA += examples/kea6/stateless.json nobase_dist_doc_DATA += examples/kea6/reservations.json +nobase_dist_doc_DATA += examples/kea6/leases-expiration.json nobase_dist_doc_DATA += examples/ddns/sample1.json nobase_dist_doc_DATA += examples/ddns/template.json diff --git a/doc/devel/mainpage.dox b/doc/devel/mainpage.dox index 9204a327cf..df2cf4d028 100644 --- a/doc/devel/mainpage.dox +++ b/doc/devel/mainpage.dox @@ -100,6 +100,8 @@ * - @subpage hostmgr * - @subpage optionsConfig * - @subpage allocengine + * - @subpage timerManager + * - @subpage leaseReclamationRoutine * - @subpage libdhcp_ddns * - @subpage dhcpDatabaseBackends * - @subpage configBackend diff --git a/doc/examples/kea4/leases-expiration.json b/doc/examples/kea4/leases-expiration.json new file mode 100644 index 0000000000..b1397b3d18 --- /dev/null +++ b/doc/examples/kea4/leases-expiration.json @@ -0,0 +1,71 @@ +# This is an example configuration file for the DHCPv4 server in Kea. +# It provides parameters controlling processing of expired leases, +# a.k.a. leases reclamation. + +{ "Dhcp4": + +{ +# Kea is told to listen on ethX interface only. + "interfaces-config": { + "interfaces": [ "ethX" ] + }, + +# We need to specify lease type. As of May 2014, three backends are supported: +# memfile, mysql and pgsql. We'll just use memfile, because it doesn't require +# any prior set up. + "lease-database": { + "type": "memfile" + }, + +# The following parameters control processing expired leases. Expired leases +# will be reclaimed periodically according to the "reclaim-timer-wait-time" +# parameter. Reclaimed leases will be held in the database for 1800s to +# facilitate lease affinity. After this period the leases will be removed. +# The frequency of removal is controlled by the "flush-reclaimed-timer-wait-time" +# parameter. The lease reclamation routine will process at most 500 leases +# or will last for at most 100ms, during a single run. If there are still +# some unreclaimed leases after 10 attempts, a warning message is issued. + "expired-leases-processing": { + "reclaim-timer-wait-time": 5, + "hold-reclaimed-time": 1800, + "flush-reclaimed-timer-wait-time": 10, + "max-reclaim-leases": 500, + "max-reclaim-time": 100, + "unwarned-reclaim-cycles": 10 + }, + +# Addresses will be assigned with valid lifetimes being 4000. Client +# is told to start renewing after 1000 seconds. If the server does not respond +# after 2000 seconds since the lease was granted, client is supposed +# to start REBIND procedure (emergency renewal that allows switching +# to a different server). + "valid-lifetime": 4000, + +# The following list defines subnets. We have only one subnet +# here. We tell Kea that it is directly available over local interface. + "subnet4": [ + { + "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ], + "subnet": "192.0.2.0/24", + "interface": "ethX" + } + ] +}, + +# The following configures logging. It assumes that messages with at least +# informational level (info, warn, error) will will be logged to stdout. +"Logging": { + "loggers": [ + { + "name": "kea-dhcp4", + "output_options": [ + { + "output": "stdout" + } + ], + "severity": "INFO" + } + ] +} + +} diff --git a/doc/examples/kea6/leases-expiration.json b/doc/examples/kea6/leases-expiration.json new file mode 100644 index 0000000000..59fea3022b --- /dev/null +++ b/doc/examples/kea6/leases-expiration.json @@ -0,0 +1,77 @@ +# This is an example configuration file for DHCPv6 server in Kea. +# It provides parameters controlling processing of expired leases, +# a.k.a. leases reclamation. + +{ "Dhcp6": + +{ +# Kea is told to listen on ethX interface only. + "interfaces-config": { + "interfaces": [ "ethX" ] + }, + +# We need to specify lease type. As of May 2014, three backends are supported: +# memfile, mysql and pgsql. We'll just use memfile, because it doesn't require +# any prior set up. + "lease-database": { + "type": "memfile" + }, + +# The following parameters control processing expired leases. Expired leases +# will be reclaimed periodically according to the "reclaim-timer-wait-time" +# parameter. Reclaimed leases will be held in the database for 1800s to +# facilitate lease affinity. After this period the leases will be removed. +# The frequency of removal is controlled by the "flush-reclaimed-timer-wait-time" +# parameter. The lease reclamation routine will process at most 500 leases +# or will last for at most 100ms, during a single run. If there are still +# some unreclaimed leases after 10 attempts, a warning message is issued. + "expired-leases-processing": { + "reclaim-timer-wait-time": 5, + "hold-reclaimed-time": 1800, + "flush-reclaimed-timer-wait-time": 10, + "max-reclaim-leases": 500, + "max-reclaim-time": 100, + "unwarned-reclaim-cycles": 10 + }, + +# Addresses will be assigned with preferred and valid lifetimes +# being 3000 and 4000, respectively. Client is told to start +# renewing after 1000 seconds. If the server does not respond +# after 2000 seconds since the lease was granted, client is supposed +# to start REBIND procedure (emergency renewal that allows switching +# to a different server). + "preferred-lifetime": 3000, + "valid-lifetime": 4000, + "renew-timer": 1000, + "rebind-timer": 2000, + +# The following list defines subnets. Each subnet consists of at +# least subnet and pool entries. + "subnet6": [ + { + "pools": [ { "pool": "2001:db8:1::/80" } ], + "subnet": "2001:db8:1::/64", + "interface": "ethX" + } + ] +}, + +# The following configures logging. Kea will log all debug messages +# to /var/log/kea-debug.log file. +"Logging": { + "loggers": [ + { + "name": "kea-dhcp6", + "output_options": [ + { + "output": "/var/log/kea-debug.log" + } + ], + "debuglevel": 99, + "severity": "DEBUG" + } + ] +} + +} + diff --git a/doc/guide/Makefile.am b/doc/guide/Makefile.am index d1eef989da..e7c18ab9c6 100644 --- a/doc/guide/Makefile.am +++ b/doc/guide/Makefile.am @@ -6,8 +6,8 @@ dist_doc_DATA = $(DOCS) dist_html_DATA = $(HTMLDOCS) kea-guide.css DOCBOOK = kea-guide.xml intro.xml quickstart.xml install.xml admin.xml config.xml -DOCBOOK += keactrl.xml dhcp4-srv.xml dhcp6-srv.xml logging.xml ddns.xml hooks.xml -DOCBOOK += libdhcp.xml lfc.xml stats.xml ctrl-channel.xml faq.xml +DOCBOOK += keactrl.xml dhcp4-srv.xml dhcp6-srv.xml lease-expiration.xml logging.xml +DOCBOOK += ddns.xml hooks.xml libdhcp.xml lfc.xml stats.xml ctrl-channel.xml faq.xml EXTRA_DIST = $(DOCBOOK) DISTCLEANFILES = $(HTMLDOCS) $(DOCS) kea-messages.xml diff --git a/doc/guide/ctrl-channel.xml b/doc/guide/ctrl-channel.xml index eaba538005..a1bb04b45a 100644 --- a/doc/guide/ctrl-channel.xml +++ b/doc/guide/ctrl-channel.xml @@ -112,6 +112,33 @@ configuration file.
Commands supported by both DHCPv4 and DHCPv6 servers +
+ leases-reclaim command + + leases-reclaim command instructs the server to + reclaim all expired leases immediately. The command has the following + JSON syntax: + +{ + "command": "leases-reclaim", + "arguments": { + "remove": true + } +} + + + + The remove boolean parameter is mandatory + and it indicates whether the reclaimed leases should be removed from + the lease database (if true), or they should be left in the + expired-reclaimed state (if false). The latter + facilitates lease affinity, i.e. ability to re-assign expired lease to + the same client which used this lease before. See + for the details. Also, see + for the general information + about the processing of expired leases (leases reclamation). +
+
list-commands command diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index b5b9964cf6..07b0123fdf 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2968,11 +2968,10 @@ It is merely echoed by the server given subnet. This statistic increases every time a new lease is allocated (as a result of receiving a DHCPREQUEST message) and is decreased every time a lease is released (a DHCPRELEASE message is - received). When lease expiration is implemented (planned for Kea - 1.0), it will also decrease when a lease is expired. The - id is the subnet-id of a given subnet. This - statistic is exposed for each subnet separately. This statistic is - reset during reconfiguration event. + received) or expires. The id is the subnet-id + of a given subnet. This statistic is exposed for each subnet + separately. This statistic is reset during reconfiguration event. + @@ -3116,14 +3115,6 @@ It is merely echoed by the server Address duplication report (DECLINE) is not supported yet. - - - The server doesn't act upon expired leases. In particular, - when a lease expires, the server doesn't request the removal - of the DNS records associated with it. Expired leases can be - recycled. - -
diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index d0bb786042..9e10e671d5 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -2921,11 +2921,10 @@ should include options from the isc option space: This statistic shows the number of NA addresses in a given subnet that are assigned. This statistic increases every time a new lease is allocated (as a result of receiving a REQUEST message) and is decreased every time a - lease is released (a RELEASE message is received). When lease expiration - is implemented (planned for Kea 1.0), it will also decrease when a lease - is expired. The id is the subnet-id of a given - subnet. This statistic is exposed for each subnet separately. This - statistic is reset during a reconfiguration event. + lease is released (a RELEASE message is received) or expires. The + id is the subnet-id of a given subnet. This + statistic is exposed for each subnet separately. This statistic is + reset during a reconfiguration event. @@ -2951,11 +2950,10 @@ should include options from the isc option space: This statistic shows the number of PD prefixes in a given subnet that are assigned. This statistic increases every time a new lease is allocated (as a result of receiving a REQUEST message) and is decreased every time a - lease is released (a RELEASE message is received). When lease expiration - is implemented (planned for Kea 1.0), it will also decrease when a lease - is expired. The id is the subnet-id of a given - subnet. This statistic is exposed for each subnet separately. This - statistic is reset during a reconfiguration event. + lease is released (a RELEASE message is received) or expires. The + id is the subnet-id of a given subnet. This statistic + is exposed for each subnet separately. This statistic is reset during a + reconfiguration event. @@ -3117,14 +3115,6 @@ should include options from the isc option space: not yet supported. - - - - The server doesn't act upon expired leases. In particular, - when a lease expires, the server doesn't request removal of - the DNS records associated with it. - -
diff --git a/doc/guide/kea-guide.xml b/doc/guide/kea-guide.xml index dbf0694ced..dcccacc5d1 100644 --- a/doc/guide/kea-guide.xml +++ b/doc/guide/kea-guide.xml @@ -67,6 +67,8 @@ + + diff --git a/doc/guide/lease-expiration.xml b/doc/guide/lease-expiration.xml new file mode 100644 index 0000000000..5b2c2c3737 --- /dev/null +++ b/doc/guide/lease-expiration.xml @@ -0,0 +1,341 @@ + + +]> + + Lease Expiration in DHCPv4 and DHCPv6 + + The primary role of the DHCP server is to assign addresses and/or + delegate prefixes to DHCP clients. These addresses and prefixes are + often referred to as 'leases'. Leases are typically assigned to clients + for a finite amount of time, known as 'valid lifetime'. DHCP clients who + wish to continue using their assigned leases, will periodically renew them + by sending the appropriate message to the DHCP server. The DHCP server records + the time when these leases are renewed and calculates new expiration times + for them. + + + If the client does not renew a lease before its valid lifetime + elapses, the lease is considered expired. There are many situations + when the client may cease lease renewals. A common scenario is when + the machine running the client shuts down for an extended period of + time. + + The process through which the DHCP server makes expired leases + available for reassignment is referred to as "lease reclamation" and expired + leases returned to availability through this process are referred to as + "reclaimed". + + The DHCP server should reclaim an expired lease as soon as it detects + that it has expired. One way in which the server may detect expiration + is when it is trying to allocate a lease to a client and finds this + lease already present in the database but expired. Another way the + server detects expired leases is by periodically querying the lease + database for them. Regardless of how an expired lease is detected, before + it my assigned to a client, it must be reclaimed. + + This chapter explains how to configure the server to periodically query + for the expired leases and how to minimize the impact of the periodic leases + reclamation process on the server's responsiveness. Finally, 'lease affinity', + which provides the means to assign the same lease to the returning client + after its lease has expired, is explained. + + + Although, all configuration examples in this section are provided + for the DHCPv4 server, the same parameters may be used for the + DHCPv6 server configuration. + + +
+ Lease Reclamation + Lease reclamation is the process through which an expired lease + becomes available for assignment to the same or a different client. + This process involves the following steps for each reclaimed lease: + + + + + Invoke callouts for the lease4_expire or + lease6_expire hook points, if hook libraries + supporting those callouts are currently loaded. + + + Update DNS, i.e. remove any DNS entries associated with + the expired lease. + + + Update lease information in the lease database to + indicate that the lease is now available for re-assignment. + + + Update statistics of the server, which includes + increasing the number of reclaimed leases and decreasing the + number of assigned addresses or delegated prefixes etc. + + + + Please refer to to see + how to configure DNS updates in Kea, and to + for information about using + hooks libraries. +
+ +
+ Configuring Leases Reclamation + Kea can be configured to periodically detect and reclaim expired + leases. During this process the lease entries in the database are + modified or removed. Therefore the server will not process incoming DHCP + messages to avoid issues with concurrent access to database information. + As a result, the server will be unresponsive while lease reclamation + is performed. DHCP queries will accumulate and responses will be + sent once the leases reclamation cycle is complete. + + In deployments where response time is critical, administrators may + wish to minimize the interruptions in service caused by lease reclamation. + Toward this end, Kea provides configuration parameters to control: the + frequency of lease reclamation cycles, the maximum number of leases + processed in a single reclamation cycle, and the maximum amount of time a + single reclamation cycle is allowed to run before being interrupted. The + following examples demonstrate how these parameters can be used: + + +"Dhcp4": { + ... + + "expired-leases-processing": { + "reclaim-timer-wait-time": 5, + "max-reclaim-leases": 0, + "max-reclaim-time": 0, + "flush-reclaimed-timer-wait-time": 0, + }, + + ... +} + + + + The first parameter is expressed in seconds and specifies an + interval between the two consecutive lease reclamation cycles. This + is explained on the following diagram. + + + +| c1 | | c2 | |c3| | c4 | +|<---->|<---------->|<-->|<---------->|<>|<---------->|<-->| +----------------------------------------------------------------> +| | 5s | | 5s | | 5s | | time + + + + + This diagram shows 4 leases reclamation cycles of variable duration. + Note that the duration of the reclamation cycle depends on the number + of expired leases detected and processed in the particular cycle. This + duration is also usually significantly shorter than the interval between + the cycles. + + + According to the reclamim-timer-wait-time the + server keeps fixed intervals of 5 seconds between the end of one cycle + and the start of the next cycle. This guarantees the presence of + 5s long periods during which the server remains responsive to DHCP + queries and does not perform leases reclamation. The + max-reclaim-leases and + max-reclaim-time are set to 0, which implies that + there is no restriction on the maximum number of leases reclaimed + in the particular cycle, or the maximum duration of each cycle. + + + In deployments with high lease pool utilization, relatively + short valid lifetimes, and frequently disconnecting clients which + allow leases to expire; the number of expired leases requiring reclamation + at any given time may rise significantly. In this case it is often + desirable to apply restrictions on the maximum duration of a reclamation + cycle or the maximum number of leases reclaimed in a cycle. The following + configuration demonstrates how this can be done: + + +"Dhcp4": { + ... + + "expired-leases-processing": { + "reclaim-timer-wait-time": 3, + "max-reclaim-leases": 100, + "max-reclaim-time": 50, + "unwarned-reclaim-cycles": 10, + "flush-reclaimed-timer-wait-time": 0, + }, + + ... +} + + + + + + The max-reclaim-leases parameter limits the number + of leases reclaimed in a single cycle to 100. The + max-reclaim-time limits the maximum duration of each + cycle to 50ms. The lease reclamation cycle will be interrupted if either + of these limitations is reached. The reclamation of all unreclaimed + leases will be attempted in subsequent cycles. + + The following diagram illustrates the behavior of the system in the + presence of many expired leases, when the limits are applied for the + reclamation cycles. + + + +| c1 | | c2 | | c3 | | c4 | +|<-->|<-------------->|<-->|<-------------->|<-->|<-------------->|<-->|<-- +------------------------------------------------------------------------------> +|50ms| 3s |50ms| 3s |50ms| 3s |50ms| time + + + + + + The diagram demonstrates the case when each reclamation cycle would take + more than 50ms, and thus is interrupted according to the value of the + max-reclaim-time. This results in equal durations of + all reclamation cycles over time. Note that in this example the limitation + of maximum 100 leases is not reached. This may be the case when database + transactions are slow or callouts in the hook libraries attached to + the server are slow. Regardless, the choosing values for either the + maximum number of leases or a maximum cycle time strongly depends on the + particular deployment, lease database backend being used, and any hooks + libraries etc. Administrators may need to experiment to tune the system + to suit the dynamics of their deployment. + + It is important to realize that with the use of these limits, there + is a risk that expired leases will accumulate faster than the server can + reclaim them. This should not be the problem if the server is dealing + with a temporary burst of expirations, because it should be able to + eventually deal with them over time. However, if leases expire at the high + rate for a longer period of time, the unreclaimed leases will pile up in + the database. In order to notify the administrator that the current + configuration does not satisfy the needs for reclamation of expired + leases, the server issues a warning message in the log, if it was unable + to reclaim all leases within the last couple of reclamation cycles. The + number of cycles after which such warning is issued is specified with the + unwarned-reclaim-cycles configuration parameter. + + + Setting the reclaim-timer-wait-time to 0 disables + periodic reclamation of the expired leases. +
+ +
+ Configuring Lease Affinity + Suppose that a laptop goes to a sleep mode after a period of user + inactivity. While the laptop is in sleep mode, its DHCP client will not + renew leases obtained from the server and these leases will eventually + expire. When the laptop wakes up, it is often desired that it continue + using its previous assigned IP addresses. In order to facilitate this, + the server needs to correlate returning clients with their expired leases + When the client returns, the server will first check for those leases and + re-assign them if they have not assigned to another client. The ability + of the server to re-assign the same lease to a returning client is + referred to as 'lease affinity'. + + + When lease affinity is enabled, the server will still + reclaim leases according to the parameters described in + , but the reclaimed leases + will be held in the database (rather than removed) for the specified + amount of time. When the client returns, the server will first check + if there are any reclaimed leases associated with this client and + re-assign them if possible. However, it is important to note that + any reclaimed lease may be assigned to another client if that client + specifically asks for it. Therefore, the lease affinity does not + guarantee that the reclaimed lease will be available for the client + who used it before. It merely increases the chances for the client to + be assigned the same lease. If the lease pool is small (mostly applies + to DHCPv4 for which address space is small), there is an increased + likelihood that the expired lease will be hijacked by another client. + + + Consider the following configuration: + + +"Dhcp4": { + ... + + "expired-leases-processing": { + "reclaim-timer-wait-time": 3, + "hold-reclaimed-time": 1800, + "flush-reclaimed-timer-wait-time": 5 + }, + + ... +} + + + + + The hold-reclaim-time specifies how many seconds + after an expiration a reclaimed lease should be held in the database + for re-assignment to the same client. In the example given above, + reclaimed leases will be held for 30 minutes (1800s) after their + expiration. During this time, the server will likely be able to + re-assign the same lease to the returning client, unless another client + requests this lease and the server assigns it. + + The server must periodically remove reclaimed leases for which the + time indicated by hold-reclaim-time has elapsed. The + flush-reclaimed-timer-wait-time controls how + often the server removes such leases. In the example provided + above, the server will initiate removal of such leases 5 seconds after + the previous removal attempt was completed. Setting this value to 0 + disables lease affinity, in which case leases will be removed from the + lease database when they are reclaimed. If lease affinity is enabled, it + is recommended that hold-reclaim-time be set to a value significantly + higher than the reclaim-timer-wait-time, as timely + removal of expired-reclaimed leases is less critical while the removal + process may impact server responsiveness. +
+ +
+ Default Configuration Values for Leases Reclamation + The following list presents all configuration parameters + pertaining to processing expired leases with their default values: + + + + reclaim-timer-wait-time = 10 [seconds] + + + flush-reclaimed-timer-wait-time = 25 [seconds] + + + hold-reclaimed-time = 3600 [seconds] + + + max-reclaim-leases = 100 + + + max-reclaim-time = 250 [milliseconds] + + + unwarned-reclaim-cycles = 5 + + + + The default value for any parameter is used when this parameter not + explicitly specified in the configuration. Also, the + expired-leases-processing map may be omitted entirely + in the configuration, in which case the default values are used for all + parameters listed above. + +
+ +
+ Reclaiming Expired Leases with Command + The leases-reclaim command can be used to trigger + leases reclamation at any time. Please consult the + for the details about using this + command. +
+ +
diff --git a/src/bin/dhcp4/tests/configs-list.txt b/src/bin/dhcp4/tests/configs-list.txt index f7e5587bd0..0ba5616669 100644 --- a/src/bin/dhcp4/tests/configs-list.txt +++ b/src/bin/dhcp4/tests/configs-list.txt @@ -3,3 +3,4 @@ ../../../../doc/examples/kea4/single-subnet.json ../../../../doc/examples/kea4/several-subnets.json +../../../../doc/examples/kea4/leases-expiration.json diff --git a/src/lib/dhcpsrv/libdhcpsrv.dox b/src/lib/dhcpsrv/libdhcpsrv.dox index 7c800e49ef..97024fd27a 100644 --- a/src/lib/dhcpsrv/libdhcpsrv.dox +++ b/src/lib/dhcpsrv/libdhcpsrv.dox @@ -258,4 +258,120 @@ was made. The client will be offered/allocated a reserved address the next time it retries sending a DHCPDISCOVER/DHCPREQUEST message to the server. +@section timerManager Timer Manager + +The fundamental role of the DHCP server is to receive and process DHCP +messages received over the sockets opened on network interfaces. The +servers' include the main loops in which the servers passively wait +for the messages. This is done by calling the +@c isc::dhcp::IfaceMgr::receive4 and/or @c isc::dhcp::IfaceMgr::receive6 +methods for DHCPv4 and DHCPv6 server respectively. Internally, these +methods call @c select() on open sockets, which blocks for a +specified amount of time. + +The implication of using the @c select() is that the server has no +means to process any "events" while it is waiting for the @c select() +to return. An example of such an event is the expiration of the timer +which controls when the server should detect and process expired +leases. + +The @c isc::dhcp::TimerMgr has been created to address the issue of +processing expired leases according to the the dedicated timer. +Nevertheless, this concept is univeral and should be used for +all timers which need to be triggered asynchronously, i.e. independently +from processing the DHCP messages. + +The @c TimerMgr allows for registering timers and associating them with +user callback functions, which are executed without waiting for the +call to the @c select() function to return as a result of the timeout. +When the particular timer elapses, the blocking call to select is +interrupted by sending data over a dedicated (for a timer) +@c isc::util::WatchSocket. Each timer has an instance of +@c isc::util::WatchSocket associated with it, and each such socket +is registered with the @c IfaceMgr using the @c IfaceMgr::addExternalSocket. +When the transmission of the data over the watch socket interrupts the +@c select() call, the user callback is executed by +@c isc::dhcp::IfaceMgr and the watch socket is cleared to accept +subsequent events for that particular timer. + +The timers are implemented using the @c isc::asiolink::IntervalTimer class. +They are run in a dedicated thread which is owned (created and destroyed) +by @c isc::dhcp::TimerMgr. This worker thread runs an instance +of @c isc::asiolink::IOService object which is associated with all +registered timers. The thread uses a common callback function which +is executed when a timer elapses. This callback function receives +a name of the elapsed timer as an argument and, based on that, selects the +appropriate @c isc::util::WatchSocket to be marked as ready. In order to +overcome the race conditions with the main thread, the worker thread blocks +right after it marks the watch socket as ready, and waits for this +socket to be cleared by the main thread. This is the indication +that the timer specific callback function has been invoked and the +worker thread may continue monitoring registered timers and signal +their readiness when they elapse. + +@section leaseReclamationRoutine Leases Reclamation Routine + +Lease reclamation is the process in which the expired lease becomes +available for re-assignment to the same or another client. When the +server reclaims the lease it executes the callouts registered for the +"lease4_expire" and "lease6_expire" hook points, performs the DNS update +to remove any DNS records associated with the expired lease, and finally +marks a lease as reclaimed in the lease database. The lease may be +marked as reclaimed by setting its state to @c Lease::STATE_EXPIRED_RECLAIMED +or by being removed from the database. + +Reclamation is performed periodically for a bulk of expired +leases in the lease reclamation routine. The lease reclamation routines +for both DHCP servers are implemented in the @c isc::dhcp::AllocEngine: +- @c isc::dhcp::AllocEngine::reclaimExpiredLeases4 (DHCPv4) +- @c isc::dhcp::AllocEngine::reclaimExpiredLeases6 (DHCPv6) + +Note that besides the reclamation of the leases, these methods also +update the relevant statistics, i.e. decrease the number of assigned +leases and increase the number of reclaimed leases. + +The reclamation routines are executed periodically according to +the server configuration (see the documentation for the +"expired-leases-processing" configuration map). Internally, they are +registered as callback functions in the @c isc::dhcp::TimerMgr +(see @ref timerManager for the details), during the servers' startup +or reconfiguration. + +Execution of the reclamation routine may take a relatively +long period of time. It depends on the complexity of the callouts, +whether the DNS update is required for leases, and the type of the +lease database used. While the reclamation routine is +executed, the server will not process any DHCP messages to avoid +race conditions being a result of concurrent access to the lease +database to allocate and reclaim leases. To make sure that the +server remains responsive, it is possible to limit the number of +leases being processed by the leases reclamation routine and/or +limit the time for the reclamation routine to process +leases. Both limits are specified in the respective arguments +passed to the lease reclamation routines. + +As mentioned above, reclaimed leases may be marked as such, by +updating their state to @c Lease::STATE_EXPIRED_RECLAIMED or by +being removed. This behavior is controlled by the boolean parameter +passed to the reclamation routine. The first approach is desired +when the server should provide "lease affinity", i.e. ability to +re-assign the same lease to the returning client. By only +updating the lease state, the server preserves association of the +lease with a particular client. When that client returns the +server may assign the same lease to the client, assuming that this +lease is still available. The lease is removed during the +reclamation when the lease affinity is not required and it is +preferred to not keep redundant information (about expired +leases) in the lease database. + +If the reclaimed leases are not removed, they are held in the +database for a specified amount of time after their expiration. +Each reclaimed lease is removed when this time elapses for it. +The @c isc::dhcp::LeaseMgr::deleteExpiredReclaimedLeases4 and +@c isc::dhcp::LeaseMgr::deleteExpiredReclaimedLeases6 are used +to remove those leases for which the specified amount of time +since expiration elapsed. These methods are executed periodically +by the DHCP servers using the dedicated timers registered in the +@c isc::dhcp::TimerMgr. + */