summaryrefslogtreecommitdiffstats
path: root/utils/cache_gc/kr_cache_gc.h
blob: c64e99e9954d1e5e31ea41fe1a07acba9efb9425 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* SPDX-License-Identifier: GPL-3.0-or-later */
#pragma once

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

typedef struct {
	size_t entry_size;	// amount of bytes occupied in cache by this record
	bool valid;		// fields further down are valid (ignore them if false)
	int64_t expires_in;	// < 0 => already expired
	uint16_t rrtype;
	uint8_t no_labels;	// 0 == ., 1 == root zone member, 2 == TLD member ...
	uint8_t rank;
} gc_record_info_t;

typedef struct {
	const char *cache_path;	// path to the LMDB with resolver cache
	unsigned long gc_interval;	// waiting time between two whole garbage collections in usecs (0 = just one-time cleanup)

	size_t temp_keys_space;	// maximum amount of temporary memory for copied keys in bytes (0 = unlimited)

	size_t rw_txn_items;	// maximum number of deleted records per RW transaction (0 = unlimited)
	size_t ro_txn_items;	// maximum number of iterated records (RO transactions, 0 = unlimited)
	unsigned long rw_txn_duration;	// maximum duration of RW transaction in usecs (0 = unlimited)
	unsigned long rw_txn_delay;	// waiting time between two RW transactions in usecs

	uint8_t cache_max_usage;	// maximum cache usage before triggering GC (percent)
	uint8_t cache_to_be_freed;	// percent of current cache usage to be freed during GC

	bool dry_run;
} kr_cache_gc_cfg_t;

/** State persisting across kr_cache_gc() invocations (opaque).
 * NULL pointer represents a clean state. */
typedef struct kr_cache_gc_state kr_cache_gc_state_t;

/** Do one iteration of cache-size check and (if necessary) GC pass. */
int kr_cache_gc(kr_cache_gc_cfg_t *cfg, kr_cache_gc_state_t **state);
void kr_cache_gc_free_state(kr_cache_gc_state_t **state);