mirror of
https://github.com/hickory-dns/hickory-dns.git
synced 2026-04-25 11:15:54 +03:00
[GH-ISSUE #2984] Refactor recursor to eliminate recursive calls #1104
Labels
No labels
blocked
breaking-change
bug
bug:critical
bug:tests
cleanup
compliance
compliance
compliance
crate:all
crate:client
crate:native-tls
crate:proto
crate:recursor
crate:resolver
crate:resolver
crate:rustls
crate:server
crate:util
dependencies
docs
duplicate
easy
easy
enhance
enhance
enhance
feature:dns-over-https
feature:dns-over-quic
feature:dns-over-tls
feature:dnsssec
feature:global_lb
feature:mdns
feature:tsig
features:edns
has workaround
ops
perf
platform:WASM
platform:android
platform:fuchsia
platform:linux
platform:macos
platform:windows
pull-request
question
test
tools
tools
trust
unclear
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/hickory-dns#1104
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @divergentdave on GitHub (May 9, 2025).
Original GitHub issue: https://github.com/hickory-dns/hickory-dns/issues/2984
Refactoring the recursor to replace recursion on the native stack with iterative algorithms and custom data structures would be desirable because it could reduce complexity and open the door for further improvements.
RFC 9156 recommends a resolver algorithm that amortizes how many labels from the QNAME are added to each successive iterative query, based on the number of labels in the QNAME and configured limits on iterative queries per recursive query. This is not practical to implement via recursive calls. We currently add one label per recursive call and iterative query, which is simple but overly resource intensive.
Handling of concurrent requests in the recursor is limited. Currently we use
FuturesUnorderedin one place when looking up name server addresses, and wait for all such lookups to complete before proceeding. (theparallel_conn_loop()in the resolver crate is also used to race queries to multiple name servers in a pool) If we moved away from recursive calls to drive iterative resolution, it would be possible to interleave requests to the first name servers we get IPs for concurrently with slower resolutions of other name server IP addresses for the same zone, for example.