From 7566e46e2e6120def0b84b488449ea1f419241ba Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 18 Feb 2017 16:51:38 +1100 Subject: [PATCH 1/3] dns.resolvers: Use resolver from pool if there is something in pool Previously this would always leave/ignore one resolver in the pool --- src/dns.resolvers.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dns.resolvers.lua b/src/dns.resolvers.lua index 4c671ed..9180bab 100644 --- a/src/dns.resolvers.lua +++ b/src/dns.resolvers.lua @@ -115,7 +115,7 @@ local loader = function(loader, ...) local res while true do local cache_len = #self.cache - if cache_len > 1 then + if cache_len > 0 then res = self.cache[cache_len] self.cache[cache_len] = nil if res then From 1bcd9f41a2419e69d1a974f13de273b829288823 Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 18 Feb 2017 16:53:12 +1100 Subject: [PATCH 2/3] dns.resolvers: Avoid potential infinite loop waiting for a resolver Previously if there was nothing in pool but more than hiwat resolvers alive, then this would busy loop (not even yielding) --- src/dns.resolvers.lua | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/dns.resolvers.lua b/src/dns.resolvers.lua index 9180bab..ecdff5b 100644 --- a/src/dns.resolvers.lua +++ b/src/dns.resolvers.lua @@ -118,14 +118,7 @@ local loader = function(loader, ...) if cache_len > 0 then res = self.cache[cache_len] self.cache[cache_len] = nil - if res then - break - else - if deadline and deadline <= monotime() then - return nil, ETIMEDOUT - end - self.condvar:wait(totimeout(deadline)) - end + break elseif self.alive.n < self.hiwat then local why res, why = resolver.new(self.resconf, self.hosts, self.hints) @@ -134,6 +127,9 @@ local loader = function(loader, ...) end break end + if not self.condvar:wait(totimeout(deadline)) then + return nil, ETIMEDOUT + end end self.alive:add(res) return res From d3ec712a873475cc275a9e5c5570201b99540dd7 Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 18 Feb 2017 17:17:12 +1100 Subject: [PATCH 3/3] Add regression test for issue #178 --- regress/178-last-resolver.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 regress/178-last-resolver.lua diff --git a/regress/178-last-resolver.lua b/regress/178-last-resolver.lua new file mode 100755 index 0000000..601542b --- /dev/null +++ b/regress/178-last-resolver.lua @@ -0,0 +1,14 @@ +#!/bin/sh +_=[[ + . "${0%%/*}/regress.sh" + exec runlua "$0" "$@" +]] +require"regress".export".*" + +local pool = dns.getpool() +local r = pool:get() +pool:put(r) +local q = pool:get() +check(r == q, "resolver not reused") + +say"OK"