From 21eb4dd7d37b82fb8b25145dd79ca527f168bdb9 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 27 Jun 2020 15:38:42 +0530 Subject: [PATCH] DnsServer: replaced ConcurrentDictionary with DomainTree to manage resolver query handles to have a complete lock less lookup code. --- DnsServerCore/Dns/DnsServer.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/DnsServerCore/Dns/DnsServer.cs b/DnsServerCore/Dns/DnsServer.cs index 67c977e1..919ea23e 100644 --- a/DnsServerCore/Dns/DnsServer.cs +++ b/DnsServerCore/Dns/DnsServer.cs @@ -22,7 +22,6 @@ using DnsServerCore.Dns.ZoneManagers; using DnsServerCore.Dns.Zones; using Newtonsoft.Json; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; @@ -119,7 +118,7 @@ namespace DnsServerCore.Dns const int CACHE_MAINTENANCE_TIMER_INITIAL_INTEVAL = 60 * 60 * 1000; const int CACHE_MAINTENANCE_TIMER_PERIODIC_INTERVAL = 60 * 60 * 1000; - readonly ConcurrentDictionary _resolverQueryHandles = new ConcurrentDictionary(); + readonly DomainTree _resolverQueryHandles = new DomainTree(); volatile ServiceState _state = ServiceState.Stopped; @@ -1604,7 +1603,7 @@ namespace DnsServerCore.Dns //recursion with locking ResolverQueryHandle newQueryHandle = new ResolverQueryHandle(); - ResolverQueryHandle queryHandle = _resolverQueryHandles.GetOrAdd(request.Question[0], newQueryHandle); + ResolverQueryHandle queryHandle = _resolverQueryHandles.GetOrAdd(request.Question[0].Name + "." + request.Question[0].Type + "." + request.Question[0].Class, newQueryHandle); if (queryHandle.Equals(newQueryHandle)) { @@ -1762,7 +1761,7 @@ namespace DnsServerCore.Dns } finally { - _resolverQueryHandles.TryRemove(request.Question[0], out _); + _resolverQueryHandles.TryRemove(request.Question[0].Name + "." + request.Question[0].Type + "." + request.Question[0].Class, out _); } }