bind9/lib/dns/zone_p.h
Alessio Podda 547c280002 Replace lock keyfile hashmap with lock pool
Kasp used a lock per zone origin in order to prevent concurrent access
to keyfiles. This lead to substantial memory consumption in the case of
authoritative servers with many small zones, as lots of locks need to be
allocated.

Since the number of keyfile locks taken cannot exceed the number of
helper threads, it makes more sense to use a lock pool of fixed size
keyed by the hash of the origin name, leading to memory savings.
2026-03-06 12:31:24 +01:00

221 lines
5 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#pragma once
#include <stdbool.h>
/*! \file */
/*%
* Types and functions below meant to be used for internal zone
* modules only, and associated unit tests.
*/
#define UDP_REQUEST_TIMEOUT 5 /*%< 5 seconds */
#define UDP_REQUEST_RETRIES 2
#define TCP_REQUEST_TIMEOUT \
(UDP_REQUEST_TIMEOUT * (UDP_REQUEST_RETRIES + 1) + 1)
typedef struct {
dns_diff_t *diff;
bool offline;
} dns__zonediff_t;
isc_result_t
dns__zone_updatesigs(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *version,
dst_key_t *zone_keys[], unsigned int nkeys,
dns_zone_t *zone, isc_stdtime_t inception,
isc_stdtime_t expire, isc_stdtime_t keyxpire,
isc_stdtime_t now, dns__zonediff_t *zonediff);
isc_result_t
dns__zone_lookup_nsec3param(dns_zone_t *zone, dns_rdata_nsec3param_t *lookup,
dns_rdata_nsec3param_t *param,
unsigned char saltbuf[255], bool resalt);
void
dns__zone_lock(dns_zone_t *zone);
/*%<
* Locks the zone.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
void
dns__zone_unlock(dns_zone_t *zone);
/*%<
* Unlocks the zone.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
bool
dns__zone_locked(dns_zone_t *zone);
/*%<
* Checks if the zone is locked.
*
* Requires:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li true if the zone is locked, false otherwise.
*/
bool
dns__zone_loaded(dns_zone_t *zone);
/*%<
* Checks if the zone is loaded.
*
* Requires:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li true if the zone is loaded, false otherwise.
*/
bool
dns__zone_exiting(dns_zone_t *zone);
/*%<
* Checks if the zone is exiting.
*
* Requires:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li true if the zone is exiting, false otherwise.
*/
void
dns__zone_stats_increment(dns_zone_t *zone, isc_statscounter_t counter);
/*%
* Increment resolver-related statistics counters
*
* Requires:
*\li 'zone' to be a valid zone, and locked.
*/
dns_notifyctx_t *
dns__zone_getnotifyctx(dns_zone_t *zone, dns_rdatatype_t type);
/*%<
* Returns the notify context.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns__zonemgr_getnotifyrl(dns_zonemgr_t *zmgr, isc_ratelimiter_t **prl);
/*%<
* Get the NOTIFY requests rate limiter
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
void
dns__zonemgr_getstartupnotifyrl(dns_zonemgr_t *zmgr, isc_ratelimiter_t **prl);
/*%<
* Get the startup NOTIFY requests rate limiter
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
void
dns__zonemgr_tlsctx_attach(dns_zonemgr_t *zmgr,
isc_tlsctx_cache_t **ptlsctx_cache);
/*%<
* Attach to TLS client context cache used for zone transfers via
* encrypted transports (e.g. XoT).
*
* The obtained reference needs to be detached by a call to
* 'isc_tlsctx_cache_detach()' when not needed anymore.
*
* Requires:
*\li 'zmgr' is a valid zone manager.
*\li 'ptlsctx_cache' is not 'NULL' and points to 'NULL'.
*/
void
dns__zone_getisself(dns_zone_t *zone, dns_isselffunc_t *isself, void **arg);
/*%<
* Returns the isself callback function and argument.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'isself' is not NULL.
*\li 'arg' is not NULL and '*arg' is NULL.
*/
void
dns__zone_iattach_locked(dns_zone_t *source, dns_zone_t **target);
/*%<
* Attach '*target' to 'source' incrementing its internal
* reference count. This is intended for use by operations
* such as zone transfers that need to prevent the zone
* object from being freed but not from shutting down.
*
* Require:
*\li The caller is running in the context of the zone's loop.
*\li 'zone' to be a valid zone, already locked.
*\li 'target' to be non NULL and '*target' to be NULL.
*/
void
dns__zone_idetach_locked(dns_zone_t **zonep);
/*%<
* Detach from a zone decrementing its internal reference count.
* If there are no more internal or external references to the
* zone, it will be freed.
*
* Require:
*\li The caller is running in the context of the zone's loop.
*\li 'zonep' to point to a valid zone, already locked.
*/
isc_refcount_t *
dns__zone_irefs(dns_zone_t *zone);
/*%<
* Get the reference count of a zone.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns__zone_free(dns_zone_t *zone);
/*
* Free a zone. Because we require that there be no more
* outstanding events or references, no locking is necessary.
*
* Requires:
* \li 'zone' to be a valid zone, unlocked.
*/
bool
dns__zone_free_check(dns_zone_t *zone);
void
dns__zone_keymgmt_initialize(void);
void
dns__zone_keymgmt_shutdown(void);
/*
* Check if a zone is ready to be freed.
*
* Requires:
* \li 'zone' to be a valid zone, locked.
*/