Kea
1.9.9-git
|
All DHCP lease data is stored in some form of database, the interface to this being through the Lease Manager.
All backend classes such as isc::dhcp::MySqlLeaseMgr are derived from the abstract isc::dhcp::LeaseMgr class. This provides methods to create, retrieve, modify and delete leases in the database.
There are currently three available Lease Managers, Memfile, MySQL and PostgreSQL:
A lease manager is instantiated through the LeaseMgrFactory
class. This has three methods:
The selection of the Lease Manager (and thus the backend database) is controlled by the connection string passed to isc::dhcp::LeaseMgrFactory::create. This is a set of "keyword=value" pairs (no embedded spaces), each pair separated by a space from the others, e.g.
The following keywords are used for all backends:
The following sections list the database-specific keywords:
For details, see isc::db::MySqlConnection::openDatabase().
For details, see isc::db::PgSqlConnection::openDatabase().
For details, see isc::db::CqlConnection::openDatabase().
The isc::dhcp::Lease
class uses cltt (client last transmission time) and valid lifetime, backend lease uses expire and valid lifetime. These quantities are bound by the equation:
But when expire is a 32 bit date and valid lifetime is the infinity special value (0xffffffff) this overflows so for MySQL and PostgreSQL backends this becomes:
Host backends (known also as host data sources) are similar to lease backends with a few differences:
Some of these considerations apply to lease backends too but only the host caching was analyzed and implemented.
Caching divides into two parts, positive and negative caching, and its support is implemented at two places, a cache backend and inside the host manager, i.e. the entity calling backends in sequence providing the result of lookups to allocation engines.
The idea of positive caching is simple: when a value not in the cache in returned by a database, this value is added to the cache so the next time it will be available without calling and waiting for the database.
This cannot be extended to lookups returning a collection because they are supposed to collect and append results from all backends. If you replace append by merge you avoid duplicate items in the result but still get no benefit from caching. So in general a cache backend should simply return nothing for these lookups.
Add (or any operation which can fail) has to wait that all backends are called and possibly one fails before the new entry being cached. Del is simpler: the cache backend processes it but always returns false so the backend holding it if any is called.
Negative caching consists into adding fake entries indicating that a particular host does not exists. As no host constructor allows a host object without an identifier or with an empty identifier, negative caching applies only to by identifier lookups. This is no a problem because out-of-pools provides a clearer and simpler to implement performance benefit than by address negative caching. Note that by identifier negative caching can be critical for performance because the non-existence is the worst case for lookups.
Negative cache entries should be easily identified (current implementation uses the negative_ flag member in host
class) so all lookups returning at most one entry can (in fact have to) return a null pointer when they get a negative cache entry. Note this is for all such lookups, not only by identifier lookups, to allow to negative cached entries with any value, for instance with a IP address.
There is no direct and simple way to support negative caching for collection lookups so again cache backends should return nothing for these lookups which have not to filter out negative cached entries from result.
Negative caching can be performed by the host manager: when a by identifier lookup returns a null pointer, a fake entry with lookup parameters and the negative cache mark is inserted into the cache. Note this leads to negative cache entries without IP reservations, this property should not be used because it limits negative cache addition to only be performed by the host manager.
Lease and host database backends including the memfile for leases are Kea thread safe (i.e. are thread safe when the multi-threading mode is true). This extends to legal / forensic log backends but not to config backends which is used only for configuration by the main thread with packet processing threads stopped so has no thread safety requirements.
There are exceptions:
Note for statistics queries it does not make sense to call them with running packet processing threads so they have no thread safety guarantees.
Note too that the memfile backend is not inter-process safe so must be kept private to the Kea server using it.