public async Task <long> Start(ProjectionDaemon daemon) { _logger.LogInformation("Starting projection agent for '{ShardName}'", _projectionShard.Name); var singleFile = new ExecutionDataflowBlockOptions { EnsureOrdered = true, MaxDegreeOfParallelism = 1, CancellationToken = _cancellation, }; _commandBlock = new ActionBlock <Command>(processCommand, singleFile); _loader = new TransformBlock <EventRange, EventRange>(loadEvents, singleFile); _tracker = daemon.Tracker; _daemon = daemon; _fetcher = new EventFetcher(_store, _projectionShard.EventFilters); _hopper = _projectionShard.Start(this, _logger, _cancellation); _loader.LinkTo(_hopper, e => e.Events.Any()); var lastCommitted = await _store.Advanced.ProjectionProgressFor(_projectionShard.Name, _cancellation); _commandBlock.Post(Command.Started(_tracker.HighWaterMark, lastCommitted)); _subscription = _tracker.Subscribe(this); _logger.LogInformation("Projection agent for '{ShardName}' has started from sequence {LastCommitted} and a high water mark of {HighWaterMark}", _projectionShard.Name, lastCommitted, _tracker.HighWaterMark); Status = AgentStatus.Running; Position = lastCommitted; return(lastCommitted); }
public async Task <long> Start(ShardStateTracker tracker) { _logger.LogInformation($"Starting projection agent for '{_projectionShard.ProjectionOrShardName}'"); _tracker = tracker; _fetcher = new EventFetcher(_store, _projectionShard.EventFilters); _hopper = _projectionShard.Start(this, _logger, _cancellationSource.Token); _loader.LinkTo(_hopper); var lastCommitted = await _store.Events.ProjectionProgressFor(_projectionShard.ProjectionOrShardName); _commandBlock.Post(Command.Started(tracker.HighWaterMark, lastCommitted)); _subscription = _tracker.Subscribe(this); _logger.LogInformation($"Projection agent for '{_projectionShard.ProjectionOrShardName}' has started from sequence {lastCommitted} and a high water mark of {tracker.HighWaterMark}"); Status = AgentStatus.Running; Position = lastCommitted; return(lastCommitted); }