/// <summary> /// Add another discovery from discoverer /// </summary> /// <param name="model"></param> /// <returns></returns> public void Enqueue(DiscoveryEventModel model) { _maxIndex = Math.Max(model.Index, _maxIndex); if (model.Registration != null) { _endpoints.Add(model); } else { Result = model.Result ?? new DiscoveryResultModel(); } }
/// <summary> /// Process discovery model /// </summary> /// <param name="discovererId"></param> /// <param name="model"></param> /// <param name="checkpoint"></param> /// <returns></returns> private async Task ProcessServerEndpointDiscoveryAsync( string discovererId, DiscoveryEventModel model, Func <Task> checkpoint) { try { await _queueLock.WaitAsync(); if (!_discovererQueues.TryGetValue(discovererId, out var backlog)) { backlog = new Dictionary <DateTime, DiscovererDiscoveryResult>(); _discovererQueues.Add(discovererId, backlog); } if (!backlog.TryGetValue(model.TimeStamp, out var queue)) { queue = new DiscovererDiscoveryResult(checkpoint); backlog.Add(model.TimeStamp, queue); } queue.Enqueue(model); if (queue.Completed) { try { // Process discoveries await Task.WhenAll( _processors.Select(p => p.ProcessDiscoveryResultsAsync( discovererId, queue.Result, queue.Events))); } catch (Exception ex) { _logger.Error(ex, "Failure during discovery processing in registry. Skip."); } backlog.Remove(model.TimeStamp); // // Check if there are any older queues still in the list. // If not then checkpoint this queue. // if (!_discovererQueues.Any(d => d.Value .Any(x => x.Value.Created <= queue.Created))) { await queue.Checkpoint(); } } if (backlog.Count == 0) { _discovererQueues.Remove(discovererId); } } finally { _queueLock.Release(); } }