private async Task DetectChanges() { // TODO -- need to put some retry & exception handling here. try { _current = await _detector.Detect(_token); if (_current.CurrentMark > 0) { _tracker.MarkHighWater(_current.CurrentMark); } } catch (Exception e) { _logger.LogError(e, "Failed while making the initial determination of the high water mark"); } await Task.Delay(_settings.FastPollingTime, _token); while (!_token.IsCancellationRequested) { HighWaterStatistics statistics = null; try { statistics = await _detector.Detect(_token); } catch (Exception e) { _logger.LogError(e, "Failed while trying to detect high water statistics"); await Task.Delay(_settings.SlowPollingTime, _token); continue; } var status = statistics.InterpretStatus(_current); switch (status) { case HighWaterStatus.Changed: await markProgress(statistics, _settings.FastPollingTime); break; case HighWaterStatus.CaughtUp: await markProgress(statistics, _settings.SlowPollingTime); break; case HighWaterStatus.Stale: var safeHarborTime = _current.Timestamp.Add(_settings.StaleSequenceThreshold); var delayTime = safeHarborTime.Subtract(statistics.Timestamp); if (delayTime.TotalSeconds > 0) { await Task.Delay(delayTime, _token); } statistics = await _detector.DetectInSafeZone(safeHarborTime, _token); await markProgress(statistics, _settings.FastPollingTime); break; } } _logger.LogInformation("HighWaterAgent has detected a cancellation and has stopped polling"); }
private async Task DetectChanges() { if (!IsRunning) { return; } try { _current = await _detector.Detect(_token).ConfigureAwait(false); if (_current.CurrentMark > 0) { _tracker.MarkHighWater(_current.CurrentMark); } } catch (Exception e) { _logger.LogError(e, "Failed while making the initial determination of the high water mark"); } await Task.Delay(_settings.FastPollingTime, _token).ConfigureAwait(false); while (!_token.IsCancellationRequested) { if (!IsRunning) { break; } HighWaterStatistics statistics = null; try { statistics = await _detector.Detect(_token).ConfigureAwait(false); } catch (Exception e) { _logger.LogError(e, "Failed while trying to detect high water statistics"); await Task.Delay(_settings.SlowPollingTime, _token).ConfigureAwait(false); continue; } var status = statistics.InterpretStatus(_current); switch (status) { case HighWaterStatus.Changed: await markProgress(statistics, _settings.FastPollingTime).ConfigureAwait(false); break; case HighWaterStatus.CaughtUp: await markProgress(statistics, _settings.SlowPollingTime).ConfigureAwait(false); break; case HighWaterStatus.Stale: _logger.LogInformation("High Water agent is stale at {CurrentMark}", statistics.CurrentMark); // This gives the high water detection a chance to allow the gaps to fill in // before skipping to the safe harbor time var safeHarborTime = _current.Timestamp.Add(_settings.StaleSequenceThreshold); if (safeHarborTime > statistics.Timestamp) { await Task.Delay(_settings.SlowPollingTime, _token).ConfigureAwait(false); continue; } _logger.LogInformation("High Water agent is stale after threshold of {DelayInSeconds} seconds, skipping gap to events marked after {SafeHarborTime}", _settings.StaleSequenceThreshold.TotalSeconds, safeHarborTime); statistics = await _detector.DetectInSafeZone(_token).ConfigureAwait(false); await markProgress(statistics, _settings.FastPollingTime).ConfigureAwait(false); break; } } _logger.LogInformation("HighWaterAgent has detected a cancellation and has stopped polling"); }