Пример #1
0
        // private methods
        private void ThreadStart()
        {
            _state = DnsMonitorState.Running;

            try
            {
                Monitor();
            }
            catch (OperationCanceledException)
            {
                // ignore OperationCanceledException
            }
            catch (Exception exception)
            {
                _unhandledException = exception;

                if (_sdamInformationEventHandler != null)
                {
                    var message = $"Unhandled exception in DnsMonitor: {exception}.";
                    var sdamInformationEvent = new SdamInformationEvent(() => message);
                    _sdamInformationEventHandler(sdamInformationEvent);
                }

                _state = DnsMonitorState.Failed;
                return;
            }

            _state = DnsMonitorState.Stopped;
        }
Пример #2
0
        private List <DnsEndPoint> GetValidEndPoints(List <SrvRecord> srvRecords)
        {
            var validEndPoints = new List <DnsEndPoint>();

            foreach (var srvRecord in srvRecords)
            {
                var endPoint = srvRecord.EndPoint;
                var host     = endPoint.Host;
                if (host.EndsWith(".", StringComparison.Ordinal))
                {
                    host     = host.Substring(0, host.Length - 1);
                    endPoint = new DnsEndPoint(host, endPoint.Port);
                }

                if (IsValidHost(endPoint))
                {
                    validEndPoints.Add(endPoint);
                }
                else
                {
                    if (_sdamInformationEventHandler != null)
                    {
                        var message = $"Invalid host returned by DNS SRV lookup: {host}.";
                        var sdamInformationEvent = new SdamInformationEvent(() => message);
                        _sdamInformationEventHandler(sdamInformationEvent);
                    }
                }
            }

            return(validEndPoints);
        }
Пример #3
0
        private void Monitor()
        {
            while (true)
            {
                if (_processDnsResultHasEverBeenCalled && _cluster.ShouldDnsMonitorStop())
                {
                    return;
                }

                List <SrvRecord> srvRecords = null;
                try
                {
                    srvRecords = _dnsResolver.ResolveSrvRecords(_service, _cancellationToken);
                }
                catch (Exception exception)
                {
                    if (!_processDnsResultHasEverBeenCalled)
                    {
                        _cluster.ProcessDnsException(exception);
                    }
                }

                if (srvRecords != null)
                {
                    var endPoints = GetValidEndPoints(srvRecords);
                    if (endPoints.Count > 0)
                    {
                        _cluster.ProcessDnsResults(endPoints);
                        _processDnsResultHasEverBeenCalled = true;
                    }
                    else
                    {
                        if (_sdamInformationEventHandler != null)
                        {
                            var message = $"A DNS SRV query on \"{_service}\" returned no valid hosts.";
                            var sdamInformationEvent = new SdamInformationEvent(() => message);
                            _sdamInformationEventHandler(sdamInformationEvent);
                        }
                    }
                }

                if (_cluster.ShouldDnsMonitorStop())
                {
                    return;
                }

                _cancellationToken.ThrowIfCancellationRequested();
                var delay = ComputeRescanDelay(srvRecords);
                Thread.Sleep(delay);
            }
        }
Пример #4
0
 private void Handle(SdamInformationEvent @event)
 {
     Info(TraceSourceEventHelper.ClusterIdBase + 9, "{0}", @event);
 }