public void Process(BatchProcessed evt, EffectTracker effects) { // can add events to the history, or replace it with a new history // update the stored history if (this.History == null || evt.State.OrchestrationInstance.ExecutionId != this.ExecutionId) { this.History = new List <HistoryEvent>(); this.Episode = 0; this.ExecutionId = evt.State.OrchestrationInstance.ExecutionId; } this.Partition.Assert(!string.IsNullOrEmpty(this.InstanceId) || string.IsNullOrEmpty(this.ExecutionId)); // add all the new events to the history, and update episode number if (evt.NewEvents != null) { for (int i = 0; i < evt.NewEvents.Count; i++) { var historyEvent = evt.NewEvents[i]; if (historyEvent.EventType == EventType.OrchestratorStarted) { this.Episode++; } this.History.Add(evt.NewEvents[i]); } } if (!effects.IsReplaying) { this.Partition.EventTraceHelper.TraceInstanceUpdate( evt.WorkItemId, evt.State.OrchestrationInstance.InstanceId, evt.State.OrchestrationInstance.ExecutionId, this.History.Count, evt.NewEvents, this.Episode); // if present, we keep the work item so we can reuse the execution cursor this.CachedOrchestrationWorkItem = evt.WorkItemForReuse; if (this.CachedOrchestrationWorkItem != null && this.CachedOrchestrationWorkItem.OrchestrationRuntimeState?.OrchestrationInstance?.ExecutionId != evt.State.OrchestrationInstance.ExecutionId) { effects.Partition.EventTraceHelper.TraceEventProcessingWarning($"Dropping bad workitem cache instance={this.InstanceId} expected_executionid={evt.State.OrchestrationInstance.ExecutionId} actual_executionid={this.CachedOrchestrationWorkItem.OrchestrationRuntimeState?.OrchestrationInstance?.ExecutionId}"); this.CachedOrchestrationWorkItem = null; } } }
public void Process(BatchProcessed evt, EffectTracker effects) { // update the state of an orchestration this.OrchestrationState = evt.State; // if the orchestration is complete, notify clients that are waiting for it if (this.Waiters != null && WaitRequestReceived.SatisfiesWaitCondition(this.OrchestrationState)) { if (!effects.IsReplaying) { foreach (var request in this.Waiters) { this.Partition.Send(request.CreateResponse(this.OrchestrationState)); } } this.Waiters = null; } }
public void Process(BatchProcessed evt, EffectTracker effects) { var sorted = new Dictionary <uint, TaskMessagesReceived>(); foreach (var message in evt.RemoteMessages) { var instanceId = message.OrchestrationInstance.InstanceId; var destination = this.Partition.PartitionFunction(instanceId); if (!sorted.TryGetValue(destination, out var outmessage)) { sorted[destination] = outmessage = new TaskMessagesReceived() { PartitionId = destination, WorkItemId = evt.WorkItemId, }; } if (Entities.IsDelayedEntityMessage(message, out _)) { (outmessage.DelayedTaskMessages ?? (outmessage.DelayedTaskMessages = new List <TaskMessage>())).Add(message); } else if (message.Event is ExecutionStartedEvent executionStartedEvent && executionStartedEvent.ScheduledStartTime.HasValue) { (outmessage.DelayedTaskMessages ?? (outmessage.DelayedTaskMessages = new List <TaskMessage>())).Add(message); }