/// <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();
            }
        }