From 0b02bf5fe9dc02378d719b491984b72b12cac6a4 Mon Sep 17 00:00:00 2001 From: Marek Vavrusa <marek@vavrusa.com> Date: Sun, 17 Apr 2016 17:29:41 -0700 Subject: [PATCH] engine: throttle outbound queries only when busy resolver will always attempt to contact upstreams known to be bad if it's not busy. this fixes a problem on low-volume resolvers where a short connection outage could make resolvers deny resolving queries even after the connection is restored --- daemon/engine.h | 3 +++ daemon/worker.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/daemon/engine.h b/daemon/engine.h index 5e8e12e95..7c9379939 100644 --- a/daemon/engine.h +++ b/daemon/engine.h @@ -29,6 +29,9 @@ #ifndef RECVMMSG_BATCH #define RECVMMSG_BATCH 4 #endif +#ifndef QUERY_RATE_THRESHOLD +#define QUERY_RATE_THRESHOLD (2 * MP_FREELIST_SIZE) /**< Nr of parallel queries considered as high rate */ +#endif /* * @internal These are forward decls to allow building modules with engine but without Lua. diff --git a/daemon/worker.c b/daemon/worker.c index 736338d56..5bdd7c2a6 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -287,6 +287,10 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha kr_resolve_begin(&task->req, &engine->resolver, answer); worker->stats.concurrent += 1; worker->stats.queries += 1; + /* Throttle outbound queries only when high pressure */ + if (worker->stats.concurrent < QUERY_RATE_THRESHOLD) { + task->req.options |= QUERY_NO_THROTTLE; + } return task; } -- GitLab