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