Edit cache eviction policy

Tony Finch dot at dotat.at
Mon Dec 30 20:07:20 UTC 2019


Itay Alayoff <itayala at post.bgu.ac.il> wrote:

> I'd like to know where is the policy eviction currently implemented?

The way I answer questions like this is to start from the configuration
options, and working my way from bin/named/server.c (where the parsed
config file is processed) I trace through to find the code that uses the
options of interest. Often with an option like `some-thing` I can find
most of the code by grepping for `some.?thing` but the spelling is not
always that consistent.

In this case, grepping for `cache.?size` I can see a line:

	dns_cache_setcachesize(cache, max_cache_size);

So (unsurprisingly!) the next place to look is in lib/dns/cache.c
where I find dns_cache_setcachesize() which sets up a callback function
called water() to implement the limits. In turn water() invokes
dns_db_overmem().

https://gitlab.isc.org/isc-projects/bind9/blob/master/lib/dns/cache.c#L880

There's an abstraction layer around BIND's in-memory database to support
alternative back ends (look around for dyndb and sdb to follow this
side-track) with a C OO interface that will feel familiar to kernel
hackers. But we want to skip to the relevant point which for db matters is
usually lib/dns/rbtdb.c, the red-black tree database. There are a bunch of
method vtbl definitions in this file; we're looking for the `overmem`
method. In fact, looking for `overmem` everywhere in the file should get
you a bit closer to enlightenment.

https://gitlab.isc.org/isc-projects/bind9/blob/master/lib/dns/rbtdb.c

The rbtdb.c overmem() method actually says,

	/* This is an empty callback.  See adb.c:water() */

The adb (address database) handles stuff like SRTT calculations and
lameness flags etc. Reading around mentions of `overmem` and `water`
in adb.c is again informative.

https://gitlab.isc.org/isc-projects/bind9/blob/master/lib/dns/adb.c#L2305

This comment appears to be the crux:

/*%
 * Examine the tail entry of the LRU list to see if it expires or is stale
 * (unused for some period); if so, the name entry will be freed.  If the ADB
 * is in the overmem condition, the tail and the next to tail entries
 * will be unconditionally removed (unless they have an outstanding fetch).
 * We don't care about a race on 'overmem' at the risk of causing some
 * collateral damage or a small delay in starting cleanup, so we don't bother
 * to lock ADB (if it's not locked).
 *
 * Name bucket must be locked; adb may be locked; no other locks held.
 */
static void
check_stale_name(dns_adb_t *adb, int bucket, isc_stdtime_t now) {


Now you know everything I know about BIND's cache eviction policy :-)

Tony.
-- 
f.anthony.n.finch  <dot at dotat.at>  http://dotat.at/
North Rockall, Malin: Northwesterly 4 or 5, backing southerly 5 to 7 later.
Rough. Fair. Good.



More information about the bind-users mailing list