Skip to content

Commit 0a9334b

Browse files
authored
Merge pull request PowerDNS#17460 from rgacogne/nmt-empty
iputils: Return early when the tree is empty
2 parents fab61d3 + 864fdc2 commit 0a9334b

3 files changed

Lines changed: 48 additions & 0 deletions

File tree

pdns/dnsdistdist/bench-iputils.cc

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* This file is part of PowerDNS or dnsdist.
3+
* Copyright -- PowerDNS.COM B.V. and its contributors
4+
*
5+
* This program is free software; you can redistribute it and/or modify
6+
* it under the terms of version 2 of the GNU General Public License as
7+
* published by the Free Software Foundation.
8+
*
9+
* In addition, for the avoidance of any doubt, permission is granted to
10+
* link this program with OpenSSL and to (re)distribute the binaries
11+
* produced as the result of such linking.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
* GNU General Public License for more details.
17+
*
18+
* You should have received a copy of the GNU General Public License
19+
* along with this program; if not, write to the Free Software
20+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21+
*/
22+
#define CATCH_CONFIG_NO_MAIN
23+
#include <catch2/catch_test_macros.hpp>
24+
#include <catch2/benchmark/catch_benchmark.hpp>
25+
26+
#include "iputils.hh"
27+
28+
TEST_CASE("netmask_tree")
29+
{
30+
const ComboAddress addr{"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"};
31+
NetmaskTree<bool> tree{};
32+
33+
BENCHMARK("lookup_v6_empty_tree")
34+
{
35+
const auto* got = tree.lookup(addr);
36+
if (got != nullptr) {
37+
abort();
38+
}
39+
return got;
40+
};
41+
}

pdns/dnsdistdist/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ benchmark_sources = files(
606606
src_dir / 'bench-dnsdist-opentelemetry_cc.cc',
607607
src_dir / 'bench-dnsdist-rings_cc.cc',
608608
src_dir / 'bench-misc_hh.cc',
609+
src_dir / 'bench-iputils.cc',
609610
)
610611

611612
if get_option('benchmark')

pdns/iputils.hh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,13 +1511,19 @@ public:
15111511
//<! Returns "best match" for key_type, which might not be value
15121512
[[nodiscard]] node_type* lookup(const key_type& value) const
15131513
{
1514+
if (empty()) {
1515+
return nullptr;
1516+
}
15141517
uint8_t max_bits = value.getBits();
15151518
return lookupImpl(value, max_bits);
15161519
}
15171520

15181521
//<! Perform best match lookup for value, using at most max_bits
15191522
[[nodiscard]] node_type* lookup(const ComboAddress& value, int max_bits = 128) const
15201523
{
1524+
if (empty()) {
1525+
return nullptr;
1526+
}
15211527
uint8_t addr_bits = value.getBits();
15221528
if (max_bits < 0 || max_bits > addr_bits) {
15231529
max_bits = addr_bits;

0 commit comments

Comments
 (0)