From b712c51ee3efb36c5a711527602a70d59e74d85c Mon Sep 17 00:00:00 2001 From: Charles-Henri Bruyand Date: Fri, 7 Sep 2018 08:12:07 +0200 Subject: [PATCH] dnsdist: do not iterate over hash map for consistent hashing based query distribution --- pdns/dnsdist.cc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 39018f851..0942a4f0d 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -775,10 +775,10 @@ shared_ptr whashed(const NumberedServerVector& servers, const D shared_ptr chashed(const NumberedServerVector& servers, const DNSQuestion* dq) { - std::map> circle = {}; unsigned int qhash = dq->qname->hash(g_hashperturb); - unsigned int sel = 0, max = 0; - shared_ptr ret = nullptr, last = nullptr; + unsigned int sel = std::numeric_limits::max(); + unsigned int min = std::numeric_limits::max(); + shared_ptr ret = nullptr, first = nullptr; for (const auto& d: servers) { if (d.second->isUp()) { @@ -790,18 +790,17 @@ shared_ptr chashed(const NumberedServerVector& servers, const D ReadLock rl(&(d.second->d_lock)); const auto& server = d.second; // we want to keep track of the last hash - if (max < *(server->hashes.rbegin())) { - max = *(server->hashes.rbegin()); - last = server; + if (min > *(server->hashes.begin())) { + min = *(server->hashes.begin()); + first = server; } - auto hash_it = server->hashes.begin(); - while (hash_it != server->hashes.end() - && *hash_it < qhash) { - if (*hash_it > sel) { + + auto hash_it = server->hashes.lower_bound(qhash); + if (hash_it != server->hashes.end()) { + if (*hash_it < sel) { sel = *hash_it; ret = server; } - ++hash_it; } } } @@ -809,8 +808,8 @@ shared_ptr chashed(const NumberedServerVector& servers, const D if (ret != nullptr) { return ret; } - if (last != nullptr) { - return last; + if (first != nullptr) { + return first; } return shared_ptr(); } -- 2.50.1