mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Move offloaded DNSSEC operations to different helper threads
Currently, the isc_work API is overloaded. It runs both the CPU-intensive operations like DNSSEC validations and long-term tasks like RPZ processing, CATZ processing, zone file loading/dumping and few others. Under specific circumstances, when many large zones are being loaded, or RPZ zones processed, this stops the CPU-intensive tasks and the DNSSEC validation is practically stopped until the long-running tasks are finished. As this is undesireable, this commit moves the CPU-intensive operations from the isc_work API to the isc_helper API that only runs fast memory cleanups now.
This commit is contained in:
@@ -21,9 +21,11 @@
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <isc/async.h>
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/hash.h>
|
||||
#include <isc/hashmap.h>
|
||||
#include <isc/helper.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/result.h>
|
||||
@@ -186,6 +188,7 @@ msgblock_allocate(isc_mem_t *, unsigned int, unsigned int);
|
||||
* asynchronously.
|
||||
*/
|
||||
typedef struct checksig_ctx {
|
||||
isc_loop_t *loop;
|
||||
dns_message_t *msg;
|
||||
dns_view_t *view;
|
||||
dns_message_cb_t cb;
|
||||
@@ -3218,21 +3221,27 @@ dns_message_dumpsig(dns_message_t *msg, char *txt1) {
|
||||
}
|
||||
#endif /* ifdef SKAN_MSG_DEBUG */
|
||||
|
||||
static void
|
||||
checksig_done(void *arg);
|
||||
|
||||
static void
|
||||
checksig_run(void *arg) {
|
||||
checksig_ctx_t *chsigctx = arg;
|
||||
|
||||
chsigctx->result = dns_message_checksig(chsigctx->msg, chsigctx->view);
|
||||
|
||||
isc_async_run(chsigctx->loop, checksig_done, chsigctx);
|
||||
}
|
||||
|
||||
static void
|
||||
checksig_cb(void *arg) {
|
||||
checksig_done(void *arg) {
|
||||
checksig_ctx_t *chsigctx = arg;
|
||||
dns_message_t *msg = chsigctx->msg;
|
||||
|
||||
chsigctx->cb(chsigctx->cbarg, chsigctx->result);
|
||||
|
||||
dns_view_detach(&chsigctx->view);
|
||||
isc_loop_detach(&chsigctx->loop);
|
||||
isc_mem_put(msg->mctx, chsigctx, sizeof(*chsigctx));
|
||||
dns_message_detach(&msg);
|
||||
}
|
||||
@@ -3250,12 +3259,13 @@ dns_message_checksig_async(dns_message_t *msg, dns_view_t *view,
|
||||
.cb = cb,
|
||||
.cbarg = cbarg,
|
||||
.result = ISC_R_UNSET,
|
||||
.loop = isc_loop_ref(loop),
|
||||
};
|
||||
dns_message_attach(msg, &chsigctx->msg);
|
||||
dns_view_attach(view, &chsigctx->view);
|
||||
|
||||
dns_message_clonebuffer(msg);
|
||||
isc_work_enqueue(loop, checksig_run, checksig_cb, chsigctx);
|
||||
isc_helper_run(loop, checksig_run, chsigctx);
|
||||
|
||||
return (DNS_R_WAIT);
|
||||
}
|
||||
|
Reference in New Issue
Block a user