From 320109101efb2f686bceeaf99a396c0a6567061e Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 18 Jul 2021 15:44:02 +0530 Subject: [PATCH] StubZone: Added ResetRefreshTimer() to safely reset refresh timer. Setting dns client concurrency to 1 for refresh operation. --- DnsServerCore/Dns/Zones/StubZone.cs | 33 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/DnsServerCore/Dns/Zones/StubZone.cs b/DnsServerCore/Dns/Zones/StubZone.cs index 4d15656d..8e7fa198 100644 --- a/DnsServerCore/Dns/Zones/StubZone.cs +++ b/DnsServerCore/Dns/Zones/StubZone.cs @@ -165,7 +165,7 @@ namespace DnsServerCore.Dns.Zones //set timer for retry DnsSOARecord soa1 = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord; - _refreshTimer.Change(soa1.Retry * 1000, Timeout.Infinite); + ResetRefreshTimer(soa1.Retry * 1000); return; } @@ -174,7 +174,7 @@ namespace DnsServerCore.Dns.Zones { //zone refreshed; set timer for refresh DnsSOARecord latestSoa = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord; - _refreshTimer.Change(latestSoa.Refresh * 1000, Timeout.Infinite); + ResetRefreshTimer(latestSoa.Refresh * 1000); _expiry = DateTime.UtcNow.AddSeconds(latestSoa.Expire); _isExpired = false; @@ -185,7 +185,7 @@ namespace DnsServerCore.Dns.Zones //no response from any of the name servers; set timer for retry DnsSOARecord soa = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord; - _refreshTimer.Change(soa.Retry * 1000, Timeout.Infinite); + ResetRefreshTimer(soa.Retry * 1000); } catch (Exception ex) { @@ -194,14 +194,8 @@ namespace DnsServerCore.Dns.Zones log.Write(ex); //set timer for retry - lock (_refreshTimerLock) - { - if (_refreshTimer != null) - { - DnsSOARecord soa = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord; - _refreshTimer.Change(soa.Retry * 1000, Timeout.Infinite); - } - } + DnsSOARecord soa = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord; + ResetRefreshTimer(soa.Retry * 1000); } finally { @@ -209,6 +203,15 @@ namespace DnsServerCore.Dns.Zones } } + private void ResetRefreshTimer(long dueTime) + { + lock (_refreshTimerLock) + { + if (_refreshTimer != null) + _refreshTimer.Change(dueTime, Timeout.Infinite); + } + } + private async Task RefreshZoneAsync(IReadOnlyList nameServers) { try @@ -225,6 +228,7 @@ namespace DnsServerCore.Dns.Zones client.PreferIPv6 = _dnsServer.PreferIPv6; client.Timeout = REFRESH_TIMEOUT; client.Retries = REFRESH_RETRIES; + client.Concurrency = 1; DnsDatagram soaRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, false, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord(_name, DnsResourceRecordType.SOA, DnsClass.IN) }); DnsDatagram soaResponse = await client.ResolveAsync(soaRequest); @@ -276,6 +280,7 @@ namespace DnsServerCore.Dns.Zones client.PreferIPv6 = _dnsServer.PreferIPv6; client.Timeout = REFRESH_TIMEOUT; client.Retries = REFRESH_RETRIES; + client.Concurrency = 1; DnsDatagram nsRequest = new DnsDatagram(0, false, DnsOpcode.StandardQuery, false, false, false, false, false, false, DnsResponseCode.NoError, new DnsQuestionRecord[] { new DnsQuestionRecord(_name, DnsResourceRecordType.NS, DnsClass.IN) }); DnsDatagram nsResponse = await client.ResolveAsync(nsRequest); @@ -360,7 +365,7 @@ namespace DnsServerCore.Dns.Zones if (_refreshTimerTriggered) return; - _refreshTimer.Change(REFRESH_TIMER_INTERVAL, Timeout.Infinite); + ResetRefreshTimer(REFRESH_TIMER_INTERVAL); _refreshTimerTriggered = true; } @@ -371,7 +376,7 @@ namespace DnsServerCore.Dns.Zones _resync = true; - _refreshTimer.Change(REFRESH_TIMER_INTERVAL, Timeout.Infinite); + ResetRefreshTimer(REFRESH_TIMER_INTERVAL); _refreshTimerTriggered = true; } @@ -439,7 +444,7 @@ namespace DnsServerCore.Dns.Zones _disabled = value; if (_disabled) - _refreshTimer.Change(Timeout.Infinite, Timeout.Infinite); + ResetRefreshTimer(Timeout.Infinite); else TriggerRefresh(); }