From: Marek Vavrusa Date: Mon, 18 Apr 2016 00:29:41 +0000 (-0700) Subject: engine: throttle outbound queries only when busy X-Git-Tag: v1.0.0~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b02bf5fe9dc02378d719b491984b72b12cac6a4;p=thirdparty%2Fknot-resolver.git 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 --- 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; }