// 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; }
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); }
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); } }
private void Handle(SdamInformationEvent @event) { Info(TraceSourceEventHelper.ClusterIdBase + 9, "{0}", @event); }