public async Task RunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext orchestrationContext, ILogger log) { ILogger replaySafeLogger = orchestrationContext.CreateReplaySafeLogger(log); WorkflowMessageEnvelope envelope = orchestrationContext.GetInputWithCustomSerializationSettings <WorkflowMessageEnvelope>( this.serializerSettingsProvider.Instance); try { await orchestrationContext.CallActivityAsync( nameof(StartLongRunningOperationActivity), (envelope.OperationId, envelope.TenantId)); if (envelope.IsStartWorkflowRequest) { replaySafeLogger.LogDebug( $"Received new start workflow request with Id {envelope.StartWorkflowInstanceRequest.RequestId} for workflow {envelope.StartWorkflowInstanceRequest.WorkflowId}"); await orchestrationContext.CallActivityWithCustomSerializationSettingsAsync( nameof(CreateWorkflowActivity), envelope, this.serializerSettingsProvider.Instance); } else { replaySafeLogger.LogDebug($"Received new workflow trigger with Id {envelope.Trigger.Id}"); int count = await orchestrationContext.CallActivityWithCustomSerializationSettingsAsync <WorkflowMessageEnvelope, int>( nameof(GetWorkflowInstanceCountActivity), envelope, this.serializerSettingsProvider.Instance); int pages = (int)Math.Ceiling((decimal)count / 500); replaySafeLogger.LogDebug($"Found {count} instances that match. Split into {pages} pages for fan-out."); var tasks = new Task[pages]; for (int i = 0; i < pages; i++) { envelope.SetWorkflowInstancesPageNumber(this.propertyBagFactory, i); tasks[i] = orchestrationContext.CallSubOrchestratorWithCustomSerializationSettingsAsync( nameof(TriggerInstancesExecutionOrchestrator), envelope, this.serializerSettingsProvider.Instance); } await Task.WhenAll(tasks); replaySafeLogger.LogDebug("All sub-orchestrations complete"); } await orchestrationContext.CallActivityAsync( nameof(CompleteLongRunningOperationActivity), (envelope.OperationId, envelope.TenantId)); } catch (FunctionFailedException x) { replaySafeLogger.LogError($"Error during orchestration: {x}"); await orchestrationContext.CallActivityAsync( nameof(FailLongRunningOperationActivity), (envelope.OperationId, envelope.TenantId)); throw; } }