Visitar URL original
New NewId algorithm and some minor changes by MichaConrad · Pull Request #247 · MichaCo/DnsClient.NET · GitHub
Skip to content

New NewId algorithm and some minor changes - #247

Merged
MichaConrad merged 4 commits into
devfrom
safe-new-id-andmore
Oct 30, 2025
Merged

MichaConrad merged 4 commits into
devfrom
safe-new-id-andmore

Conversation

@MichaConrad

Copy link
Copy Markdown
Collaborator

The main change here is a new algorithm to generate Ids per requests in a way that makes sure we do not use the same Id in consecutive requests.
The logic should work even under very high load, if too many calls happen at the same time, the logic will fall back to a faster, linear version to prevent endless loops.

+ Change default NetworkInterface discovery to remove unknown interfaces and order by type
+ Adding a new idea to generate unique query Ids and not re-use them while the request with that ID is going on.
@MichaConrad
MichaConrad requested a review from Copilot October 30, 2025 14:03

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This pull request updates package dependencies and implements a thread-safe query ID management system to prevent ID collisions in DNS queries. Key infrastructure improvements include proper resource disposal patterns and enhanced error handling.

  • Upgrades test frameworks (xunit 2.8.1→2.9.3, xunit.runner.visualstudio 2.8.1→3.0.2) and test/benchmark dependencies
  • Introduces thread-safe bitmap-based query ID allocation with IDisposable pattern for proper ID lifecycle management
  • Adds comprehensive test coverage for the new ThreadSafeBitArrayTest and QueryId functionality
  • Improves error messages and logging, including timeout auditing and cache cleanup error logging

Reviewed Changes

Copilot reviewed 25 out of 25 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
test/DnsClient.ThirdParty.Tests/DnsClient.ThirdParty.Tests.csproj Updates test package versions (Moq, Microsoft.NET.Test.Sdk, xunit, xunit.runner.visualstudio)
test/DnsClient.Tests/DnsClient.Tests.csproj Updates test package versions matching ThirdParty.Tests
test/DnsClient.Tests/ThreadSafeBitArrayTest.cs Adds comprehensive test suite for ThreadSafeBitmap and QueryId functionality
test/DnsClient.Tests/ResponseCacheTest.cs Updates ResponseCache constructor calls to include logger parameter
test/DnsClient.Tests/LookupConfigurationTest.cs Fixes LINQ query issues in theory data collection
test/DnsClient.Tests/DnsRequestHeaderTest.cs Adds using statements for proper disposal of DnsRequestHeader
test/DnsClient.Tests/DatagramReaderTest.cs Adds ToArray() call to fix assertion with ReadOnlyMemory
test-other/DnsClient.PerfTestHost/Program.cs Fixes semicolon typo (statement terminator)
test-other/Benchmarks/Benchmarks.csproj Updates BenchmarkDotNet version
src/DnsClient/ResponseCache.cs Adds logger support and fixes ArgumentNullException parameter bugs
src/DnsClient/NameServer.cs Implements DNS suffix support from resolv.conf parsing
src/DnsClient/LookupClient.cs Integrates IDisposable pattern for request messages and improves error handling
src/DnsClient/Interop/Linux/StringParsingHelper.Dns.cs Refactors to accept data string instead of file path
src/DnsClient/Interop/Linux/RowConfigReader.cs Improves documentation and adds Int64 parsing support
src/DnsClient/Internal/PooledBytes.cs Adds clearArray parameter to array pool return
src/DnsClient/DnsTcpMessageHandler.cs Defers TCP connection until actual query time
src/DnsClient/DnsRequestMessage.cs Implements IDisposable to manage header lifecycle
src/DnsClient/DnsRequestHeader.cs Implements QueryId class with thread-safe bitmap allocation
src/DnsClient/DnsQueryOptions.cs Adds TODO comment about UseRandomNameServer default
src/DnsClient/DnsMessageHandler.cs Fixes incorrect cast from ushort to uint
src/DnsClient/DnsClient.csproj Bumps version and updates System.Buffers dependency
samples/MiniDig/RandomCommand.cs Updates to use QueryServer methods with random server selection
samples/MiniDig/Properties/launchSettings.json Updates launch profiles
samples/MiniDig/MiniDig.csproj Removes net48 target framework
samples/MiniDig/DnsCommand.cs Adjusts default timeout/retries and adds lookup options
Comments suppressed due to low confidence (4)

