From eb25ff532badc0b4d6c688dc71e9e4b830762379 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 15 Apr 2025 10:57:57 +0200 Subject: [PATCH] dnsdist: Small optimization in the Rings unit tests Calling `BOOST_CHECK_*` is quite expensive, so this commit limits the number of these calls done in a tight loop. --- pdns/dnsdistdist/test-dnsdistrings_cc.cc | 76 +++++++++++++----------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/pdns/dnsdistdist/test-dnsdistrings_cc.cc b/pdns/dnsdistdist/test-dnsdistrings_cc.cc index ad81e1ec39..4dc7ae0dab 100644 --- a/pdns/dnsdistdist/test-dnsdistrings_cc.cc +++ b/pdns/dnsdistdist/test-dnsdistrings_cc.cc @@ -13,6 +13,40 @@ BOOST_AUTO_TEST_SUITE(dnsdistrings_cc) +template static bool checkQuery(const T& entry, const DNSName& qname, uint16_t qtype, uint16_t size, const timespec& now, const ComboAddress& requestor) +{ + if (entry.name != qname) { + return false; + } + if (entry.qtype != qtype) { + return false; + } + if (entry.size != size) { + return false; + } + if (entry.when.tv_sec != now.tv_sec) { + return false; + } + if (entry.requestor != requestor) { + return false; + } + return true; +} + +static bool checkResponse(const Rings::Response& entry, const DNSName& qname, uint16_t qtype, uint16_t size, const timespec& now, const ComboAddress& requestor, unsigned int latency, const ComboAddress& server) +{ + if (!checkQuery(entry, qname, qtype, size, now, requestor)) { + return false; + } + if (entry.usec != latency) { + return false; + } + if (entry.ds != server) { + return false; + } + return true; +} + static void test_ring(size_t maxEntries, size_t numberOfShards, size_t nbLockTries) { Rings rings; @@ -49,11 +83,7 @@ static void test_ring(size_t maxEntries, size_t numberOfShards, size_t nbLockTri auto ring = shard->queryRing.lock(); BOOST_CHECK_EQUAL(ring->size(), entriesPerShard); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor1.toStringWithPort()); + BOOST_CHECK(checkQuery(entry, qname, qtype, size, now, requestor1)); } } @@ -67,11 +97,7 @@ static void test_ring(size_t maxEntries, size_t numberOfShards, size_t nbLockTri auto ring = shard->queryRing.lock(); BOOST_CHECK_EQUAL(ring->size(), entriesPerShard); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor2.toStringWithPort()); + BOOST_CHECK(checkQuery(entry, qname, qtype, size, now, requestor2)); } } @@ -88,13 +114,7 @@ static void test_ring(size_t maxEntries, size_t numberOfShards, size_t nbLockTri auto ring = shard->respRing.lock(); BOOST_CHECK_EQUAL(ring->size(), entriesPerShard); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor1.toStringWithPort()); - BOOST_CHECK_EQUAL(entry.usec, latency); - BOOST_CHECK_EQUAL(entry.ds.toStringWithPort(), server.toStringWithPort()); + BOOST_CHECK(checkResponse(entry, qname, qtype, size, now, requestor1, latency, server)); } } @@ -108,13 +128,7 @@ static void test_ring(size_t maxEntries, size_t numberOfShards, size_t nbLockTri auto ring = shard->respRing.lock(); BOOST_CHECK_EQUAL(ring->size(), entriesPerShard); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor2.toStringWithPort()); - BOOST_CHECK_EQUAL(entry.usec, latency); - BOOST_CHECK_EQUAL(entry.ds.toStringWithPort(), server.toStringWithPort()); + BOOST_CHECK(checkResponse(entry, qname, qtype, size, now, requestor2, latency, server)); } } } @@ -259,11 +273,7 @@ BOOST_AUTO_TEST_CASE(test_Rings_Threaded) { BOOST_WARN_GT(ring->size(), entriesPerShard * 0.95); totalQueries += ring->size(); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor.toStringWithPort()); + BOOST_CHECK(checkQuery(entry, qname, qtype, size, now, requestor)); } } { @@ -275,13 +285,7 @@ BOOST_AUTO_TEST_CASE(test_Rings_Threaded) { BOOST_WARN_GT(ring->size(), entriesPerShard * 0.95); totalResponses += ring->size(); for (const auto& entry : *ring) { - BOOST_CHECK_EQUAL(entry.name, qname); - BOOST_CHECK_EQUAL(entry.qtype, qtype); - BOOST_CHECK_EQUAL(entry.size, size); - BOOST_CHECK_EQUAL(entry.when.tv_sec, now.tv_sec); - BOOST_CHECK_EQUAL(entry.requestor.toStringWithPort(), requestor.toStringWithPort()); - BOOST_CHECK_EQUAL(entry.usec, latency); - BOOST_CHECK_EQUAL(entry.ds.toStringWithPort(), server.toStringWithPort()); + BOOST_CHECK(checkResponse(entry, qname, qtype, size, now, requestor, latency, server)); } } } -- 2.47.2