src/DnsClient/NameServer.cs:476

            foreach (NetworkInterface networkInterface in
                adapters
                    // some VPN DNS servers have type > 6, e.g. 53
                    // the "normal" case would type = 6 (Ethernet)
                    // try to prio Ethernet over other adapters via ordering... (this might get ignored by the lookup client settings)
                    .OrderBy(p => p?.NetworkInterfaceType)
                    .Where(
                        p => p != null
                        && (p.OperationalStatus == OperationalStatus.Up || p.OperationalStatus == OperationalStatus.Unknown)
                        && p.NetworkInterfaceType != NetworkInterfaceType.Loopback
                        && p.NetworkInterfaceType != NetworkInterfaceType.Unknown))
            {
                var properties = networkInterface.GetIPProperties();

                // Can be null under mono for whatever reason...
                if (properties?.DnsAddresses == null)
                {
                    continue;
                }

                foreach (var ip in properties.DnsAddresses)
                {
                    result.Add(new NameServer(ip, DefaultPort, properties.DnsSuffix));
                }
            }

src/DnsClient/DnsRequestHeader.cs:241

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
            return $"{Id} - Qs: {1} Recursion: {UseRecursion} OpCode: {OpCode}";

src/DnsClient/LookupClient.cs:868

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
                            $"Query {request.Header.Id} => {request.Question} on {serverInfo} failed with an error.",

src/DnsClient/LookupClient.cs:1149

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
                            $"Query {request.Header.Id} => {request.Question} on {serverInfo} failed with an error.",

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
Comment thread src/DnsClient/LookupClient.cs Resolved
Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
Comment thread src/DnsClient/LookupClient.cs Resolved
Comment thread src/DnsClient/LookupClient.cs Resolved
Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
@MichaConrad
MichaConrad requested a review from Copilot October 30, 2025 14:12

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 7 comments.

Comments suppressed due to low confidence (4)

src/DnsClient/NameServer.cs:476

            foreach (NetworkInterface networkInterface in
                adapters
                    // some VPN DNS servers have type > 6, e.g. 53
                    // the "normal" case would type = 6 (Ethernet)
                    // try to prio Ethernet over other adapters via ordering... (this might get ignored by the lookup client settings)
                    .OrderBy(p => p?.NetworkInterfaceType)
                    .Where(
                        p => p != null
                        && (p.OperationalStatus == OperationalStatus.Up || p.OperationalStatus == OperationalStatus.Unknown)
                        && p.NetworkInterfaceType != NetworkInterfaceType.Loopback
                        && p.NetworkInterfaceType != NetworkInterfaceType.Unknown))
            {
                var properties = networkInterface.GetIPProperties();

                // Can be null under mono for whatever reason...
                if (properties?.DnsAddresses == null)
                {
                    continue;
                }

                foreach (var ip in properties.DnsAddresses)
                {
                    result.Add(new NameServer(ip, DefaultPort, properties.DnsSuffix));
                }
            }

src/DnsClient/DnsRequestHeader.cs:236

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
            return $"{Id} - Qs: {1} Recursion: {UseRecursion} OpCode: {OpCode}";

src/DnsClient/LookupClient.cs:868

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
                            $"Query {request.Header.Id} => {request.Question} on {serverInfo} failed with an error.",

src/DnsClient/LookupClient.cs:1149

  • Default 'ToString()': QueryId inherits 'ToString()' from 'Object', and so is not suitable for printing.
                            $"Query {request.Header.Id} => {request.Question} on {serverInfo} failed with an error.",

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
Comment thread src/DnsClient/DnsTcpMessageHandler.cs Resolved
Comment thread src/DnsClient/DnsRequestHeader.cs Resolved
@MichaConrad MichaConrad self-assigned this Oct 30, 2025
@MichaConrad
MichaConrad merged commit c0e97bd into dev Oct 30, 2025
1 check passed
@segor

segor commented Jul 27, 2026

Copy link
Copy Markdown

any chance to release this change?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants