From d7c3eb46570cd350094132da03c01a8f20ecfb0b Mon Sep 17 00:00:00 2001 From: Jacob Viau Date: Tue, 19 Sep 2023 10:02:06 -0700 Subject: [PATCH 01/36] Add RawInput to workaround double-serialization issue (#966) --- .../Serializing/DataConverter.cs | 13 ++++++ .../Serializing/Internal/RawInput.cs | 42 +++++++++++++++++++ src/DurableTask.Core/TaskHubClient.cs | 6 +-- 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/DurableTask.Core/Serializing/Internal/RawInput.cs diff --git a/src/DurableTask.Core/Serializing/DataConverter.cs b/src/DurableTask.Core/Serializing/DataConverter.cs index d2667db25..272e39105 100644 --- a/src/DurableTask.Core/Serializing/DataConverter.cs +++ b/src/DurableTask.Core/Serializing/DataConverter.cs @@ -14,6 +14,7 @@ namespace DurableTask.Core.Serializing { using System; + using DurableTask.Core.Serializing.Internal; /// /// Abstract class for serializing and deserializing data @@ -59,5 +60,17 @@ public T Deserialize(string data) return (T)result; } + + internal string SerializeInternal(object value) + { +#pragma warning disable CS0618 // Type or member is obsolete. Intentional internal usage. + if (value is RawInput raw) + { + return raw.Value; + } +#pragma warning restore CS0618 // Type or member is obsolete + + return this.Serialize(value); + } } } \ No newline at end of file diff --git a/src/DurableTask.Core/Serializing/Internal/RawInput.cs b/src/DurableTask.Core/Serializing/Internal/RawInput.cs new file mode 100644 index 000000000..082dd3501 --- /dev/null +++ b/src/DurableTask.Core/Serializing/Internal/RawInput.cs @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +#nullable enable +using System; + +namespace DurableTask.Core.Serializing.Internal +{ + /// + /// This is an internal API that supports the DurableTask infrastructure and not subject to the same compatibility + /// standards as public APIs. It may be changed or removed without notice in any release. You should only use it + /// directly in your code with extreme caution and knowing that doing so can result in application failures when + /// updating to a new DurableTask release. + /// + [Obsolete("Not for public consumption.")] + public sealed class RawInput + { + /// + /// Initializes a new instance of the class. + /// + /// The raw input value to use. + public RawInput(string? value) + { + this.Value = value; + } + + /// + /// Gets the raw input value. + /// + public string? Value { get; } + } +} diff --git a/src/DurableTask.Core/TaskHubClient.cs b/src/DurableTask.Core/TaskHubClient.cs index c0d215e49..af03ac1a5 100644 --- a/src/DurableTask.Core/TaskHubClient.cs +++ b/src/DurableTask.Core/TaskHubClient.cs @@ -591,7 +591,7 @@ async Task InternalCreateOrchestrationInstanceWithRaisedE ExecutionId = Guid.NewGuid().ToString("N"), }; - string serializedOrchestrationData = this.defaultConverter.Serialize(orchestrationInput); + string serializedOrchestrationData = this.defaultConverter.SerializeInternal(orchestrationInput); var startedEvent = new ExecutionStartedEvent(-1, serializedOrchestrationData) { Tags = orchestrationTags, @@ -626,7 +626,7 @@ async Task InternalCreateOrchestrationInstanceWithRaisedE if (eventData != null) { - string serializedEventData = this.defaultConverter.Serialize(eventData); + string serializedEventData = this.defaultConverter.SerializeInternal(eventData); var eventRaisedEvent = new EventRaisedEvent(-1, serializedEventData) { Name = eventName }; this.logHelper.RaisingEvent(orchestrationInstance, eventRaisedEvent); @@ -694,7 +694,7 @@ public async Task RaiseEventAsync(OrchestrationInstance orchestrationInstance, s throw new ArgumentException(nameof(orchestrationInstance)); } - string serializedInput = this.defaultConverter.Serialize(eventData); + string serializedInput = this.defaultConverter.SerializeInternal(eventData); // Distributed Tracing EventRaisedEvent eventRaisedEvent = new EventRaisedEvent(-1, serializedInput) { Name = eventName }; From 6dc7134ceee4cec9073b86d5bb70da0cd4ca6731 Mon Sep 17 00:00:00 2001 From: Jacob Viau Date: Tue, 19 Sep 2023 16:04:26 -0700 Subject: [PATCH 02/36] Use SerializeInternal in TaskOrchestrationContext (#968) --- src/DurableTask.Core/TaskOrchestrationContext.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DurableTask.Core/TaskOrchestrationContext.cs b/src/DurableTask.Core/TaskOrchestrationContext.cs index a9831ff47..d56b18de6 100644 --- a/src/DurableTask.Core/TaskOrchestrationContext.cs +++ b/src/DurableTask.Core/TaskOrchestrationContext.cs @@ -97,7 +97,7 @@ public async Task ScheduleTaskInternal(string name, string version, stri params object[] parameters) { int id = this.idCounter++; - string serializedInput = this.MessageDataConverter.Serialize(parameters); + string serializedInput = this.MessageDataConverter.SerializeInternal(parameters); var scheduleTaskTaskAction = new ScheduleTaskOrchestratorAction { Id = id, @@ -152,7 +152,7 @@ async Task CreateSubOrchestrationInstanceCore( IDictionary tags) { int id = this.idCounter++; - string serializedInput = this.MessageDataConverter.Serialize(input); + string serializedInput = this.MessageDataConverter.SerializeInternal(input); string actualInstanceId = instanceId; if (string.IsNullOrWhiteSpace(actualInstanceId)) @@ -196,7 +196,7 @@ public override void SendEvent(OrchestrationInstance orchestrationInstance, stri } int id = this.idCounter++; - string serializedEventData = this.MessageDataConverter.Serialize(eventData); + string serializedEventData = this.MessageDataConverter.SerializeInternal(eventData); var action = new SendEventOrchestratorAction { @@ -221,7 +221,7 @@ public override void ContinueAsNew(string newVersion, object input) void ContinueAsNewCore(string newVersion, object input) { - string serializedInput = this.MessageDataConverter.Serialize(input); + string serializedInput = this.MessageDataConverter.SerializeInternal(input); this.continueAsNew = new OrchestrationCompleteOrchestratorAction { From 20aed320b8f874e3258353aad439be0972a702ad Mon Sep 17 00:00:00 2001 From: Varshitha Bachu Date: Wed, 27 Sep 2023 12:23:43 -0700 Subject: [PATCH 03/36] Update DistributedTraceContext (#969) This PR adds a setter for TraceParent to allow it to get serialized. Without this addition, we weren't able to run Netherite apps with the distributed tracing changes because we were seeing this exception: InvalidDataContractException: No set method for property 'TraceParent' in type 'DurableTask.Core.Tracing.DistributedTraceContext'. It also updates the TraceState setter to include this condition - traceState?.Length <= 513 ? traceState : null instead of adding it in the constructor. --- .../Tracing/DistributedTraceContext.cs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/DurableTask.Core/Tracing/DistributedTraceContext.cs b/src/DurableTask.Core/Tracing/DistributedTraceContext.cs index 44cbf5ea3..b69b1f5f6 100644 --- a/src/DurableTask.Core/Tracing/DistributedTraceContext.cs +++ b/src/DurableTask.Core/Tracing/DistributedTraceContext.cs @@ -23,6 +23,8 @@ namespace DurableTask.Core.Tracing [DataContract] public class DistributedTraceContext { + private string? traceState; + /// /// Initializes a new instance of the class. /// @@ -31,26 +33,35 @@ public class DistributedTraceContext public DistributedTraceContext(string traceParent, string? traceState = null) { this.TraceParent = traceParent; - - // The W3C spec allows vendors to truncate the trace state if it exceeds 513 characters, - // but it has very specific requirements on HOW trace state can be modified, including - // removing whole values, starting with the largest values, and preserving ordering. - // Rather than implementing these complex requirements, we take the lazy path of just - // truncating the whole thing. - this.TraceState = traceState?.Length <= 513 ? traceState : null; + this.traceState = traceState; } /// /// The W3C traceparent data: https://www.w3.org/TR/trace-context/#traceparent-header /// [DataMember] - public string TraceParent { get; } + public string TraceParent { get; set; } /// /// The optional W3C tracestate parameter: https://www.w3.org/TR/trace-context/#tracestate-header /// [DataMember] - public string? TraceState { get; set; } + public string? TraceState + { + get + { + return this.traceState; + } + set + { + // The W3C spec allows vendors to truncate the trace state if it exceeds 513 characters, + // but it has very specific requirements on HOW trace state can be modified, including + // removing whole values, starting with the largest values, and preserving ordering. + // Rather than implementing these complex requirements, we take the lazy path of just + // truncating the whole thing. + this.traceState = value?.Length <= 513 ? value : null; + } + } /// /// The Activity's Id value that is used to restore an Activity during replays. From 3bf00319da6e57620ee3b5c8dd34bc7c078dadf5 Mon Sep 17 00:00:00 2001 From: Varshitha Bachu Date: Wed, 27 Sep 2023 12:57:29 -0700 Subject: [PATCH 04/36] Update ActivitySource in OpenTelemetry sample (#977) --- samples/DistributedTraceSample/OpenTelemetry/Program.cs | 2 +- samples/DistributedTraceSample/OpenTelemetry/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/DistributedTraceSample/OpenTelemetry/Program.cs b/samples/DistributedTraceSample/OpenTelemetry/Program.cs index 3a5688cc2..38781c22b 100644 --- a/samples/DistributedTraceSample/OpenTelemetry/Program.cs +++ b/samples/DistributedTraceSample/OpenTelemetry/Program.cs @@ -29,7 +29,7 @@ static async Task Main(string[] args) { using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample")) - .AddSource("DurableTask") + .AddSource("DurableTask.Core") .AddConsoleExporter() .AddZipkinExporter() .AddAzureMonitorTraceExporter(options => diff --git a/samples/DistributedTraceSample/OpenTelemetry/README.md b/samples/DistributedTraceSample/OpenTelemetry/README.md index fe6af2469..e9b61a2bf 100644 --- a/samples/DistributedTraceSample/OpenTelemetry/README.md +++ b/samples/DistributedTraceSample/OpenTelemetry/README.md @@ -23,12 +23,12 @@ The following package references are added to OpenTelemetrySample.csproj so that ## Tracer Provider -The following startup code is added to create a tracer provider. This code is necessary to add at startup to ensure that the traces are collected and emitted to the correct telemetry exporters. It specifies the service name for the app, which source that the traces should be collected from, and the telemetry exporters where the traces get emitted. "DurableTask" is the service name that will emit the Durable Task related traces. +The following startup code is added to create a tracer provider. This code is necessary to add at startup to ensure that the traces are collected and emitted to the correct telemetry exporters. It specifies the service name for the app, which source that the traces should be collected from, and the telemetry exporters where the traces get emitted. "DurableTask.Core" is the service name that will emit the Durable Task related traces. ``` using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample")) - .AddSource("DurableTask") + .AddSource("DurableTask.Core") .AddConsoleExporter() .AddZipkinExporter() .AddAzureMonitorTraceExporter(options => From bd104e587759fbaa86dcac8692dbbebd543133b3 Mon Sep 17 00:00:00 2001 From: David Justo Date: Mon, 9 Oct 2023 19:15:52 -0700 Subject: [PATCH 05/36] Increase DTFx.Core and DTFx.AS versions to 2.15.0 and 1.15.1 respectively (#987) --- src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj | 2 +- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index 4b3502ff9..025e67da1 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -21,7 +21,7 @@ 1 15 - 0 + 1 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 52d9690a9..a708c99f0 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -17,7 +17,7 @@ 2 - 14 + 15 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) From 12fab22b13ebde557f5274c4912a6898a08881e5 Mon Sep 17 00:00:00 2001 From: Varshitha Bachu Date: Wed, 11 Oct 2023 12:04:23 -0700 Subject: [PATCH 06/36] Update DT.Core and DT.ApplicationInsights versions (#991) DT.Core 2.15.0 --> 2.15.1 DT.ApplicationInsights 0.1.1 --> 0.1.2 --- .../DurableTask.ApplicationInsights.csproj | 2 +- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj index a8b62fb87..ab23d14f3 100644 --- a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj +++ b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj @@ -12,7 +12,7 @@ 0 1 - 1 + 2 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index a708c99f0..bfb1d4df3 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -18,7 +18,7 @@ 2 15 - 0 + 1 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 From 71976c4c116d7448ed9da7d43051b56457cecf18 Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:30:47 -0700 Subject: [PATCH 07/36] Replace STJ package with Newtonsoft (#995) * remove STJ with Newtonsoft * increase DTFx.AS version --- .../DurableTask.AzureStorage.csproj | 4 ++-- src/DurableTask.AzureStorage/Tracking/TagsSerializer.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index 025e67da1..7137e172f 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -20,8 +20,8 @@ 1 - 15 - 1 + 16 + 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 diff --git a/src/DurableTask.AzureStorage/Tracking/TagsSerializer.cs b/src/DurableTask.AzureStorage/Tracking/TagsSerializer.cs index 5fa02a47d..32093266e 100644 --- a/src/DurableTask.AzureStorage/Tracking/TagsSerializer.cs +++ b/src/DurableTask.AzureStorage/Tracking/TagsSerializer.cs @@ -12,16 +12,16 @@ // ---------------------------------------------------------------------------------- using System.Collections.Generic; -using System.Text.Json; +using Newtonsoft.Json; namespace DurableTask.AzureStorage.Tracking { internal static class TagsSerializer { public static string Serialize(IDictionary tags) - => JsonSerializer.Serialize(tags); + => JsonConvert.SerializeObject(tags); public static IDictionary Deserialize(string tags) - => JsonSerializer.Deserialize>(tags); + => JsonConvert.DeserializeObject>(tags); } } From b9b72b8f57be4cdf25e2b2681886297fd66f01c5 Mon Sep 17 00:00:00 2001 From: Sebastian Burckhardt Date: Tue, 17 Oct 2023 15:50:52 -0700 Subject: [PATCH 08/36] [WIP] feature/core-entities (#960) * Bring entity logic into DurableTask.Core (first milestone) (#887) * implementaton of entity mechanics, compatible with existing DF SDK, but without a user-facing entity SDK for DTFx * address PR feedback. * fix usings and namespaces * address PR feedback * address PR feedback (remove NameObjectManager), fix breaking change in TaskHubWorker, fix some comments * address PR feedback (fix CustomExceptionsTest, remove public property) * add #nullable enable to most new classes * address PR feedback * try to fix compiler errors * add a configuration setting that disables separate dispatch by default * address PR feedback * address PR feedback * fix semantic merge conflict. * Revise entity state and status format and access (#955) * update scheduler state and entity status format and helpers * fix mess-up caused by merge conflict * Revise entity message format and external access (#956) * revise how event messages are represented and used * fix merge anomaly. * make current critical section id publicly visible (#958) * remove orchestration tags from entity action (#952) * Rename OperationBatchRequest and OperationBatchResponse (#953) * rename OperationBatch to EntityBatch * fix accidentally commited change from another PR * Revise how entity batches are executed and handle failures (#954) * revise task entity definition * commit change that had been accidentally committed to a different PR. * Apply suggestions from code review Co-authored-by: David Justo * Apply suggestions from code review Co-authored-by: Jacob Viau --------- Co-authored-by: David Justo Co-authored-by: Jacob Viau * revise operation result encoding and add more comments. (#965) * revise entity backend properties and implement entity backend queries (#957) * revise entity backend properties and implement entity backend queries. * Minor revisions to querries and properties, and improved comments. * fix validation of which LockNext methods are being called. * improve comments * fix useage of IEntityOrchestrationService. * revise how to exclude entity results from queries. * address PR feedback * Update versions for ADO feed (#973) * Add no-warn for NU5104 (#974) * revise propagation path for entity parameters (#971) * fix propagation path for entity parameters that need to reach the orchestration executor. * address PR feedback. * Revise entity queries (#981) * rename includeDeletedEntities to includeStatelessEntities and add comment explaining the meaning * add backlogQueueSize and lockedBy to entity metadata * fix bugs in tracking store implementation (#979) * add scheduled start time parameter to the start-new-orchestration operation action. (#980) * Revise serialization of entitymessages (#972) * revise how entity messages are serialized when sent by orchestrators. * address PR feedback (use RawInput) * Rename includeStateless to includeTransient in entity queries (#985) * rename includeStateless to includeTransient * rename variable also * Rev to entities-preview.2 (#986) * fix null reference exception when running on older backends (#989) * Prepare for public preview (#994) --------- Co-authored-by: David Justo Co-authored-by: Jacob Viau --- .../MessageSorterTests.cs | 340 +++++++ .../DurableTask.AzureServiceFabric.csproj | 1 + .../AzureStorageOrchestrationService.cs | 63 +- ...zureStorageOrchestrationServiceSettings.cs | 32 + .../DurableTask.AzureStorage.csproj | 4 +- .../EntityTrackingStoreQueries.cs | 270 ++++++ .../Fnv1aHashHelper.cs | 31 +- .../OrchestrationSessionManager.cs | 28 +- .../Tracking/AzureTableTrackingStore.cs | 2 +- ...chestrationInstanceStatusQueryCondition.cs | 15 +- src/DurableTask.Core/Common/Entities.cs | 11 +- .../Common/Fnv1aHashHelper.cs | 93 ++ src/DurableTask.Core/Common/Utils.cs | 36 +- src/DurableTask.Core/DurableTask.Core.csproj | 6 +- .../Entities/ClientEntityHelpers.cs | 102 ++ .../Entities/EntityBackendProperties.cs | 79 ++ .../Entities/EntityBackendQueries.cs | 199 ++++ src/DurableTask.Core/Entities/EntityId.cs | 106 +++ .../Entities/EntityMessageEvent.cs | 113 +++ .../Entities/EventFormat/EntityMessage.cs | 28 + .../EventFormat/EntityMessageEventNames.cs | 37 + .../Entities/EventFormat/ReleaseMessage.cs | 32 + .../Entities/EventFormat/RequestMessage.cs | 114 +++ .../Entities/EventFormat/ResponseMessage.cs | 51 + .../Entities/IEntityOrchestrationService.cs | 50 + .../OperationFormat/EntityBatchRequest.cs | 41 + .../OperationFormat/EntityBatchResult.cs | 49 + .../OperationFormat/OperationAction.cs | 29 + .../OperationActionConverter.cs | 40 + .../OperationFormat/OperationActionType.cs | 31 + .../OperationFormat/OperationRequest.cs | 41 + .../OperationFormat/OperationResult.cs | 50 + .../SendSignalOperationAction.cs | 49 + .../StartNewOrchestrationOperationAction.cs | 56 ++ .../Entities/OrchestrationEntityContext.cs | 349 +++++++ src/DurableTask.Core/Entities/Serializer.cs | 30 + .../Entities/StateFormat/EntityStatus.cs | 58 ++ .../Entities/StateFormat/MessageSorter.cs | 284 ++++++ .../Entities/StateFormat/SchedulerState.cs | 115 +++ src/DurableTask.Core/Entities/TaskEntity.cs | 30 + .../TaskOrchestrationEntityParameters.cs | 48 + .../Exceptions/EntitySchedulerException.cs | 61 ++ src/DurableTask.Core/FailureDetails.cs | 2 +- src/DurableTask.Core/Logging/EventIds.cs | 4 + src/DurableTask.Core/Logging/LogEvents.cs | 219 +++++ src/DurableTask.Core/Logging/LogHelper.cs | 54 +- .../Logging/StructuredEventSource.cs | 96 ++ src/DurableTask.Core/OrchestrationContext.cs | 6 + .../Query/OrchestrationQuery.cs | 6 + src/DurableTask.Core/TaskEntityDispatcher.cs | 883 ++++++++++++++++++ src/DurableTask.Core/TaskHubClient.cs | 3 + src/DurableTask.Core/TaskHubWorker.cs | 108 ++- .../TaskOrchestrationContext.cs | 13 +- .../TaskOrchestrationDispatcher.cs | 73 +- .../TaskOrchestrationExecutor.cs | 22 +- 55 files changed, 4632 insertions(+), 61 deletions(-) create mode 100644 Test/DurableTask.Core.Tests/MessageSorterTests.cs create mode 100644 src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs create mode 100644 src/DurableTask.Core/Common/Fnv1aHashHelper.cs create mode 100644 src/DurableTask.Core/Entities/ClientEntityHelpers.cs create mode 100644 src/DurableTask.Core/Entities/EntityBackendProperties.cs create mode 100644 src/DurableTask.Core/Entities/EntityBackendQueries.cs create mode 100644 src/DurableTask.Core/Entities/EntityId.cs create mode 100644 src/DurableTask.Core/Entities/EntityMessageEvent.cs create mode 100644 src/DurableTask.Core/Entities/EventFormat/EntityMessage.cs create mode 100644 src/DurableTask.Core/Entities/EventFormat/EntityMessageEventNames.cs create mode 100644 src/DurableTask.Core/Entities/EventFormat/ReleaseMessage.cs create mode 100644 src/DurableTask.Core/Entities/EventFormat/RequestMessage.cs create mode 100644 src/DurableTask.Core/Entities/EventFormat/ResponseMessage.cs create mode 100644 src/DurableTask.Core/Entities/IEntityOrchestrationService.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/EntityBatchRequest.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/EntityBatchResult.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/OperationAction.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/OperationActionConverter.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/OperationActionType.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/OperationRequest.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/OperationResult.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/SendSignalOperationAction.cs create mode 100644 src/DurableTask.Core/Entities/OperationFormat/StartNewOrchestrationOperationAction.cs create mode 100644 src/DurableTask.Core/Entities/OrchestrationEntityContext.cs create mode 100644 src/DurableTask.Core/Entities/Serializer.cs create mode 100644 src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs create mode 100644 src/DurableTask.Core/Entities/StateFormat/MessageSorter.cs create mode 100644 src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs create mode 100644 src/DurableTask.Core/Entities/TaskEntity.cs create mode 100644 src/DurableTask.Core/Entities/TaskOrchestrationEntityParameters.cs create mode 100644 src/DurableTask.Core/Exceptions/EntitySchedulerException.cs create mode 100644 src/DurableTask.Core/TaskEntityDispatcher.cs diff --git a/Test/DurableTask.Core.Tests/MessageSorterTests.cs b/Test/DurableTask.Core.Tests/MessageSorterTests.cs new file mode 100644 index 000000000..13bb90170 --- /dev/null +++ b/Test/DurableTask.Core.Tests/MessageSorterTests.cs @@ -0,0 +1,340 @@ +// --------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// --------------------------------------------------------------- + +namespace DurableTask.Core.Tests +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Threading.Tasks; + using DurableTask.Core.Entities; + using DurableTask.Core.Entities.EventFormat; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [TestClass] + public class MessageSorterTests + { + private static readonly TimeSpan ReorderWindow = TimeSpan.FromMinutes(30); + + [TestMethod] + public void SimpleInOrder() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + + var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow); + var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow); + var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow); + + List batch; + MessageSorter receiverSorter = new MessageSorter(); + + // delivering the sequence in order produces 1 message each time + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("1"); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("2"); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("3"); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + [TestMethod] + public void WackySystemClock() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + + // simulate system clock that goes backwards - mechanism should still guarantee monotonicitty + var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow); + var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow - TimeSpan.FromSeconds(1)); + var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow - TimeSpan.FromSeconds(2)); + + List batch; + MessageSorter receiverSorter = new MessageSorter(); + + // delivering the sequence in order produces 1 message each time + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("1"); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("2"); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("3"); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + [TestMethod] + public void DelayedElement() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + + var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow); + var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow); + var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow); + + List batch; + MessageSorter receiverSorter; + + // delivering first message last delays all messages until getting the first one + receiverSorter = new MessageSorter(); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Collection( + batch, + first => first.Input.Equals("1"), + second => second.Input.Equals("2"), + third => third.Input.Equals("3")); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + [TestMethod] + public void NoFilteringOrSortingPastReorderWindow() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + var now = DateTime.UtcNow; + + // last message is sent after an interval exceeding the reorder window + var message1 = Send(senderId, receiverId, "1", senderSorter, now); + var message2 = Send(senderId, receiverId, "2", senderSorter, now + TimeSpan.FromTicks(1)); + var message3 = Send(senderId, receiverId, "3", senderSorter, now + TimeSpan.FromTicks(2) + ReorderWindow); + + List batch; + MessageSorter receiverSorter = new MessageSorter(); + + // delivering the sequence in order produces 1 message each time + receiverSorter = new MessageSorter(); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("1"); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("2"); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("3"); + + // duplicates are not filtered or sorted, but simply passed through, because we are past the reorder window + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("2"); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("1"); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + [TestMethod] + public void DuplicatedElements() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + + var message1 = Send(senderId, receiverId, "1", senderSorter, DateTime.UtcNow); + var message2 = Send(senderId, receiverId, "2", senderSorter, DateTime.UtcNow); + var message3 = Send(senderId, receiverId, "3", senderSorter, DateTime.UtcNow); + + List batch; + MessageSorter receiverSorter; + + // delivering first message last delays all messages until getting the first one + receiverSorter = new MessageSorter(); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Collection( + batch, + first => first.Input.Equals("1"), + second => second.Input.Equals("2")); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Single(batch).Input.Equals("3"); + batch = receiverSorter.ReceiveInOrder(message3, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message2, ReorderWindow).ToList(); + Assert.That.Empty(batch); + batch = receiverSorter.ReceiveInOrder(message1, ReorderWindow).ToList(); + Assert.That.Empty(batch); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + [TestMethod] + public void RandomShuffleAndDuplication() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + var receiverSorter = new MessageSorter(); + + var messageCount = 100; + var duplicateCount = 100; + + // create a ordered sequence of messages + var messages = new List(); + for (int i = 0; i < messageCount; i++) + { + messages.Add(Send(senderId, receiverId, i.ToString(), senderSorter, DateTime.UtcNow)); + } + + // add some random duplicates + var random = new Random(0); + for (int i = 0; i < duplicateCount; i++) + { + messages.Add(messages[random.Next(messageCount)]); + } + + // shuffle the messages + Shuffle(messages, random); + + // deliver all the messages + var deliveredMessages = new List(); + + foreach (var msg in messages) + { + foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(msg, ReorderWindow)) + { + deliveredMessages.Add(deliveredMessage); + } + } + + // check that the delivered messages are the original sequence + Assert.AreEqual(messageCount, deliveredMessages.Count()); + for (int i = 0; i < messageCount; i++) + { + Assert.AreEqual(i.ToString(), deliveredMessages[i].Input); + } + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + /// + /// Tests that if messages get reordered beyond the supported reorder window, + /// we still deliver them all but they may now be out of order. + /// + [TestMethod] + public void RandomCollection() + { + var senderId = "A"; + var receiverId = "B"; + + var senderSorter = new MessageSorter(); + var receiverSorter = new MessageSorter(); + + var messageCount = 100; + + var random = new Random(0); + var now = DateTime.UtcNow; + + // create a ordered sequence of messages + var messages = new List(); + for (int i = 0; i < messageCount; i++) + { + messages.Add(Send(senderId, receiverId, i.ToString(), senderSorter, now + TimeSpan.FromSeconds(random.Next(5)), TimeSpan.FromSeconds(10))); + } + + // shuffle the messages + Shuffle(messages, random); + + // add a final message + messages.Add(Send(senderId, receiverId, (messageCount + 1).ToString(), senderSorter, now + TimeSpan.FromSeconds(1000), TimeSpan.FromSeconds(10))); + + // deliver all the messages + var deliveredMessages = new List(); + + for (int i = 0; i < messageCount; i++) + { + foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(messages[i], TimeSpan.FromSeconds(10))) + { + deliveredMessages.Add(deliveredMessage); + } + + Assert.AreEqual(i + 1, deliveredMessages.Count + receiverSorter.NumberBufferedRequests); + } + + // receive the final messages + foreach (var deliveredMessage in receiverSorter.ReceiveInOrder(messages[messageCount], TimeSpan.FromSeconds(10))) + { + deliveredMessages.Add(deliveredMessage); + } + + // check that all messages were delivered + Assert.AreEqual(messageCount + 1, deliveredMessages.Count()); + + Assert.AreEqual(0, receiverSorter.NumberBufferedRequests); + } + + private static RequestMessage Send(string senderId, string receiverId, string input, MessageSorter sorter, DateTime now, TimeSpan? reorderWindow = null) + { + var msg = new RequestMessage() + { + Id = Guid.NewGuid(), + ParentInstanceId = senderId, + Input = input, + }; + sorter.LabelOutgoingMessage(msg, receiverId, now, reorderWindow.HasValue ? reorderWindow.Value : ReorderWindow); + return msg; + } + + private static void Shuffle(IList list, Random random) + { + int n = list.Count; + while (n > 1) + { + n--; + int k = random.Next(n + 1); + T value = list[k]; + list[k] = list[n]; + list[n] = value; + } + } + } + + internal static class AssertExtensions + { + public static void Empty(this Assert assert, IEnumerable collection) + { + Assert.AreEqual(0, collection.Count()); + } + + public static T Single(this Assert assert, IEnumerable collection) + { + var e = collection.GetEnumerator(); + Assert.IsTrue(e.MoveNext()); + T element = e.Current; + Assert.IsFalse(e.MoveNext()); + return element; + } + + public static void Collection(this Assert assert, IEnumerable collection, params Action[] elementInspectors) + { + var list = collection.ToList(); + Assert.AreEqual(elementInspectors.Length, list.Count); + for(int i = 0; i < elementInspectors.Length; i++) + { + elementInspectors[i](list[i]); + } + } + } +} \ No newline at end of file diff --git a/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj b/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj index 0a44c9b8a..6af41aa98 100644 --- a/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj +++ b/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj @@ -13,6 +13,7 @@ Orchestration message and runtime state is stored in Azure Service Fabric reliable collections. Microsoft AnyCPU;x64 + $(NoWarn);NU5104 diff --git a/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs b/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs index 8967e30cd..9f5d15047 100644 --- a/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs +++ b/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs @@ -27,6 +27,7 @@ namespace DurableTask.AzureStorage using DurableTask.AzureStorage.Storage; using DurableTask.AzureStorage.Tracking; using DurableTask.Core; + using DurableTask.Core.Entities; using DurableTask.Core.Exceptions; using DurableTask.Core.History; using DurableTask.Core.Query; @@ -41,7 +42,8 @@ public sealed class AzureStorageOrchestrationService : IOrchestrationServiceClient, IDisposable, IOrchestrationServiceQueryClient, - IOrchestrationServicePurgeClient + IOrchestrationServicePurgeClient, + IEntityOrchestrationService { static readonly HistoryEvent[] EmptyHistoryEventList = new HistoryEvent[0]; @@ -277,6 +279,51 @@ public BehaviorOnContinueAsNew EventBehaviourForContinueAsNew /// public int TaskOrchestrationDispatcherCount { get; } = 1; + #region IEntityOrchestrationService + + EntityBackendProperties IEntityOrchestrationService.EntityBackendProperties + => new EntityBackendProperties() + { + EntityMessageReorderWindow = TimeSpan.FromMinutes(this.settings.EntityMessageReorderWindowInMinutes), + MaxEntityOperationBatchSize = this.settings.MaxEntityOperationBatchSize, + MaxConcurrentTaskEntityWorkItems = this.settings.MaxConcurrentTaskEntityWorkItems, + SupportsImplicitEntityDeletion = false, // not supported by this backend + MaximumSignalDelayTime = TimeSpan.FromDays(6), + UseSeparateQueueForEntityWorkItems = this.settings.UseSeparateQueueForEntityWorkItems, + }; + + EntityBackendQueries IEntityOrchestrationService.EntityBackendQueries + => new EntityTrackingStoreQueries( + this.messageManager, + this.trackingStore, + this.EnsureTaskHubAsync, + ((IEntityOrchestrationService)this).EntityBackendProperties, + this.SendTaskOrchestrationMessageAsync); + + Task IEntityOrchestrationService.LockNextOrchestrationWorkItemAsync( + TimeSpan receiveTimeout, + CancellationToken cancellationToken) + { + if (!this.settings.UseSeparateQueueForEntityWorkItems) + { + throw new InvalidOperationException("Internal configuration is inconsistent. Backend is using single queue for orchestration/entity dispatch, but frontend is pulling from individual queues."); + } + return this.LockNextTaskOrchestrationWorkItemAsync(false, cancellationToken); + } + + Task IEntityOrchestrationService.LockNextEntityWorkItemAsync( + TimeSpan receiveTimeout, + CancellationToken cancellationToken) + { + if (!this.settings.UseSeparateQueueForEntityWorkItems) + { + throw new InvalidOperationException("Internal configuration is inconsistent. Backend is using single queue for orchestration/entity dispatch, but frontend is pulling from individual queues."); + } + return this.LockNextTaskOrchestrationWorkItemAsync(entitiesOnly: true, cancellationToken); + } + + #endregion + #region Management Operations (Create/Delete/Start/Stop) /// /// Deletes and creates the neccesary Azure Storage resources for the orchestration service. @@ -625,9 +672,18 @@ static TaskHubInfo GetTaskHubInfo(string taskHub, int partitionCount) #region Orchestration Work Item Methods /// - public async Task LockNextTaskOrchestrationWorkItemAsync( + public Task LockNextTaskOrchestrationWorkItemAsync( TimeSpan receiveTimeout, CancellationToken cancellationToken) + { + if (this.settings.UseSeparateQueueForEntityWorkItems) + { + throw new InvalidOperationException("Internal configuration is inconsistent. Backend is using separate queues for orchestration/entity dispatch, but frontend is pulling from single queue."); + } + return LockNextTaskOrchestrationWorkItemAsync(entitiesOnly: false, cancellationToken); + } + + async Task LockNextTaskOrchestrationWorkItemAsync(bool entitiesOnly, CancellationToken cancellationToken) { Guid traceActivityId = StartNewLogicalTraceScope(useExisting: true); @@ -641,7 +697,7 @@ public async Task LockNextTaskOrchestrationWorkItemAs try { // This call will block until the next session is ready - session = await this.orchestrationSessionManager.GetNextSessionAsync(linkedCts.Token); + session = await this.orchestrationSessionManager.GetNextSessionAsync(entitiesOnly, linkedCts.Token); if (session == null) { return null; @@ -2047,6 +2103,7 @@ private static OrchestrationInstanceStatusQueryCondition ToAzureStorageCondition TaskHubNames = condition.TaskHubNames, InstanceIdPrefix = condition.InstanceIdPrefix, FetchInput = condition.FetchInputsAndOutputs, + ExcludeEntities = condition.ExcludeEntities, }; } diff --git a/src/DurableTask.AzureStorage/AzureStorageOrchestrationServiceSettings.cs b/src/DurableTask.AzureStorage/AzureStorageOrchestrationServiceSettings.cs index 8d432b151..609a8b35d 100644 --- a/src/DurableTask.AzureStorage/AzureStorageOrchestrationServiceSettings.cs +++ b/src/DurableTask.AzureStorage/AzureStorageOrchestrationServiceSettings.cs @@ -111,6 +111,12 @@ public class AzureStorageOrchestrationServiceSettings /// public int MaxConcurrentTaskOrchestrationWorkItems { get; set; } = 100; + /// + /// Gets or sets the maximum number of entity operation batches that can be processed concurrently on a single node. + /// The default value is 100. + /// + public int MaxConcurrentTaskEntityWorkItems { get; set; } = 100; + /// /// Gets or sets the maximum number of concurrent storage operations that can be executed in the context /// of a single orchestration instance. @@ -286,5 +292,31 @@ internal LogHelper Logger return this.logHelper; } } + + /// + /// Gets or sets the limit on the number of entity operations that should be processed as a single batch. + /// A null value indicates that no particular limit should be enforced. + /// + /// + /// Limiting the batch size can help to avoid timeouts in execution environments that impose time limitations on work items. + /// If set to 1, batching is disabled, and each operation executes as a separate work item. + /// + /// + /// A positive integer, or null. + /// + public int? MaxEntityOperationBatchSize { get; set; } = null; + + /// + /// Gets or sets the time window within which entity messages get deduplicated and reordered. + /// If set to zero, there is no sorting or deduplication, and all messages are just passed through. + /// + public int EntityMessageReorderWindowInMinutes { get; set; } = 30; + + /// + /// Whether to use separate work item queues for entities and orchestrators. + /// This defaults to false, to avoid issues when using this provider from code that does not support separate dispatch. + /// Consumers that require separate dispatch (such as the new out-of-proc v2 SDKs) must set this to true. + /// + public bool UseSeparateQueueForEntityWorkItems { get; set; } = false; } } diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index 7137e172f..1025cf027 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -20,7 +20,7 @@ 1 - 16 + 17 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) @@ -30,7 +30,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix) + $(VersionPrefix)-preview.1 diff --git a/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs new file mode 100644 index 000000000..dead69db6 --- /dev/null +++ b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs @@ -0,0 +1,270 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ----------------------------------------------------------------------------------using System; +#nullable enable +namespace DurableTask.AzureStorage +{ + using System; + using System.Collections.Generic; + using System.Diagnostics; + using System.Linq; + using System.Runtime.Serialization.Json; + using System.Text; + using System.Threading; + using System.Threading.Tasks; + using DurableTask.AzureStorage.Tracking; + using DurableTask.Core; + using DurableTask.Core.Entities; + + class EntityTrackingStoreQueries : EntityBackendQueries + { + readonly MessageManager messageManager; + readonly ITrackingStore trackingStore; + readonly Func ensureTaskHub; + readonly EntityBackendProperties properties; + readonly Func sendEvent; + + static TimeSpan timeLimitForCleanEntityStorageLoop = TimeSpan.FromSeconds(5); + + public EntityTrackingStoreQueries( + MessageManager messageManager, + ITrackingStore trackingStore, + Func ensureTaskHub, + EntityBackendProperties properties, + Func sendEvent) + { + this.messageManager = messageManager; + this.trackingStore = trackingStore; + this.ensureTaskHub = ensureTaskHub; + this.properties = properties; + this.sendEvent = sendEvent; + } + + public async override Task GetEntityAsync( + EntityId id, + bool includeState = false, + bool includeStateless = false, + CancellationToken cancellation = default(CancellationToken)) + { + await this.ensureTaskHub(); + OrchestrationState? state = (await this.trackingStore.GetStateAsync(id.ToString(), allExecutions: false, fetchInput: includeState)).FirstOrDefault(); + return await this.GetEntityMetadataAsync(state, includeStateless, includeState); + } + + public async override Task QueryEntitiesAsync(EntityQuery filter, CancellationToken cancellation) + { + var condition = new OrchestrationInstanceStatusQueryCondition() + { + InstanceId = null, + InstanceIdPrefix = string.IsNullOrEmpty(filter.InstanceIdStartsWith) ? "@" : filter.InstanceIdStartsWith, + CreatedTimeFrom = filter.LastModifiedFrom ?? default(DateTime), + CreatedTimeTo = filter.LastModifiedTo ?? default(DateTime), + FetchInput = filter.IncludeState, + FetchOutput = false, + ExcludeEntities = false, + }; + + if (condition.InstanceIdPrefix![0] != '@') + { + condition.InstanceIdPrefix = $"@{condition.InstanceIdPrefix}"; + } + + await this.ensureTaskHub(); + + List entityResult; + string? continuationToken = filter.ContinuationToken; + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + do + { + DurableStatusQueryResult result = await this.trackingStore.GetStateAsync(condition, filter.PageSize ?? 100, continuationToken, cancellation); + entityResult = await ConvertResultsAsync(result.OrchestrationState); + continuationToken = result.ContinuationToken; + } + while ( // continue query right away if the page is completely empty, but never in excess of 100ms + continuationToken != null + && entityResult.Count == 0 + && stopwatch.ElapsedMilliseconds <= 100); + + return new EntityQueryResult() + { + Results = entityResult, + ContinuationToken = continuationToken, + }; + + async ValueTask> ConvertResultsAsync(IEnumerable states) + { + entityResult = new List(); + foreach (OrchestrationState entry in states) + { + EntityMetadata? entityMetadata = await this.GetEntityMetadataAsync(entry, filter.IncludeTransient, filter.IncludeState); + if (entityMetadata.HasValue) + { + entityResult.Add(entityMetadata.Value); + } + } + return entityResult; + } + } + + public async override Task CleanEntityStorageAsync(CleanEntityStorageRequest request = default(CleanEntityStorageRequest), CancellationToken cancellation = default(CancellationToken)) + { + DateTime now = DateTime.UtcNow; + string? continuationToken = request.ContinuationToken; + int emptyEntitiesRemoved = 0; + int orphanedLocksReleased = 0; + var stopwatch = Stopwatch.StartNew(); + + var condition = new OrchestrationInstanceStatusQueryCondition() + { + InstanceIdPrefix = "@", + FetchInput = false, + FetchOutput = false, + ExcludeEntities = false, + }; + + await this.ensureTaskHub(); + + // list all entities (without fetching the input) and for each one that requires action, + // perform that action. Waits for all actions to finish after each page. + do + { + DurableStatusQueryResult page = await this.trackingStore.GetStateAsync(condition, 100, continuationToken, cancellation); + + var tasks = new List(); + foreach (OrchestrationState state in page.OrchestrationState) + { + EntityStatus? status = ClientEntityHelpers.GetEntityStatus(state.Status); + if (status != null) + { + if (request.ReleaseOrphanedLocks && status.LockedBy != null) + { + tasks.Add(CheckForOrphanedLockAndFixIt(state, status.LockedBy)); + } + + if (request.RemoveEmptyEntities) + { + bool isEmptyEntity = !status.EntityExists && status.LockedBy == null && status.BacklogQueueSize == 0; + bool safeToRemoveWithoutBreakingMessageSorterLogic = + (now - state.LastUpdatedTime > this.properties.EntityMessageReorderWindow); + if (isEmptyEntity && safeToRemoveWithoutBreakingMessageSorterLogic) + { + tasks.Add(DeleteIdleOrchestrationEntity(state)); + } + } + } + } + + async Task DeleteIdleOrchestrationEntity(OrchestrationState state) + { + PurgeHistoryResult result = await this.trackingStore.PurgeInstanceHistoryAsync(state.OrchestrationInstance.InstanceId); + Interlocked.Add(ref emptyEntitiesRemoved, result.InstancesDeleted); + } + + async Task CheckForOrphanedLockAndFixIt(OrchestrationState state, string lockOwner) + { + OrchestrationState? ownerState + = (await this.trackingStore.GetStateAsync(lockOwner, allExecutions: false, fetchInput: false)).FirstOrDefault(); + + bool OrchestrationIsRunning(OrchestrationStatus? status) + => status != null && (status == OrchestrationStatus.Running || status == OrchestrationStatus.Suspended); + + if (! OrchestrationIsRunning(ownerState?.OrchestrationStatus)) + { + // the owner is not a running orchestration. Send a lock release. + EntityMessageEvent eventToSend = ClientEntityHelpers.EmitUnlockForOrphanedLock(state.OrchestrationInstance, lockOwner); + await this.sendEvent(eventToSend.AsTaskMessage()); + Interlocked.Increment(ref orphanedLocksReleased); + } + } + + await Task.WhenAll(tasks); + } + while (continuationToken != null & stopwatch.Elapsed <= timeLimitForCleanEntityStorageLoop); + + return new CleanEntityStorageResult() + { + EmptyEntitiesRemoved = emptyEntitiesRemoved, + OrphanedLocksReleased = orphanedLocksReleased, + ContinuationToken = continuationToken, + }; + } + + async ValueTask GetEntityMetadataAsync(OrchestrationState? state, bool includeTransient, bool includeState) + { + if (state == null) + { + return null; + } + + if (!includeState) + { + if (!includeTransient) + { + // it is possible that this entity was logically deleted even though its orchestration was not purged yet. + // we can check this efficiently (i.e. without deserializing anything) by looking at just the custom status + if (!EntityStatus.TestEntityExists(state.Status)) + { + return null; + } + } + + EntityStatus? status = ClientEntityHelpers.GetEntityStatus(state.Status); + + return new EntityMetadata() + { + EntityId = EntityId.FromString(state.OrchestrationInstance.InstanceId), + LastModifiedTime = state.CreatedTime, + BacklogQueueSize = status?.BacklogQueueSize ?? 0, + LockedBy = status?.LockedBy, + SerializedState = null, // we were instructed to not include the state + }; + } + else + { + // first, retrieve the entity scheduler state (= input of the orchestration state), possibly from blob storage. + string serializedSchedulerState; + if (MessageManager.TryGetLargeMessageReference(state.Input, out Uri blobUrl)) + { + serializedSchedulerState = await this.messageManager.DownloadAndDecompressAsBytesAsync(blobUrl); + } + else + { + serializedSchedulerState = state.Input; + } + + // next, extract the entity state from the scheduler state + string? serializedEntityState = ClientEntityHelpers.GetEntityState(serializedSchedulerState); + + // return the result to the user + if (!includeTransient && serializedEntityState == null) + { + return null; + } + else + { + EntityStatus? status = ClientEntityHelpers.GetEntityStatus(state.Status); + + return new EntityMetadata() + { + EntityId = EntityId.FromString(state.OrchestrationInstance.InstanceId), + LastModifiedTime = state.CreatedTime, + BacklogQueueSize = status?.BacklogQueueSize ?? 0, + LockedBy = status?.LockedBy, + SerializedState = serializedEntityState, + }; + } + } + } + } +} diff --git a/src/DurableTask.AzureStorage/Fnv1aHashHelper.cs b/src/DurableTask.AzureStorage/Fnv1aHashHelper.cs index fbff51089..2bea574ca 100644 --- a/src/DurableTask.AzureStorage/Fnv1aHashHelper.cs +++ b/src/DurableTask.AzureStorage/Fnv1aHashHelper.cs @@ -22,32 +22,61 @@ namespace DurableTask.AzureStorage /// See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function. /// Tested with production data and random guids. The result was good distribution. /// - static class Fnv1aHashHelper + internal static class Fnv1aHashHelper { const uint FnvPrime = unchecked(16777619); const uint FnvOffsetBasis = unchecked(2166136261); + /// + /// Compute a hash for a given string. + /// + /// The string to hash. + /// a four-byte hash public static uint ComputeHash(string value) { return ComputeHash(value, encoding: null); } + /// + /// Compute a hash for a given string and encoding. + /// + /// The string to hash. + /// The encoding. + /// a four-byte hash public static uint ComputeHash(string value, Encoding encoding) { return ComputeHash(value, encoding, hash: FnvOffsetBasis); } + /// + /// Compute a hash for a given string, encoding, and hash modifier. + /// + /// The string to hash. + /// The encoding. + /// The modifier hash. + /// a four-byte hash public static uint ComputeHash(string value, Encoding encoding, uint hash) { byte[] bytes = (encoding ?? Encoding.UTF8).GetBytes(value); return ComputeHash(bytes, hash); } + /// + /// Compute a hash for the given byte array. + /// + /// The byte array to hash. + /// a four-byte hash public static uint ComputeHash(byte[] array) { return ComputeHash(array, hash: FnvOffsetBasis); } + /// + /// Compute a hash for the given byte array. + /// + /// The byte array to hash. + /// The modifier hash. + /// a four-byte hash public static uint ComputeHash(byte[] array, uint hash) { for (var i = 0; i < array.Length; i++) diff --git a/src/DurableTask.AzureStorage/OrchestrationSessionManager.cs b/src/DurableTask.AzureStorage/OrchestrationSessionManager.cs index 6d990c63d..2e2b7282d 100644 --- a/src/DurableTask.AzureStorage/OrchestrationSessionManager.cs +++ b/src/DurableTask.AzureStorage/OrchestrationSessionManager.cs @@ -32,7 +32,8 @@ class OrchestrationSessionManager : IDisposable readonly Dictionary activeOrchestrationSessions = new Dictionary(StringComparer.OrdinalIgnoreCase); readonly ConcurrentDictionary ownedControlQueues = new ConcurrentDictionary(); readonly LinkedList pendingOrchestrationMessageBatches = new LinkedList(); - readonly AsyncQueue> readyForProcessingQueue = new AsyncQueue>(); + readonly AsyncQueue> orchestrationsReadyForProcessingQueue = new AsyncQueue>(); + readonly AsyncQueue> entitiesReadyForProcessingQueue = new AsyncQueue>(); readonly object messageAndSessionLock = new object(); readonly string storageAccountName; @@ -520,7 +521,15 @@ async Task ScheduleOrchestrationStatePrefetch( batch.TrackingStoreContext = history.TrackingStoreContext; } - this.readyForProcessingQueue.Enqueue(node); + if (this.settings.UseSeparateQueueForEntityWorkItems + && DurableTask.Core.Common.Entities.IsEntityInstance(batch.OrchestrationInstanceId)) + { + this.entitiesReadyForProcessingQueue.Enqueue(node); + } + else + { + this.orchestrationsReadyForProcessingQueue.Enqueue(node); + } } catch (OperationCanceledException) { @@ -544,14 +553,16 @@ async Task ScheduleOrchestrationStatePrefetch( } } - public async Task GetNextSessionAsync(CancellationToken cancellationToken) + public async Task GetNextSessionAsync(bool entitiesOnly, CancellationToken cancellationToken) { + var readyForProcessingQueue = entitiesOnly? this.entitiesReadyForProcessingQueue : this.orchestrationsReadyForProcessingQueue; + while (!cancellationToken.IsCancellationRequested) { // This call will block until: // 1) a batch of messages has been received for a particular instance and // 2) the history for that instance has been fetched - LinkedListNode node = await this.readyForProcessingQueue.DequeueAsync(cancellationToken); + LinkedListNode node = await readyForProcessingQueue.DequeueAsync(cancellationToken); lock (this.messageAndSessionLock) { @@ -597,7 +608,7 @@ async Task ScheduleOrchestrationStatePrefetch( // A message arrived for a different generation of an existing orchestration instance. // Put it back into the ready queue so that it can be processed once the current generation // is done executing. - if (this.readyForProcessingQueue.Count == 0) + if (readyForProcessingQueue.Count == 0) { // To avoid a tight dequeue loop, delay for a bit before putting this node back into the queue. // This is only necessary when the queue is empty. The main dequeue thread must not be blocked @@ -607,14 +618,14 @@ async Task ScheduleOrchestrationStatePrefetch( lock (this.messageAndSessionLock) { this.pendingOrchestrationMessageBatches.AddLast(node); - this.readyForProcessingQueue.Enqueue(node); + readyForProcessingQueue.Enqueue(node); } }); } else { this.pendingOrchestrationMessageBatches.AddLast(node); - this.readyForProcessingQueue.Enqueue(node); + readyForProcessingQueue.Enqueue(node); } } } @@ -676,7 +687,8 @@ public void GetStats( public virtual void Dispose() { this.fetchRuntimeStateQueue.Dispose(); - this.readyForProcessingQueue.Dispose(); + this.orchestrationsReadyForProcessingQueue.Dispose(); + this.entitiesReadyForProcessingQueue.Dispose(); } class PendingMessageBatch diff --git a/src/DurableTask.AzureStorage/Tracking/AzureTableTrackingStore.cs b/src/DurableTask.AzureStorage/Tracking/AzureTableTrackingStore.cs index dc73d5bf3..15469c1b0 100644 --- a/src/DurableTask.AzureStorage/Tracking/AzureTableTrackingStore.cs +++ b/src/DurableTask.AzureStorage/Tracking/AzureTableTrackingStore.cs @@ -430,7 +430,7 @@ public override async Task> GetStateAsync(string insta } /// - async Task FetchInstanceStatusInternalAsync(string instanceId, bool fetchInput) + internal async Task FetchInstanceStatusInternalAsync(string instanceId, bool fetchInput) { if (instanceId == null) { diff --git a/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs b/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs index ae2ff74b9..37cd5d3cb 100644 --- a/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs +++ b/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs @@ -68,6 +68,11 @@ public class OrchestrationInstanceStatusQueryCondition /// public bool FetchOutput { get; set; } = true; + /// + /// Whether to exclude entities from the results. + /// + public bool ExcludeEntities { get; set; } = false; + /// /// Get the TableQuery object /// @@ -82,7 +87,8 @@ public TableQuery ToTableQuery() this.CreatedTimeTo == default(DateTime) && this.TaskHubNames == null && this.InstanceIdPrefix == null && - this.InstanceId == null)) + this.InstanceId == null && + !this.ExcludeEntities)) { if (!this.FetchInput || !this.FetchOutput) { @@ -159,6 +165,13 @@ string GetConditions() TableOperators.And, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThan, greaterThanPrefix))); } + else if (this.ExcludeEntities) + { + conditions.Add(TableQuery.CombineFilters( + TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThan, "@"), + TableOperators.Or, + TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, "A"))); + } if (this.InstanceId != null) { diff --git a/src/DurableTask.Core/Common/Entities.cs b/src/DurableTask.Core/Common/Entities.cs index 2484153de..dc3ba2434 100644 --- a/src/DurableTask.Core/Common/Entities.cs +++ b/src/DurableTask.Core/Common/Entities.cs @@ -10,14 +10,13 @@ // See the License for the specific language governing permissions and // limitations under the License. // ---------------------------------------------------------------------------------- - -using DurableTask.Core.History; -using System; -using System.Collections.Generic; -using System.Text; - +#nullable enable namespace DurableTask.Core.Common { + using DurableTask.Core.History; + using System; + using System.Collections.Generic; + /// /// Helpers for dealing with special naming conventions around auto-started orchestrations (entities) /// diff --git a/src/DurableTask.Core/Common/Fnv1aHashHelper.cs b/src/DurableTask.Core/Common/Fnv1aHashHelper.cs new file mode 100644 index 000000000..6184d6fdd --- /dev/null +++ b/src/DurableTask.Core/Common/Fnv1aHashHelper.cs @@ -0,0 +1,93 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +namespace DurableTask.Core.Common +{ + using System.Text; + + /// + /// Fast, non-cryptographic hash function helper. + /// + /// + /// See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function. + /// Tested with production data and random guids. The result was good distribution. + /// + internal static class Fnv1aHashHelper + { + const uint FnvPrime = unchecked(16777619); + const uint FnvOffsetBasis = unchecked(2166136261); + + /// + /// Compute a hash for a given string. + /// + /// The string to hash. + /// a four-byte hash + public static uint ComputeHash(string value) + { + return ComputeHash(value, encoding: null); + } + + /// + /// Compute a hash for a given string and encoding. + /// + /// The string to hash. + /// The encoding. + /// a four-byte hash + public static uint ComputeHash(string value, Encoding encoding) + { + return ComputeHash(value, encoding, hash: FnvOffsetBasis); + } + + /// + /// Compute a hash for a given string, encoding, and hash modifier. + /// + /// The string to hash. + /// The encoding. + /// The modifier hash. + /// a four-byte hash + public static uint ComputeHash(string value, Encoding encoding, uint hash) + { + byte[] bytes = (encoding ?? Encoding.UTF8).GetBytes(value); + return ComputeHash(bytes, hash); + } + + /// + /// Compute a hash for the given byte array. + /// + /// The byte array to hash. + /// a four-byte hash + public static uint ComputeHash(byte[] array) + { + return ComputeHash(array, hash: FnvOffsetBasis); + } + + /// + /// Compute a hash for the given byte array. + /// + /// The byte array to hash. + /// The modifier hash. + /// a four-byte hash + public static uint ComputeHash(byte[] array, uint hash) + { + for (var i = 0; i < array.Length; i++) + { + unchecked + { + hash ^= array[i]; + hash *= FnvPrime; + } + } + + return hash; + } + } +} diff --git a/src/DurableTask.Core/Common/Utils.cs b/src/DurableTask.Core/Common/Utils.cs index 0d151cc15..ef3927b8e 100644 --- a/src/DurableTask.Core/Common/Utils.cs +++ b/src/DurableTask.Core/Common/Utils.cs @@ -152,7 +152,7 @@ public static string SerializeToJson(JsonSerializer serializer, object payload) /// The default value comes from the WEBSITE_SITE_NAME environment variable, which is defined /// in Azure App Service. Other environments can use DTFX_APP_NAME to set this value. /// - public static string AppName { get; set; } = + public static string AppName { get; set; } = Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME") ?? Environment.GetEnvironmentVariable("DTFX_APP_NAME") ?? string.Empty; @@ -624,6 +624,40 @@ public static bool TryGetTaskScheduledId(HistoryEvent historyEvent, out int task } } + /// + /// Creates a determinstic Guid from a string using a hash function. This is a simple hash + /// meant to produce pseudo-random Guids, it is not meant to be cryptographically secure, + /// and does not follow any formatting conventions for UUIDs (such as RFC 4122). + /// + /// The string to hash. + /// A Guid constructed from the hash. + /// + internal static Guid CreateGuidFromHash(string stringToHash) + { + if (string.IsNullOrEmpty(stringToHash)) + { + throw new ArgumentException("string to hash must not be null or empty", nameof(stringToHash)); + } + + var bytes = Encoding.UTF8.GetBytes(stringToHash); + uint hash1 = Fnv1aHashHelper.ComputeHash(bytes, 0xdf0dd395); + uint hash2 = Fnv1aHashHelper.ComputeHash(bytes, 0xa19df4df); + uint hash3 = Fnv1aHashHelper.ComputeHash(bytes, 0xc88599c5); + uint hash4 = Fnv1aHashHelper.ComputeHash(bytes, 0xe24e3e64); + return new Guid( + hash1, + (ushort)(hash2 & 0xFFFF), + (ushort)((hash2 >> 16) & 0xFFFF), + (byte)(hash3 & 0xFF), + (byte)((hash3 >> 8) & 0xFF), + (byte)((hash3 >> 16) & 0xFF), + (byte)((hash3 >> 24) & 0xFF), + (byte)(hash4 & 0xFF), + (byte)((hash4 >> 8) & 0xFF), + (byte)((hash4 >> 16) & 0xFF), + (byte)((hash4 >> 24) & 0xFF)); + } + /// /// Gets the generic return type for a specific . /// diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index bfb1d4df3..46336110a 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -17,8 +17,8 @@ 2 - 15 - 1 + 16 + 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 @@ -27,7 +27,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix) + $(VersionPrefix)-preview.1 diff --git a/src/DurableTask.Core/Entities/ClientEntityHelpers.cs b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs new file mode 100644 index 000000000..94bc0512a --- /dev/null +++ b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs @@ -0,0 +1,102 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using DurableTask.Core.Entities; + using DurableTask.Core.Entities.EventFormat; + using Newtonsoft.Json.Linq; + using Newtonsoft.Json; + using System; + + /// + /// Utility functions for clients that interact with entities, either by sending events or by accessing the entity state directly in storage + /// + public static class ClientEntityHelpers + { + /// + /// Create an event to represent an entity signal. + /// + /// The target instance. + /// A unique identifier for the request. + /// The name of the operation. + /// The serialized input for the operation. + /// The time to schedule this signal, or null if not a scheduled signal + /// The event to send. + public static EntityMessageEvent EmitOperationSignal(OrchestrationInstance targetInstance, Guid requestId, string operationName, string? input, (DateTime Original, DateTime Capped)? scheduledTimeUtc) + { + var request = new RequestMessage() + { + ParentInstanceId = null, // means this was sent by a client + ParentExecutionId = null, + Id = requestId, + IsSignal = true, + Operation = operationName, + ScheduledTime = scheduledTimeUtc?.Original, + Input = input, + }; + + var eventName = scheduledTimeUtc.HasValue + ? EntityMessageEventNames.ScheduledRequestMessageEventName(scheduledTimeUtc.Value.Capped) + : EntityMessageEventNames.RequestMessageEventName; + + return new EntityMessageEvent(eventName, request, targetInstance); + } + + /// + /// Create an event to represent an entity unlock, which is called by clients to fix orphaned locks. + /// + /// The target instance. + /// The instance id of the entity to be unlocked. + /// The event to send. + public static EntityMessageEvent EmitUnlockForOrphanedLock(OrchestrationInstance targetInstance, string lockOwnerInstanceId) + { + var message = new ReleaseMessage() + { + ParentInstanceId = lockOwnerInstanceId, + Id = "fix-orphaned-lock", // we don't know the original id but it does not matter + }; + + return new EntityMessageEvent(EntityMessageEventNames.ReleaseMessageEventName, message, targetInstance); + } + + /// + /// Extracts the user-defined entity state from the serialized scheduler state. The result is the serialized state, + /// or null if the entity has no state. + /// + public static string? GetEntityState(string? serializedSchedulerState) + { + if (serializedSchedulerState == null) + { + return null; + } + + var schedulerState = JsonConvert.DeserializeObject(serializedSchedulerState, Serializer.InternalSerializerSettings)!; + return schedulerState.EntityState; + } + + /// + /// Gets the entity status from the serialized custom status of the orchestration. + /// or null if the entity has no state. + /// + public static EntityStatus? GetEntityStatus(string? orchestrationCustomStatus) + { + if (orchestrationCustomStatus == null) + { + return null; + } + + return JsonConvert.DeserializeObject(orchestrationCustomStatus, Serializer.InternalSerializerSettings)!; + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/EntityBackendProperties.cs b/src/DurableTask.Core/Entities/EntityBackendProperties.cs new file mode 100644 index 000000000..20d8ec9e0 --- /dev/null +++ b/src/DurableTask.Core/Entities/EntityBackendProperties.cs @@ -0,0 +1,79 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using System.Threading; + + /// + /// Entity processing characteristics that are controlled by the backend provider, i.e. the orchestration service. + /// + public class EntityBackendProperties + { + /// + /// The time window within which entity messages should be deduplicated and reordered. + /// This is zero for providers that already guarantee exactly-once and ordered delivery. + /// + public TimeSpan EntityMessageReorderWindow { get; set; } + + /// + /// A limit on the number of entity operations that should be processed as a single batch, or null if there is no limit. + /// + public int? MaxEntityOperationBatchSize { get; set; } + + /// + /// The maximum number of entity operation batches that can be processed concurrently on a single node. + /// + public int MaxConcurrentTaskEntityWorkItems { get; set; } + + /// + /// Gets or sets whether the backend supports implicit deletion. Implicit deletion means that + /// the storage does not retain any data for entities that don't have any state. + /// + public bool SupportsImplicitEntityDeletion { get; set; } + + /// + /// Gets or sets the maximum durable timer delay. Used for delayed signals. + /// + public TimeSpan MaximumSignalDelayTime { get; set; } + + /// + /// Gets or sets whether the backend uses separate work item queues for entities and orchestrators. If true, + /// the frontend must use and + /// + /// to fetch entities and orchestrations. Otherwise, it must use fetch both work items using + /// . + /// + public bool UseSeparateQueueForEntityWorkItems { get; set; } + + /// + /// A utility function to compute a cap on the scheduled time of an entity signal, based on the value of + /// . + /// + /// The current time. + /// The scheduled time. + /// + public DateTime GetCappedScheduledTime(DateTime nowUtc, DateTime scheduledUtcTime) + { + if ((scheduledUtcTime - nowUtc) <= this.MaximumSignalDelayTime) + { + return scheduledUtcTime; + } + else + { + return nowUtc + this.MaximumSignalDelayTime; + } + } + } +} diff --git a/src/DurableTask.Core/Entities/EntityBackendQueries.cs b/src/DurableTask.Core/Entities/EntityBackendQueries.cs new file mode 100644 index 000000000..7f85012c6 --- /dev/null +++ b/src/DurableTask.Core/Entities/EntityBackendQueries.cs @@ -0,0 +1,199 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using System.Collections.Generic; + using System.Threading; + using System.Threading.Tasks; + + /// + /// Encapsulates support for entity queries, at the abstraction level of a storage backend. + /// + public abstract class EntityBackendQueries + { + /// + /// Tries to get the entity with ID of . + /// + /// The ID of the entity to get. + /// true to include entity state in the response, false to not. + /// whether to include metadata for entities without user-defined state. + /// The cancellation token to cancel the operation. + /// a response containing metadata describing the entity. + public abstract Task GetEntityAsync( + EntityId id, bool includeState = false, bool includeStateless = false, CancellationToken cancellation = default); + + /// + /// Queries entity instances based on the conditions specified in . + /// + /// The query filter. + /// The cancellation token to cancel the operation. + /// One page of query results. + public abstract Task QueryEntitiesAsync(EntityQuery query, CancellationToken cancellation); + + /// + /// Cleans entity storage. See for the different forms of cleaning available. + /// + /// The request which describes what to clean. + /// The cancellation token to cancel the operation. + /// A task that completes when the operation is finished. + public abstract Task CleanEntityStorageAsync( + CleanEntityStorageRequest request = default, CancellationToken cancellation = default); + + /// + /// Metadata about an entity, as returned by queries. + /// + public struct EntityMetadata + { + /// + /// Gets or sets the ID for this entity. + /// + public EntityId EntityId { get; set; } + + /// + /// Gets or sets the time the entity was last modified. + /// + public DateTime LastModifiedTime { get; set; } + + /// + /// Gets the size of the backlog queue, if there is a backlog, and if that metric is supported by the backend. + /// + public int BacklogQueueSize { get; set; } + + /// + /// Gets the instance id of the orchestration that has locked this entity, or null if the entity is not locked. + /// + public string? LockedBy { get; set; } + + /// + /// Gets or sets the serialized state for this entity. Can be null if the query + /// specified to not include the state, or to include deleted entities. + /// + public string? SerializedState { get; set; } + } + + /// + /// A description of an entity query. + /// + /// + /// The default query returns all entities (does not specify any filters). + /// + public struct EntityQuery + { + /// + /// Gets or sets the optional starts-with expression for the entity instance ID. + /// + public string? InstanceIdStartsWith { get; set; } + + /// + /// Gets or sets a value indicating to include only entity instances which were last modified after the provided time. + /// + public DateTime? LastModifiedFrom { get; set; } + + /// + /// Gets or sets a value indicating to include only entity instances which were last modified before the provided time. + /// + public DateTime? LastModifiedTo { get; set; } + + /// + /// Gets or sets a value indicating whether to include state in the query results or not. + /// + public bool IncludeState { get; set; } + + /// + /// Gets a value indicating whether to include metadata about transient entities. + /// + /// Transient entities are entities that do not have an application-defined state, but for which the storage provider is + /// tracking metadata for synchronization purposes. + /// For example, a transient entity may be observed when the entity is in the process of being created or deleted, or + /// when the entity has been locked by a critical section. By default, transient entities are not included in queries since they are + /// considered to "not exist" from the perspective of the user application. + /// + public bool IncludeTransient { get; set; } + + /// + /// Gets or sets the desired size of each page to return. + /// + /// + /// If no size is specified, the backend may choose an appropriate page size based on its implementation. + /// Note that the size of the returned page may be smaller or larger than the requested page size, and cannot + /// be used to determine whether the end of the query has been reached. + /// + public int? PageSize { get; set; } + + /// + /// Gets or sets the continuation token to resume a previous query. + /// + public string? ContinuationToken { get; set; } + } + + /// + /// A page of results. + /// + public struct EntityQueryResult + { + /// + /// Gets or sets the query results. + /// + public IEnumerable Results { get; set; } + + /// + /// Gets or sets the continuation token to continue this query, if not null. + /// + public string? ContinuationToken { get; set; } + } + + /// + /// Request struct for . + /// + public struct CleanEntityStorageRequest + { + /// + /// Gets or sets a value indicating whether to remove empty entities. + /// + public bool RemoveEmptyEntities { get; set; } + + /// + /// Gets or sets a value indicating whether to release orphaned locks or not. + /// + public bool ReleaseOrphanedLocks { get; set; } + + /// + /// Gets or sets the continuation token to resume a previous . + /// + public string? ContinuationToken { get; set; } + } + + /// + /// Result struct for . + /// + public struct CleanEntityStorageResult + { + /// + /// Gets or sets the number of empty entities removed. + /// + public int EmptyEntitiesRemoved { get; set; } + + /// + /// Gets or sets the number of orphaned locks that were removed. + /// + public int OrphanedLocksReleased { get; set; } + + /// + /// Gets or sets the continuation token to continue the , if not null. + /// + public string? ContinuationToken { get; set; } + } + } +} diff --git a/src/DurableTask.Core/Entities/EntityId.cs b/src/DurableTask.Core/Entities/EntityId.cs new file mode 100644 index 000000000..68ed4e943 --- /dev/null +++ b/src/DurableTask.Core/Entities/EntityId.cs @@ -0,0 +1,106 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using System.Runtime.Serialization; + + /// + /// A unique identifier for an entity, consisting of entity name and entity key. + /// + [DataContract] + public readonly struct EntityId : IEquatable, IComparable + { + /// + /// Create an entity id for an entity. + /// + /// The name of this class of entities. + /// The entity key. + public EntityId(string name, string key) + { + if (string.IsNullOrEmpty(name)) + { + throw new ArgumentNullException(nameof(name), "Invalid entity id: entity name must not be a null or empty string."); + } + + this.Name = name; + this.Key = key ?? throw new ArgumentNullException(nameof(key), "Invalid entity id: entity key must not be null."); + } + + /// + /// The name for this class of entities. + /// + [DataMember(Name = "name", IsRequired = true)] + public readonly string Name { get; } + + /// + /// The entity key. Uniquely identifies an entity among all entities of the same name. + /// + [DataMember(Name = "key", IsRequired = true)] + public readonly string Key { get; } + + /// + public override string ToString() + { + return $"@{this.Name}@{this.Key}"; + } + + /// + /// Returns the entity ID for a given instance ID. + /// + /// The instance ID. + /// the corresponding entity ID. + public static EntityId FromString(string instanceId) + { + if (string.IsNullOrEmpty(instanceId)) + { + throw new ArgumentException(nameof(instanceId)); + } + var pos = instanceId.IndexOf('@', 1); + if (pos <= 0 || instanceId[0] != '@') + { + throw new ArgumentException($"Instance ID '{instanceId}' is not a valid entity ID.", nameof(instanceId)); + } + var entityName = instanceId.Substring(1, pos - 1); + var entityKey = instanceId.Substring(pos + 1); + return new EntityId(entityName, entityKey); + } + + + /// + public override bool Equals(object obj) + { + return (obj is EntityId other) && this.Equals(other); + } + + /// + public bool Equals(EntityId other) + { + return (this.Name, this.Key).Equals((other.Name, other.Key)); + } + + /// + public override int GetHashCode() + { + return (this.Name, this.Key).GetHashCode(); + } + + /// + public int CompareTo(object obj) + { + var other = (EntityId)obj; + return (this.Name, this.Key).CompareTo((other.Name, other.Key)); + } + } +} diff --git a/src/DurableTask.Core/Entities/EntityMessageEvent.cs b/src/DurableTask.Core/Entities/EntityMessageEvent.cs new file mode 100644 index 000000000..4faf66512 --- /dev/null +++ b/src/DurableTask.Core/Entities/EntityMessageEvent.cs @@ -0,0 +1,113 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +using System; +using DurableTask.Core.Entities.EventFormat; +using DurableTask.Core.Serializing.Internal; +using Newtonsoft.Json; + +namespace DurableTask.Core.Entities +{ + /// + /// Encapsulates events that represent a message sent to or from an entity. + /// + public readonly struct EntityMessageEvent + { + readonly string eventName; + readonly EntityMessage message; + readonly OrchestrationInstance target; + + internal EntityMessageEvent(string eventName, EntityMessage message, OrchestrationInstance target) + { + this.eventName = eventName; + this.message = message; + this.target = target; + } + + /// + public override string ToString() + { + return this.message.ToString(); + } + + /// + /// The name of the event. + /// + public string EventName => this.eventName; + + /// + /// The target instance for the event. + /// + public OrchestrationInstance TargetInstance => this.target; + + /// + /// Returns the content of this event, as a serialized string. + /// + /// + public string AsSerializedString() + { + return JsonConvert.SerializeObject(message, Serializer.InternalSerializerSettings); + } + + /// + /// Returns this event in the form of a TaskMessage. + /// + /// + public TaskMessage AsTaskMessage() + { + return new TaskMessage + { + OrchestrationInstance = this.target, + Event = new History.EventRaisedEvent(-1, this.AsSerializedString()) + { + Name = this.eventName + } + }; + } + +#pragma warning disable CS0618 // Type or member is obsolete. Intentional internal usage. + /// + /// Returns the content as an already-serialized string. Can be used to bypass the application-defined serializer. + /// + /// + public RawInput AsRawInput() + { + return new RawInput(this.AsSerializedString()); + } +#pragma warning restore CS0618 // Type or member is obsolete + + /// + /// Utility function to compute a capped scheduled time, given a scheduled time, a timestamp representing the current time, and the maximum delay. + /// + /// a timestamp representing the current time + /// the scheduled time, or null if none. + /// The maximum delay supported by the backend. + /// the capped scheduled time, or null if none. + public static (DateTime original, DateTime capped)? GetCappedScheduledTime(DateTime nowUtc, TimeSpan maxDelay, DateTime? scheduledUtcTime) + { + if (!scheduledUtcTime.HasValue) + { + return null; + } + + if ((scheduledUtcTime - nowUtc) <= maxDelay) + { + return (scheduledUtcTime.Value, scheduledUtcTime.Value); + } + else + { + return (scheduledUtcTime.Value, nowUtc + maxDelay); + } + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/EventFormat/EntityMessage.cs b/src/DurableTask.Core/Entities/EventFormat/EntityMessage.cs new file mode 100644 index 000000000..a07f333bc --- /dev/null +++ b/src/DurableTask.Core/Entities/EventFormat/EntityMessage.cs @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.EventFormat +{ + using System.Runtime.Serialization; + + /// + /// The format of entity messages is kept json-deserialization-compatible with the original format. + /// + [DataContract] + internal abstract class EntityMessage + { + public abstract string GetShortDescription(); + + public override string ToString() => this.GetShortDescription(); + } +} diff --git a/src/DurableTask.Core/Entities/EventFormat/EntityMessageEventNames.cs b/src/DurableTask.Core/Entities/EventFormat/EntityMessageEventNames.cs new file mode 100644 index 000000000..adecea1dc --- /dev/null +++ b/src/DurableTask.Core/Entities/EventFormat/EntityMessageEventNames.cs @@ -0,0 +1,37 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.EventFormat +{ + using System; + + /// + /// Determines event names to use for messages sent to and from entities. + /// + internal static class EntityMessageEventNames + { + public static string RequestMessageEventName => "op"; + + public static string ReleaseMessageEventName => "release"; + + public static string ContinueMessageEventName => "continue"; + + public static string ScheduledRequestMessageEventName(DateTime scheduledUtc) => $"op@{scheduledUtc:o}"; + + public static string ResponseMessageEventName(Guid requestId) => requestId.ToString(); + + public static bool IsRequestMessage(string eventName) => eventName.StartsWith("op"); + + public static bool IsReleaseMessage(string eventName) => eventName == "release"; + } +} diff --git a/src/DurableTask.Core/Entities/EventFormat/ReleaseMessage.cs b/src/DurableTask.Core/Entities/EventFormat/ReleaseMessage.cs new file mode 100644 index 000000000..455c9b4fc --- /dev/null +++ b/src/DurableTask.Core/Entities/EventFormat/ReleaseMessage.cs @@ -0,0 +1,32 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.EventFormat +{ + using System.Runtime.Serialization; + + [DataContract] + internal class ReleaseMessage : EntityMessage + { + [DataMember(Name = "parent")] + public string? ParentInstanceId { get; set; } + + [DataMember(Name = "id")] + public string? Id { get; set; } + + public override string GetShortDescription() + { + return $"[Release lock {Id} by {ParentInstanceId}]"; + } + } +} diff --git a/src/DurableTask.Core/Entities/EventFormat/RequestMessage.cs b/src/DurableTask.Core/Entities/EventFormat/RequestMessage.cs new file mode 100644 index 000000000..e46d1759f --- /dev/null +++ b/src/DurableTask.Core/Entities/EventFormat/RequestMessage.cs @@ -0,0 +1,114 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.EventFormat +{ + using System; + using System.Runtime.Serialization; + + /// + /// A message sent to an entity, such as operation, signal, lock, or continue messages. + /// + [DataContract] + internal class RequestMessage : EntityMessage + { + /// + /// The name of the operation being called (if this is an operation message) or null + /// (if this is a lock request). + /// + [DataMember(Name = "op")] + public string? Operation { get; set; } + + /// + /// Whether or not this is a one-way message. + /// + [DataMember(Name = "signal", EmitDefaultValue = false)] + public bool IsSignal { get; set; } + + /// + /// The operation input. + /// + [DataMember(Name = "input", EmitDefaultValue = false)] + public string? Input { get; set; } + + /// + /// A unique identifier for this operation. + /// + [DataMember(Name = "id", IsRequired = true)] + public Guid Id { get; set; } + + /// + /// The parent instance that called this operation. + /// + [DataMember(Name = "parent", EmitDefaultValue = false)] + public string? ParentInstanceId { get; set; } + + /// + /// The parent instance that called this operation. + /// + [DataMember(Name = "parentExecution", EmitDefaultValue = false)] + public string? ParentExecutionId { get; set; } + + /// + /// Optionally, a scheduled time at which to start the operation. + /// + [DataMember(Name = "due", EmitDefaultValue = false)] + public DateTime? ScheduledTime { get; set; } + + /// + /// A timestamp for this request. + /// Used for duplicate filtering and in-order delivery. + /// + [DataMember] + public DateTime Timestamp { get; set; } + + /// + /// A timestamp for the predecessor request in the stream, or DateTime.MinValue if none. + /// Used for duplicate filtering and in-order delivery. + /// + [DataMember] + public DateTime Predecessor { get; set; } + + /// + /// For lock requests, the set of locks being acquired. Is sorted, + /// contains at least one element, and has no repetitions. + /// + [DataMember(Name = "lockset", EmitDefaultValue = false)] + public EntityId[]? LockSet { get; set; } + + /// + /// For lock requests involving multiple locks, the message number. + /// + [DataMember(Name = "pos", EmitDefaultValue = false)] + public int Position { get; set; } + + /// + /// whether this message is a lock request + /// + [DataMember] + public bool IsLockRequest => LockSet != null; + + /// + public override string GetShortDescription() + { + if (IsLockRequest) + { + return $"[Request lock {Id} by {ParentInstanceId} {ParentExecutionId}, position {Position}]"; + } + else + { + return $"[{(IsSignal ? "Signal" : "Call")} '{Operation}' operation {Id} by {ParentInstanceId} {ParentExecutionId}]"; + } + } + } +} diff --git a/src/DurableTask.Core/Entities/EventFormat/ResponseMessage.cs b/src/DurableTask.Core/Entities/EventFormat/ResponseMessage.cs new file mode 100644 index 000000000..8f78516b5 --- /dev/null +++ b/src/DurableTask.Core/Entities/EventFormat/ResponseMessage.cs @@ -0,0 +1,51 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.EventFormat +{ + using System.Runtime.Serialization; + + [DataContract] + internal class ResponseMessage : EntityMessage + { + public const string LockAcquisitionCompletion = "Lock Acquisition Completed"; + + [DataMember(Name = "result")] + public string? Result { get; set; } + + [DataMember(Name = "exceptionType", EmitDefaultValue = false)] + public string? ErrorMessage { get; set; } + + [DataMember(Name = "failureDetails", EmitDefaultValue = false)] + public FailureDetails? FailureDetails { get; set; } + + [IgnoreDataMember] + public bool IsErrorResult => this.ErrorMessage != null || this.FailureDetails != null; + + public override string GetShortDescription() + { + if (this.IsErrorResult) + { + return $"[OperationFailed {this.FailureDetails?.ErrorMessage ?? this.ErrorMessage}]"; + } + else if (this.Result == LockAcquisitionCompletion) + { + return "[LockAcquisitionComplete]"; + } + else + { + return $"[OperationSuccessful ({Result?.Length ?? 0} chars)]"; + } + } + } +} diff --git a/src/DurableTask.Core/Entities/IEntityOrchestrationService.cs b/src/DurableTask.Core/Entities/IEntityOrchestrationService.cs new file mode 100644 index 000000000..c8c9b80c8 --- /dev/null +++ b/src/DurableTask.Core/Entities/IEntityOrchestrationService.cs @@ -0,0 +1,50 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using System.Threading; + using System.Threading.Tasks; + + /// + /// Extends with methods that support processing of entities. + /// + public interface IEntityOrchestrationService : IOrchestrationService + { + /// + /// Properties of the backend implementation and configuration, as related to the new entity support in DurableTask.Core. + /// + /// An object containing properties of the entity backend, or null if the backend does not natively support DurableTask.Core entities. + EntityBackendProperties? EntityBackendProperties { get; } + + /// + /// Support for entity queries. + /// + /// An object that can be used to issue entity queries to the orchestration service, or null if the backend does not natively + /// support entity queries. + EntityBackendQueries? EntityBackendQueries { get; } + + /// + /// Specialized variant of that + /// fetches only work items for true orchestrations, not entities. + /// + Task LockNextOrchestrationWorkItemAsync(TimeSpan receiveTimeout, CancellationToken cancellationToken); + + /// + /// Specialized variant of that + /// fetches only work items for entities, not plain orchestrations. + /// + Task LockNextEntityWorkItemAsync(TimeSpan receiveTimeout, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/EntityBatchRequest.cs b/src/DurableTask.Core/Entities/OperationFormat/EntityBatchRequest.cs new file mode 100644 index 000000000..1a08a8ac5 --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/EntityBatchRequest.cs @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using System.Collections.Generic; + + /// + /// A request for execution of a batch of operations on an entity. + /// + public class EntityBatchRequest + { + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// The instance id for this entity. + /// + public string? InstanceId { get; set; } + + /// + /// The current state of the entity, or null if the entity does not exist. + /// + public string? EntityState { get; set; } + + /// + /// The list of operations to be performed on the entity. + /// + public List? Operations { get; set; } + } +} diff --git a/src/DurableTask.Core/Entities/OperationFormat/EntityBatchResult.cs b/src/DurableTask.Core/Entities/OperationFormat/EntityBatchResult.cs new file mode 100644 index 000000000..645fa9cf8 --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/EntityBatchResult.cs @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using System.Collections.Generic; + + /// + /// The results of executing a batch of operations on the entity out of process. + /// + public class EntityBatchResult + { + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// The results of executing the operations in the batch. If there were (non-application-level) errors, the length of this list may + /// be shorter than the number of requests. In that case, contains the reason why not all requests + /// were processed. + /// + public List? Results { get; set; } + + /// + /// The list of actions (outgoing messages) performed while executing the operations in the batch. Can be empty. + /// + public List? Actions { get; set; } + + /// + /// The state of the entity after executing the batch, + /// or null if the entity has no state (e.g. if it has been deleted). + /// + public string? EntityState { get; set; } + + /// + /// Contains the failure details, if there was a failure to process all requests (fewer results were returned than requests) + /// + public FailureDetails? FailureDetails { get; set; } + } +} diff --git a/src/DurableTask.Core/Entities/OperationFormat/OperationAction.cs b/src/DurableTask.Core/Entities/OperationFormat/OperationAction.cs new file mode 100644 index 000000000..467cecda4 --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/OperationAction.cs @@ -0,0 +1,29 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using Newtonsoft.Json; + + /// + /// Defines a set of base properties for an operator action. + /// + [JsonConverter(typeof(OperationActionConverter))] + public abstract class OperationAction + { + /// + /// The type of the orchestrator action. + /// + public abstract OperationActionType OperationActionType { get; } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/OperationActionConverter.cs b/src/DurableTask.Core/Entities/OperationFormat/OperationActionConverter.cs new file mode 100644 index 000000000..96cee6b4f --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/OperationActionConverter.cs @@ -0,0 +1,40 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +namespace DurableTask.Core.Entities.OperationFormat +{ + using System; + using Newtonsoft.Json.Linq; + using DurableTask.Core.Serializing; + + internal class OperationActionConverter : JsonCreationConverter + { + protected override OperationAction CreateObject(Type objectType, JObject jObject) + { + if (jObject.TryGetValue("OperationActionType", StringComparison.OrdinalIgnoreCase, out JToken actionType)) + { + var type = (OperationActionType)int.Parse((string)actionType); + switch (type) + { + case OperationActionType.SendSignal: + return new SendSignalOperationAction(); + case OperationActionType.StartNewOrchestration: + return new StartNewOrchestrationOperationAction(); + default: + throw new NotSupportedException("Unrecognized action type."); + } + } + + throw new NotSupportedException("Action Type not provided."); + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/OperationActionType.cs b/src/DurableTask.Core/Entities/OperationFormat/OperationActionType.cs new file mode 100644 index 000000000..8fb656e1a --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/OperationActionType.cs @@ -0,0 +1,31 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + /// + /// Enumeration of entity operation actions. + /// + public enum OperationActionType + { + /// + /// A signal was sent to an entity + /// + SendSignal, + + /// + /// A new fire-and-forget orchestration was started + /// + StartNewOrchestration, + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/OperationRequest.cs b/src/DurableTask.Core/Entities/OperationFormat/OperationRequest.cs new file mode 100644 index 000000000..ab249f88f --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/OperationRequest.cs @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using System; + + /// + /// A request message sent to an entity when calling or signaling the entity. + /// + public class OperationRequest + { + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// The name of the operation. + /// + public string? Operation { get; set; } + + /// + /// The unique GUID of the operation. + /// + public Guid Id { get; set; } + + /// + /// The input for the operation. Can be null if no input was given. + /// + public string? Input { get; set; } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/OperationResult.cs b/src/DurableTask.Core/Entities/OperationFormat/OperationResult.cs new file mode 100644 index 000000000..01cc41b11 --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/OperationResult.cs @@ -0,0 +1,50 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + /// + /// A response message sent by an entity to a caller after it executes an operation. + /// + public class OperationResult + { + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// The serialized result returned by the operation. Can be null, if the operation returned no result. + /// May contain error details, such as a serialized exception, if is true. + /// + public string? Result { get; set; } + + /// + /// Whether this operation completed successfully. + /// + public bool IsError + => this.ErrorMessage != null || this.FailureDetails != null; + + /// + /// If non-null, this string indicates that this operation did not successfully complete. + /// The content and interpretation varies depending on the SDK used. For newer SDKs, + /// we rely on the instead. + /// + public string? ErrorMessage { get; set; } + + /// + /// A structured language-independent representation of the error. Whether this field is present + /// depends on which SDK is used, and on configuration settings. For newer SDKs, we use + /// this field exclusively when collecting error information. + /// + public FailureDetails? FailureDetails { get; set; } + } +} diff --git a/src/DurableTask.Core/Entities/OperationFormat/SendSignalOperationAction.cs b/src/DurableTask.Core/Entities/OperationFormat/SendSignalOperationAction.cs new file mode 100644 index 000000000..04531ac31 --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/SendSignalOperationAction.cs @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using System; + + /// + /// Operation action for sending a signal. + /// + public class SendSignalOperationAction : OperationAction + { + /// + public override OperationActionType OperationActionType => OperationActionType.SendSignal; + + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// The destination entity for the signal. + /// + public string? InstanceId { get; set; } + + /// + /// The name of the operation being signaled. + /// + public string? Name { get; set; } + + /// + /// The input of the operation being signaled. + /// + public string? Input { get; set; } + + /// + /// Optionally, a scheduled delivery time for the signal. + /// + public DateTime? ScheduledTime { get; set; } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OperationFormat/StartNewOrchestrationOperationAction.cs b/src/DurableTask.Core/Entities/OperationFormat/StartNewOrchestrationOperationAction.cs new file mode 100644 index 000000000..4c06f80cd --- /dev/null +++ b/src/DurableTask.Core/Entities/OperationFormat/StartNewOrchestrationOperationAction.cs @@ -0,0 +1,56 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities.OperationFormat +{ + using System; + using System.Collections.Generic; + + /// + /// Entity operation action for creating sub-orchestrations. + /// + public class StartNewOrchestrationOperationAction : OperationAction + { + /// + public override OperationActionType OperationActionType => OperationActionType.StartNewOrchestration; + + // NOTE: Actions must be serializable by a variety of different serializer types to support out-of-process execution. + // To ensure maximum compatibility, all properties should be public and settable by default. + + /// + /// Gets or sets the name of the sub-orchestrator to start. + /// + public string? Name { get; set; } + + /// + /// Gets or sets the version of the sub-orchestrator to start. + /// + public string? Version { get; set; } + + /// + /// Gets or sets the instance ID of the created sub-orchestration. + /// + public string? InstanceId { get; set; } + + /// + /// Gets or sets the input of the sub-orchestration. + /// + public string? Input { get; set; } + + /// + /// Gets or sets when to start the orchestration, or null if the orchestration should be started immediately. + /// + public DateTime? ScheduledStartTime { get; set; } + + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs b/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs new file mode 100644 index 000000000..c93d0ee4a --- /dev/null +++ b/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs @@ -0,0 +1,349 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using DurableTask.Core.Entities; + using DurableTask.Core.Entities.EventFormat; + using DurableTask.Core.Entities.OperationFormat; + using DurableTask.Core.Exceptions; + using Newtonsoft.Json; + using Newtonsoft.Json.Linq; + using System; + using System.Collections.Generic; + using System.Linq; + + /// + /// Tracks the entity-related state of an orchestration. + /// Tracks and validates the synchronization state. + /// + public class OrchestrationEntityContext + { + private readonly string instanceId; + private readonly string executionId; + private readonly OrchestrationContext innerContext; + private readonly MessageSorter messageSorter; + + private bool lockAcquisitionPending; + + // the following are null unless we are inside a critical section + private Guid? criticalSectionId; + private EntityId[]? criticalSectionLocks; + private HashSet? availableLocks; + + /// + /// Constructs an OrchestrationEntityContext. + /// + /// The instance id. + /// The execution id. + /// The inner context. + public OrchestrationEntityContext( + string instanceId, + string executionId, + OrchestrationContext innerContext) + { + this.instanceId = instanceId; + this.executionId = executionId; + this.innerContext = innerContext; + this.messageSorter = new MessageSorter(); + } + + /// + /// Checks whether the configured backend supports entities. + /// + public bool EntitiesAreSupported => this.innerContext.EntityParameters != null; + + /// + /// Whether this orchestration is currently inside a critical section. + /// + public bool IsInsideCriticalSection => this.criticalSectionId != null; + + /// + /// The ID of the current critical section, or null if not currently in a critical section. + /// + public Guid? CurrentCriticalSectionId => this.criticalSectionId; + + /// + /// Enumerate all the entities that are available for calling from within a critical section. + /// This set contains all the entities that were locked prior to entering the critical section, + /// and for which there is not currently an operation call pending. + /// + /// An enumeration of all the currently available entities. + public IEnumerable GetAvailableEntities() + { + if (this.IsInsideCriticalSection) + { + foreach (var e in this.availableLocks!) + { + yield return e; + } + } + } + + /// + /// Check that a suborchestration is a valid transition in the current state. + /// + /// The error message, if it is not valid, or null otherwise + /// whether the transition is valid + public bool ValidateSuborchestrationTransition(out string? errorMessage) + { + if (this.IsInsideCriticalSection) + { + errorMessage = "While holding locks, cannot call suborchestrators."; + return false; + } + + errorMessage = null; + return true; + } + + /// + /// Check that acquire is a valid transition in the current state. + /// + /// Whether this is a signal or a call. + /// The target instance id. + /// The error message, if it is not valid, or null otherwise + /// whether the transition is valid + public bool ValidateOperationTransition(string targetInstanceId, bool oneWay, out string? errorMessage) + { + if (this.IsInsideCriticalSection) + { + var lockToUse = EntityId.FromString(targetInstanceId); + if (oneWay) + { + if (this.criticalSectionLocks.Contains(lockToUse)) + { + errorMessage = "Must not signal a locked entity from a critical section."; + return false; + } + } + else + { + if (!this.availableLocks!.Remove(lockToUse)) + { + if (this.lockAcquisitionPending) + { + errorMessage = "Must await the completion of the lock request prior to calling any entity."; + return false; + } + if (this.criticalSectionLocks.Contains(lockToUse)) + { + errorMessage = "Must not call an entity from a critical section while a prior call to the same entity is still pending."; + return false; + } + else + { + errorMessage = "Must not call an entity from a critical section if it is not one of the locked entities."; + return false; + } + } + } + } + + errorMessage = null; + return true; + } + + /// + /// Check that acquire is a valid transition in the current state. + /// + /// The error message, if it is not valid, or null otherwise + /// whether the transition is valid + public bool ValidateAcquireTransition(out string? errorMessage) + { + if (this.IsInsideCriticalSection) + { + errorMessage = "Must not enter another critical section from within a critical section."; + return false; + } + + errorMessage = null; + return true; + } + + /// + /// Called after an operation call within a critical section completes. + /// + /// + public void RecoverLockAfterCall(string targetInstanceId) + { + if (this.IsInsideCriticalSection) + { + var lockToUse = EntityId.FromString(targetInstanceId); + this.availableLocks!.Add(lockToUse); + } + } + + /// + /// Get release messages for all locks in the critical section, and release them + /// + public IEnumerable EmitLockReleaseMessages() + { + if (this.IsInsideCriticalSection) + { + var message = new ReleaseMessage() + { + ParentInstanceId = instanceId, + Id = this.criticalSectionId!.Value.ToString(), + }; + + foreach (var entityId in this.criticalSectionLocks!) + { + var instance = new OrchestrationInstance() { InstanceId = entityId.ToString() }; + yield return new EntityMessageEvent(EntityMessageEventNames.ReleaseMessageEventName, message, instance); + } + + this.criticalSectionLocks = null; + this.availableLocks = null; + this.criticalSectionId = null; + } + } + + /// + /// Creates a request message to be sent to an entity. + /// + /// The target entity. + /// The name of the operation. + /// If true, this is a signal, otherwise it is a call. + /// A unique identifier for this request. + /// A time for which to schedule the delivery, or null if this is not a scheduled message + /// The operation input + /// The event to send. + public EntityMessageEvent EmitRequestMessage( + OrchestrationInstance target, + string operationName, + bool oneWay, + Guid operationId, + (DateTime Original, DateTime Capped)? scheduledTimeUtc, + string? input) + { + var request = new RequestMessage() + { + ParentInstanceId = this.instanceId, + ParentExecutionId = this.executionId, + Id = operationId, + IsSignal = oneWay, + Operation = operationName, + ScheduledTime = scheduledTimeUtc?.Original, + Input = input, + }; + + this.AdjustOutgoingMessage(target.InstanceId, request, scheduledTimeUtc?.Capped, out string eventName); + + return new EntityMessageEvent(eventName, request, target); + } + + /// + /// Creates an acquire message to be sent to an entity. + /// + /// A unique request id. + /// All the entities that are to be acquired. + /// The event to send. + public EntityMessageEvent EmitAcquireMessage(Guid lockRequestId, EntityId[] entities) + { + // All the entities in entity[] need to be locked, but to avoid deadlock, the locks have to be acquired + // sequentially, in order. So, we send the lock request to the first entity; when the first lock + // is granted by the first entity, the first entity will forward the lock request to the second entity, + // and so on; after the last entity grants the last lock, a response is sent back here. + + // acquire the locks in a globally fixed order to avoid deadlocks + Array.Sort(entities); + + // remove duplicates if necessary. Probably quite rare, so no need to optimize more. + for (int i = 0; i < entities.Length - 1; i++) + { + if (entities[i].Equals(entities[i + 1])) + { + entities = entities.Distinct().ToArray(); + break; + } + } + + // send lock request to first entity in the lock set + var target = new OrchestrationInstance() { InstanceId = entities[0].ToString() }; + var request = new RequestMessage() + { + Id = lockRequestId, + ParentInstanceId = this.instanceId, + ParentExecutionId = this.executionId, + LockSet = entities, + Position = 0, + }; + + this.criticalSectionId = lockRequestId; + this.criticalSectionLocks = entities; + this.lockAcquisitionPending = true; + + this.AdjustOutgoingMessage(target.InstanceId, request, null, out string eventName); + + return new EntityMessageEvent(eventName, request, target); + } + + /// + /// Called when a response to the acquire message is received from the last entity. + /// + /// The result returned. + /// The guid for the lock operation + public void CompleteAcquire(OperationResult result, Guid criticalSectionId) + { + this.availableLocks = new HashSet(this.criticalSectionLocks); + this.lockAcquisitionPending = false; + } + + internal void AdjustOutgoingMessage(string instanceId, RequestMessage requestMessage, DateTime? cappedTime, out string eventName) + { + if (cappedTime.HasValue) + { + eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(cappedTime.Value); + } + else + { + this.messageSorter.LabelOutgoingMessage( + requestMessage, + instanceId, + this.innerContext.CurrentUtcDateTime, + this.innerContext.EntityParameters.EntityMessageReorderWindow); + + eventName = EntityMessageEventNames.RequestMessageEventName; + } + } + + /// + /// Extracts the operation result from an event that represents an entity response. + /// + /// The serialized event content. + /// + public OperationResult DeserializeEntityResponseEvent(string eventContent) + { + var responseMessage = new ResponseMessage(); + + // for compatibility, we deserialize in a way that is resilient to any typename presence/absence/mismatch + try + { + // restore the scheduler state from the input + JsonConvert.PopulateObject(eventContent, responseMessage, Serializer.InternalSerializerSettings); + } + catch (Exception exception) + { + throw new EntitySchedulerException("Failed to deserialize entity response.", exception); + } + + return new OperationResult() + { + Result = responseMessage.Result, + ErrorMessage = responseMessage.ErrorMessage, + FailureDetails = responseMessage.FailureDetails, + }; + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/Serializer.cs b/src/DurableTask.Core/Entities/Serializer.cs new file mode 100644 index 000000000..0a99b5f71 --- /dev/null +++ b/src/DurableTask.Core/Entities/Serializer.cs @@ -0,0 +1,30 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using Newtonsoft.Json; + + internal static class Serializer + { + /// + /// This serializer is used exclusively for internally defined data structures and cannot be customized by user. + /// This is intentional, to avoid problems caused by our unability to control the exact format. + /// For example, including typenames can cause compatibility problems if the type name is later changed. + /// + public static JsonSerializer InternalSerializer = JsonSerializer.Create(InternalSerializerSettings); + + public static JsonSerializerSettings InternalSerializerSettings + = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.None }; + } +} diff --git a/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs b/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs new file mode 100644 index 000000000..6075f14b9 --- /dev/null +++ b/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System.Runtime.Serialization; + + /// + /// Information about the current status of an entity. Excludes potentially large data + /// (such as the entity state, or the contents of the queue) so it can always be read with low latency. + /// + [DataContract] + public class EntityStatus + { + /// + /// The JSON property name for the entityExists property. + /// + const string EntityExistsProperyName = "entityExists"; + + /// + /// A fast shortcut for checking whether an entity exists, looking at the serialized json string directly. Used by queries. + /// + /// + /// + public static bool TestEntityExists(string serializedJson) + { + return serializedJson.Contains(EntityExistsProperyName); + } + + /// + /// Whether this entity currently has a user-defined state or not. + /// + [DataMember(Name = EntityExistsProperyName, EmitDefaultValue = false)] + public bool EntityExists { get; set; } + + /// + /// The size of the queue, i.e. the number of operations that are waiting for the current operation to complete. + /// + [DataMember(Name = "queueSize", EmitDefaultValue = false)] + public int BacklogQueueSize { get; set; } + + /// + /// The instance id of the orchestration that currently holds the lock of this entity. + /// + [DataMember(Name = "lockedBy", EmitDefaultValue = false)] + public string? LockedBy { get; set; } + } +} diff --git a/src/DurableTask.Core/Entities/StateFormat/MessageSorter.cs b/src/DurableTask.Core/Entities/StateFormat/MessageSorter.cs new file mode 100644 index 000000000..ced0bdb8e --- /dev/null +++ b/src/DurableTask.Core/Entities/StateFormat/MessageSorter.cs @@ -0,0 +1,284 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +namespace DurableTask.Core.Entities +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Runtime.Serialization; + using DurableTask.Core.Entities.EventFormat; + + /// + /// provides message ordering and deduplication of request messages (operations or lock requests) + /// that are sent to entities, from other entities, or from orchestrations. + /// + [DataContract] + internal class MessageSorter + { + // don't update the reorder window too often since the garbage collection incurs some overhead. + private static readonly TimeSpan MinIntervalBetweenCollections = TimeSpan.FromSeconds(10); + + [DataMember(EmitDefaultValue = false)] + public Dictionary LastSentToInstance { get; set; } + + [DataMember(EmitDefaultValue = false)] + public Dictionary ReceivedFromInstance { get; set; } + + [DataMember(EmitDefaultValue = false)] + public DateTime ReceiveHorizon { get; set; } + + [DataMember(EmitDefaultValue = false)] + public DateTime SendHorizon { get; set; } + + /// + /// Used for testing purposes. + /// + [IgnoreDataMember] + internal int NumberBufferedRequests => + ReceivedFromInstance?.Select(kvp => kvp.Value.Buffered?.Count ?? 0).Sum() ?? 0; + + /// + /// Called on the sending side, to fill in timestamp and predecessor fields. + /// + public void LabelOutgoingMessage(RequestMessage message, string destination, DateTime now, TimeSpan reorderWindow) + { + if (reorderWindow.Ticks == 0) + { + return; // we are not doing any message sorting. + } + + DateTime timestamp = now; + + // whenever (SendHorizon + reorderWindow < now) it is possible to advance the send horizon to (now - reorderWindow) + // and we can then clean out all the no-longer-needed entries of LastSentToInstance. + // However, to reduce the overhead of doing this collection, we don't update the send horizon immediately when possible. + // Instead, we make sure at least MinIntervalBetweenCollections passes between collections. + if (SendHorizon + reorderWindow + MinIntervalBetweenCollections < now) + { + SendHorizon = now - reorderWindow; + + // clean out send clocks that are past the reorder window + + if (LastSentToInstance != null) + { + List expired = new List(); + + foreach (var kvp in LastSentToInstance) + { + if (kvp.Value < SendHorizon) + { + expired.Add(kvp.Key); + } + } + + foreach (var t in expired) + { + LastSentToInstance.Remove(t); + } + } + } + + if (LastSentToInstance == null) + { + LastSentToInstance = new Dictionary(StringComparer.OrdinalIgnoreCase); + } + else if (LastSentToInstance.TryGetValue(destination, out var last)) + { + message.Predecessor = last; + + // ensure timestamps are monotonic even if system clock is not + if (timestamp <= last) + { + timestamp = new DateTime(last.Ticks + 1); + } + } + + message.Timestamp = timestamp; + LastSentToInstance[destination] = timestamp; + } + + /// + /// Called on the receiving side, to reorder and deduplicate within the window. + /// + public IEnumerable ReceiveInOrder(RequestMessage message, TimeSpan reorderWindow) + { + // messages sent from clients and forwarded lock messages are not participating in the sorting. + if (reorderWindow.Ticks == 0 || message.ParentInstanceId == null || message.Position > 0) + { + // Just pass the message through. + yield return message; + yield break; + } + + // whenever (ReceiveHorizon + reorderWindow < message.Timestamp), we can advance the receive horizon to (message.Timestamp - reorderWindow) + // and then we can clean out all the no-longer-needed entries of ReceivedFromInstance. + // However, to reduce the overhead of doing this collection, we don't update the receive horizon immediately when possible. + // Instead, we make sure at least MinIntervalBetweenCollections passes between collections. + if (ReceiveHorizon + reorderWindow + MinIntervalBetweenCollections < message.Timestamp) + { + ReceiveHorizon = message.Timestamp - reorderWindow; + + // deliver any messages that were held in the receive buffers + // but are now past the reorder window + + List buffersToRemove = new List(); + + if (ReceivedFromInstance != null) + { + foreach (var kvp in ReceivedFromInstance) + { + if (kvp.Value.Last < ReceiveHorizon) + { + // we reset Last to MinValue; this means all future messages received + // are treated as if they were the first message received. + kvp.Value.Last = DateTime.MinValue; + } + + while (TryDeliverNextMessage(kvp.Value, out var next)) + { + yield return next; + } + + if (kvp.Value.Last == DateTime.MinValue + && (kvp.Value.Buffered == null || kvp.Value.Buffered.Count == 0)) + { + // we no longer need to store this buffer since it contains no relevant information anymore + // (it is back to its initial "empty" state) + buffersToRemove.Add(kvp.Key); + } + } + + foreach (var t in buffersToRemove) + { + ReceivedFromInstance.Remove(t); + } + + if (ReceivedFromInstance.Count == 0) + { + ReceivedFromInstance = null; + } + } + } + + // Messages older than the reorder window are not participating. + if (message.Timestamp < ReceiveHorizon) + { + // Just pass the message through. + yield return message; + yield break; + } + + ReceiveBuffer receiveBuffer; + + if (ReceivedFromInstance == null) + { + ReceivedFromInstance = new Dictionary(StringComparer.OrdinalIgnoreCase); + } + + if (!ReceivedFromInstance.TryGetValue(message.ParentInstanceId, out receiveBuffer)) + { + ReceivedFromInstance[message.ParentInstanceId] = receiveBuffer = new ReceiveBuffer() + { + ExecutionId = message.ParentExecutionId, + }; + } + else if (receiveBuffer.ExecutionId != message.ParentExecutionId) + { + // this message is from a new execution; release all buffered messages and start over + if (receiveBuffer.Buffered != null) + { + foreach (var kvp in receiveBuffer.Buffered) + { + yield return kvp.Value; + } + + receiveBuffer.Buffered.Clear(); + } + + receiveBuffer.Last = DateTime.MinValue; + receiveBuffer.ExecutionId = message.ParentExecutionId; + } + + if (message.Timestamp <= receiveBuffer.Last) + { + // This message was already delivered, it's a duplicate + yield break; + } + + if (message.Predecessor > receiveBuffer.Last + && message.Predecessor >= ReceiveHorizon) + { + // this message is waiting for a non-delivered predecessor in the window, buffer it + if (receiveBuffer.Buffered == null) + { + receiveBuffer.Buffered = new SortedDictionary(); + } + + receiveBuffer.Buffered[message.Timestamp] = message; + } + else + { + yield return message; + + receiveBuffer.Last = message.Timestamp >= ReceiveHorizon ? message.Timestamp : DateTime.MinValue; + + while (TryDeliverNextMessage(receiveBuffer, out var next)) + { + yield return next; + } + } + } + + private bool TryDeliverNextMessage(ReceiveBuffer buffer, out RequestMessage message) + { + if (buffer.Buffered != null) + { + using (var e = buffer.Buffered.GetEnumerator()) + { + if (e.MoveNext()) + { + var pred = e.Current.Value.Predecessor; + + if (pred <= buffer.Last || pred < ReceiveHorizon) + { + message = e.Current.Value; + + buffer.Last = message.Timestamp >= ReceiveHorizon ? message.Timestamp : DateTime.MinValue; + + buffer.Buffered.Remove(message.Timestamp); + + return true; + } + } + } + } + + message = null; + return false; + } + + [DataContract] + public class ReceiveBuffer + { + [DataMember] + public DateTime Last { get; set; }// last message delivered, or DateTime.Min if none + + [DataMember(EmitDefaultValue = false)] + public string ExecutionId { get; set; } // execution id of last message, if any + + [DataMember(EmitDefaultValue = false)] + public SortedDictionary Buffered { get; set; } + } + } +} diff --git a/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs b/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs new file mode 100644 index 000000000..aa5abe5f7 --- /dev/null +++ b/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs @@ -0,0 +1,115 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using System.Collections.Generic; + using System.Runtime.Serialization; + using DurableTask.Core.Entities.EventFormat; + + /// + /// The persisted state of an entity scheduler, as handed forward between ContinueAsNew instances. + /// + [DataContract] + internal class SchedulerState + { + [IgnoreDataMember] + public bool EntityExists => this.EntityState != null; + + /// + /// The last serialized entity state. + /// + [DataMember(Name = "state", EmitDefaultValue = false)] + public string? EntityState { get; set; } + + /// + /// The queue of waiting operations, or null if none. + /// + [DataMember(Name = "queue", EmitDefaultValue = false)] + public Queue? Queue { get; private set; } + + /// + /// The instance id of the orchestration that currently holds the lock of this entity. + /// + [DataMember(Name = "lockedBy", EmitDefaultValue = false)] + public string? LockedBy { get; set; } + + /// + /// Whether processing on this entity is currently suspended. + /// + [DataMember(Name = "suspended", EmitDefaultValue = false)] + public bool Suspended { get; set; } + + /// + /// The metadata used for reordering and deduplication of messages sent to entities. + /// + [DataMember(Name = "sorter", EmitDefaultValue = false)] + public MessageSorter MessageSorter { get; set; } = new MessageSorter(); + + [IgnoreDataMember] + public bool IsEmpty => !EntityExists && (Queue == null || Queue.Count == 0) && LockedBy == null; + + internal void Enqueue(RequestMessage operationMessage) + { + if (Queue == null) + { + Queue = new Queue(); + } + + Queue.Enqueue(operationMessage); + } + + internal void PutBack(Queue messages) + { + if (Queue != null) + { + foreach (var message in Queue) + { + messages.Enqueue(message); + } + } + + Queue = messages; + } + + internal bool MayDequeue() + { + return Queue != null + && Queue.Count > 0 + && (LockedBy == null || LockedBy == Queue.Peek().ParentInstanceId); + } + + internal RequestMessage Dequeue() + { + if (this.Queue == null) + { + throw new InvalidOperationException("Queue is empty"); + } + + var result = Queue.Dequeue(); + + if (Queue.Count == 0) + { + Queue = null; + } + + return result; + } + + public override string ToString() + { + return $"exists={EntityExists} queue.count={(Queue != null ? Queue.Count : 0)}"; + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/TaskEntity.cs b/src/DurableTask.Core/Entities/TaskEntity.cs new file mode 100644 index 000000000..b3277a9ff --- /dev/null +++ b/src/DurableTask.Core/Entities/TaskEntity.cs @@ -0,0 +1,30 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +#nullable enable +namespace DurableTask.Core.Entities +{ + using System.Threading.Tasks; + using DurableTask.Core.Entities.OperationFormat; + + /// + /// Abstract base class for entities. + /// + public abstract class TaskEntity + { + /// + /// Execute a batch of operations on an entity. + /// + public abstract Task ExecuteOperationBatchAsync(EntityBatchRequest operations); + } +} diff --git a/src/DurableTask.Core/Entities/TaskOrchestrationEntityParameters.cs b/src/DurableTask.Core/Entities/TaskOrchestrationEntityParameters.cs new file mode 100644 index 000000000..758710ad1 --- /dev/null +++ b/src/DurableTask.Core/Entities/TaskOrchestrationEntityParameters.cs @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Entities +{ + using System; + using DurableTask.Core.Serializing; + + /// + /// Settings that determine how a task orchestrator interacts with entities. + /// + public class TaskOrchestrationEntityParameters + { + /// + /// The time window within which entity messages should be deduplicated and reordered. + /// This is zero for providers that already guarantee exactly-once and ordered delivery. + /// + public TimeSpan EntityMessageReorderWindow { get; set; } + + /// + /// Construct a based on the given backend properties. + /// + /// The backend properties. + /// The constructed object, or null if is null. + public static TaskOrchestrationEntityParameters? FromEntityBackendProperties(EntityBackendProperties? properties) + { + if (properties == null) + { + return null; + } + + return new TaskOrchestrationEntityParameters() + { + EntityMessageReorderWindow = properties.EntityMessageReorderWindow, + }; + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/Exceptions/EntitySchedulerException.cs b/src/DurableTask.Core/Exceptions/EntitySchedulerException.cs new file mode 100644 index 000000000..d79541cf4 --- /dev/null +++ b/src/DurableTask.Core/Exceptions/EntitySchedulerException.cs @@ -0,0 +1,61 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +#nullable enable +namespace DurableTask.Core.Exceptions +{ + using System; + using System.Runtime.Serialization; + + /// + /// Exception used to describe various issues encountered by the entity scheduler. + /// + [Serializable] + public class EntitySchedulerException : Exception + { + /// + /// Initializes a new instance of the class. + /// + public EntitySchedulerException() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The message that describes the error. + public EntitySchedulerException(string message) + : base(message) + { + } + + /// + /// Initializes an new instance of the class. + /// + /// The message that describes the error. + /// The exception that was caught. + public EntitySchedulerException(string errorMessage, Exception innerException) + : base(errorMessage, innerException) + { + } + + /// + /// Initializes a new instance of the class with serialized data. + /// + /// The System.Runtime.Serialization.SerializationInfo that holds the serialized object data about the exception being thrown. + /// The System.Runtime.Serialization.StreamingContext that contains contextual information about the source or destination. + protected EntitySchedulerException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/FailureDetails.cs b/src/DurableTask.Core/FailureDetails.cs index b99584833..ddf1f1a33 100644 --- a/src/DurableTask.Core/FailureDetails.cs +++ b/src/DurableTask.Core/FailureDetails.cs @@ -19,7 +19,7 @@ namespace DurableTask.Core using Newtonsoft.Json; /// - /// Details of an activity or orchestration failure. + /// Details of an activity, orchestration, or entity operation failure. /// [Serializable] public class FailureDetails : IEquatable diff --git a/src/DurableTask.Core/Logging/EventIds.cs b/src/DurableTask.Core/Logging/EventIds.cs index 963de5f71..2998e5f8d 100644 --- a/src/DurableTask.Core/Logging/EventIds.cs +++ b/src/DurableTask.Core/Logging/EventIds.cs @@ -47,6 +47,10 @@ static class EventIds public const int OrchestrationExecuted = 52; public const int OrchestrationAborted = 53; public const int DiscardingMessage = 54; + public const int EntityBatchExecuting = 55; + public const int EntityBatchExecuted = 56; + public const int EntityLockAcquired = 57; + public const int EntityLockReleased = 58; public const int TaskActivityStarting = 60; public const int TaskActivityCompleted = 61; diff --git a/src/DurableTask.Core/Logging/LogEvents.cs b/src/DurableTask.Core/Logging/LogEvents.cs index a914154a2..ebf489ded 100644 --- a/src/DurableTask.Core/Logging/LogEvents.cs +++ b/src/DurableTask.Core/Logging/LogEvents.cs @@ -14,9 +14,11 @@ namespace DurableTask.Core.Logging { using System; + using System.Linq; using System.Text; using DurableTask.Core.Command; using DurableTask.Core.Common; + using DurableTask.Core.Entities.OperationFormat; using DurableTask.Core.History; using Microsoft.Extensions.Logging; @@ -1177,6 +1179,223 @@ void IEventSourceEvent.WriteEventSource() => Utils.PackageVersion); } + /// + /// Log event representing a task hub worker executing a batch of entity operations. + /// + internal class EntityBatchExecuting : StructuredLogEvent, IEventSourceEvent + { + public EntityBatchExecuting(EntityBatchRequest request) + { + this.InstanceId = request.InstanceId; + this.OperationCount = request.Operations.Count; + this.EntityStateLength = request.EntityState?.Length ?? 0; + } + + [StructuredLogField] + public string InstanceId { get; } + + [StructuredLogField] + public int OperationCount { get; } + + [StructuredLogField] + public int EntityStateLength { get; } + + public override EventId EventId => new EventId( + EventIds.EntityBatchExecuting, + nameof(EventIds.EntityBatchExecuting)); + + public override LogLevel Level => LogLevel.Debug; + + protected override string CreateLogMessage() => + $"{this.InstanceId}: executing batch of {this.OperationCount} operations on entity state of length {this.EntityStateLength}."; + + void IEventSourceEvent.WriteEventSource() => + StructuredEventSource.Log.EntityBatchExecuting( + this.InstanceId, + this.OperationCount, + this.EntityStateLength, + Utils.AppName, + Utils.PackageVersion); + } + + /// + /// Log event representing a task hub worker executed a batch of entity operations. + /// + internal class EntityBatchExecuted : StructuredLogEvent, IEventSourceEvent + { + public EntityBatchExecuted(EntityBatchRequest request, EntityBatchResult result) + { + this.InstanceId = request.InstanceId; + this.OperationCount = request.Operations.Count; + this.ResultCount = result.Results.Count; + this.ErrorCount = result.Results.Count(x => x.IsError); + this.ActionCount = result.Actions.Count; + this.EntityStateLength = request.EntityState?.Length ?? 0; + } + + [StructuredLogField] + public string InstanceId { get; } + + [StructuredLogField] + public int OperationCount { get; } + + [StructuredLogField] + public int ResultCount { get; } + + [StructuredLogField] + public int ErrorCount { get; } + + [StructuredLogField] + public int ActionCount { get; } + + [StructuredLogField] + public int EntityStateLength { get; } + + public override EventId EventId => new EventId( + EventIds.EntityBatchExecuting, + nameof(EventIds.EntityBatchExecuting)); + + public override LogLevel Level => LogLevel.Information; + + protected override string CreateLogMessage() => + $"{this.InstanceId}: completed {this.ResultCount} of {this.OperationCount} entity operations, resulting in {this.ErrorCount} errors, {this.ActionCount} actions, and entity state of length {this.EntityStateLength}."; + + void IEventSourceEvent.WriteEventSource() => + StructuredEventSource.Log.EntityBatchExecuted( + this.InstanceId, + this.OperationCount, + this.ResultCount, + this.ErrorCount, + this.ActionCount, + this.EntityStateLength, + Utils.AppName, + Utils.PackageVersion); + } + + /// + /// Logs that an entity processed a lock acquire message. + /// + internal class EntityLockAcquired : StructuredLogEvent, IEventSourceEvent + { + public EntityLockAcquired(string entityId, Core.Entities.EventFormat.RequestMessage message) + { + this.EntityId = entityId; + this.InstanceId = message.ParentInstanceId; + this.ExecutionId = message.ParentExecutionId; + this.CriticalSectionId = message.Id; + this.Position = message.Position; + + if (message.LockSet != null) + { + this.LockSet = string.Join(",", message.LockSet.Select(id => id.ToString())); + } + } + + /// + /// The entity that is being locked. + /// + [StructuredLogField] + public string EntityId { get; } + + /// + /// The instance ID of the orchestration that is executing the critical section. + /// + [StructuredLogField] + public string InstanceId { get; set; } + + /// + /// The execution ID of the orchestration that is executing the critical section. + /// + [StructuredLogField] + public string ExecutionId { get; set; } + + /// + /// The unique ID of the critical section that is acquiring this lock. + /// + [StructuredLogField] + public Guid CriticalSectionId { get; set; } + + /// + /// The ordered set of locks that are being acquired for this critical section. + /// + [StructuredLogField] + public string LockSet { get; set; } + + /// + /// Which of the locks in is being acquired. + /// + [StructuredLogField] + public int Position { get; set; } + + public override EventId EventId => new EventId( + EventIds.EntityLockAcquired, + nameof(EventIds.EntityLockAcquired)); + + public override LogLevel Level => LogLevel.Information; + + protected override string CreateLogMessage() => + $"{this.EntityId}: acquired lock {this.Position+1}/{this.LockSet.Length} for orchestration instanceId={this.InstanceId} executionId={this.ExecutionId} criticalSectionId={this.CriticalSectionId}"; + + void IEventSourceEvent.WriteEventSource() => + StructuredEventSource.Log.EntityLockAcquired( + this.EntityId, + this.InstanceId ?? string.Empty, + this.ExecutionId ?? string.Empty, + this.CriticalSectionId, + this.LockSet ?? string.Empty, + this.Position, + Utils.AppName, + Utils.PackageVersion); + } + + /// + /// Logs that an entity processed a lock release message. + /// + internal class EntityLockReleased : StructuredLogEvent, IEventSourceEvent + { + public EntityLockReleased(string entityId, Core.Entities.EventFormat.ReleaseMessage message) + { + this.EntityId = entityId; + this.InstanceId = message.ParentInstanceId; + this.CriticalSectionId = message.Id; + } + + /// + /// The entity that is being unlocked. + /// + [StructuredLogField] + public string EntityId { get; } + + /// + /// The instance ID of the orchestration that is executing the critical section. + /// + [StructuredLogField] + public string InstanceId { get; set; } + + /// + /// The unique ID of the critical section that is releasing the lock after completing. + /// + [StructuredLogField] + public string CriticalSectionId { get; set; } + + public override EventId EventId => new EventId( + EventIds.EntityLockReleased, + nameof(EventIds.EntityLockReleased)); + + public override LogLevel Level => LogLevel.Information; + + protected override string CreateLogMessage() => + $"{this.EntityId}: released lock for orchestration instanceId={this.InstanceId} criticalSectionId={this.CriticalSectionId}"; + + void IEventSourceEvent.WriteEventSource() => + StructuredEventSource.Log.EntityLockReleased( + this.EntityId, + this.InstanceId ?? string.Empty, + this.CriticalSectionId ?? string.Empty, + Utils.AppName, + Utils.PackageVersion); + } + /// /// Log event indicating that an activity execution is starting. /// diff --git a/src/DurableTask.Core/Logging/LogHelper.cs b/src/DurableTask.Core/Logging/LogHelper.cs index f4d1ffe34..61d2dc05c 100644 --- a/src/DurableTask.Core/Logging/LogHelper.cs +++ b/src/DurableTask.Core/Logging/LogHelper.cs @@ -17,7 +17,7 @@ namespace DurableTask.Core.Logging using System.Collections.Generic; using System.Text; using DurableTask.Core.Command; - using DurableTask.Core.Common; + using DurableTask.Core.Entities.OperationFormat; using DurableTask.Core.History; using Microsoft.Extensions.Logging; @@ -561,6 +561,58 @@ internal void RenewOrchestrationWorkItemFailed(TaskOrchestrationWorkItem workIte } } + + /// + /// Logs that an entity operation batch is about to start executing. + /// + /// The batch request. + internal void EntityBatchExecuting(EntityBatchRequest request) + { + if (this.IsStructuredLoggingEnabled) + { + this.WriteStructuredLog(new LogEvents.EntityBatchExecuting(request)); + } + } + + /// + /// Logs that an entity operation batch completed its execution. + /// + /// The batch request. + /// The batch result. + internal void EntityBatchExecuted(EntityBatchRequest request, EntityBatchResult result) + { + if (this.IsStructuredLoggingEnabled) + { + this.WriteStructuredLog(new LogEvents.EntityBatchExecuted(request, result)); + } + } + + /// + /// Logs that an entity processed a lock acquire message. + /// + /// The entity id. + /// The message. + internal void EntityLockAcquired(string entityId, Core.Entities.EventFormat.RequestMessage message) + { + if (this.IsStructuredLoggingEnabled) + { + this.WriteStructuredLog(new LogEvents.EntityLockAcquired(entityId, message)); + } + } + + /// + /// Logs that an entity processed a lock release message. + /// + /// The entity id. + /// The message. + internal void EntityLockReleased(string entityId, Core.Entities.EventFormat.ReleaseMessage message) + { + if (this.IsStructuredLoggingEnabled) + { + this.WriteStructuredLog(new LogEvents.EntityLockReleased(entityId, message)); + } + } + #endregion #region Activity dispatcher diff --git a/src/DurableTask.Core/Logging/StructuredEventSource.cs b/src/DurableTask.Core/Logging/StructuredEventSource.cs index b9edc0a46..b6ec19a32 100644 --- a/src/DurableTask.Core/Logging/StructuredEventSource.cs +++ b/src/DurableTask.Core/Logging/StructuredEventSource.cs @@ -624,6 +624,102 @@ internal void DiscardingMessage( } } + [Event(EventIds.EntityBatchExecuting, Level = EventLevel.Informational, Version = 1)] + internal void EntityBatchExecuting( + string InstanceId, + int OperationCount, + int EntityStateLength, + string AppName, + string ExtensionVersion) + { + if (this.IsEnabled(EventLevel.Informational)) + { + // TODO: Use WriteEventCore for better performance + this.WriteEvent( + EventIds.EntityBatchExecuting, + InstanceId, + OperationCount, + EntityStateLength, + AppName, + ExtensionVersion); + } + } + + [Event(EventIds.EntityBatchExecuted, Level = EventLevel.Informational, Version = 1)] + internal void EntityBatchExecuted( + string InstanceId, + int OperationCount, + int ResultCount, + int ErrorCount, + int ActionCount, + int EntityStateLength, + string AppName, + string ExtensionVersion) + { + if (this.IsEnabled(EventLevel.Informational)) + { + // TODO: Use WriteEventCore for better performance + this.WriteEvent( + EventIds.EntityBatchExecuted, + InstanceId, + OperationCount, + ResultCount, + ErrorCount, + ActionCount, + EntityStateLength, + AppName, + ExtensionVersion); + } + } + + [Event(EventIds.EntityLockAcquired, Level = EventLevel.Informational, Version = 1)] + internal void EntityLockAcquired( + string EntityId, + string InstanceId, + string ExecutionId, + Guid CriticalSectionId, + string LockSet, + int Position, + string AppName, + string ExtensionVersion) + { + if (this.IsEnabled(EventLevel.Informational)) + { + // TODO: Use WriteEventCore for better performance + this.WriteEvent( + EventIds.EntityLockAcquired, + EntityId, + InstanceId, + ExecutionId, + CriticalSectionId, + LockSet, + Position, + AppName, + ExtensionVersion); + } + } + + [Event(EventIds.EntityLockReleased, Level = EventLevel.Informational, Version = 1)] + internal void EntityLockReleased( + string EntityId, + string InstanceId, + string Id, + string AppName, + string ExtensionVersion) + { + if (this.IsEnabled(EventLevel.Informational)) + { + // TODO: Use WriteEventCore for better performance + this.WriteEvent( + EventIds.EntityLockReleased, + EntityId, + InstanceId, + Id, + AppName, + ExtensionVersion); + } + } + [Event(EventIds.TaskActivityStarting, Level = EventLevel.Informational, Version = 1)] internal void TaskActivityStarting( string InstanceId, diff --git a/src/DurableTask.Core/OrchestrationContext.cs b/src/DurableTask.Core/OrchestrationContext.cs index 52238bbc2..290fc9ae1 100644 --- a/src/DurableTask.Core/OrchestrationContext.cs +++ b/src/DurableTask.Core/OrchestrationContext.cs @@ -18,6 +18,7 @@ namespace DurableTask.Core using System.Threading; using System.Threading.Tasks; using Castle.DynamicProxy; + using DurableTask.Core.Entities; using DurableTask.Core.Serializing; /// @@ -67,6 +68,11 @@ public abstract class OrchestrationContext /// internal ErrorPropagationMode ErrorPropagationMode { get; set; } + /// + /// Information about backend entity support, or null if the configured backend does not support entities. + /// + internal TaskOrchestrationEntityParameters EntityParameters { get; set; } + /// /// Create a proxy client class to schedule remote TaskActivities via a strongly typed interface. /// diff --git a/src/DurableTask.Core/Query/OrchestrationQuery.cs b/src/DurableTask.Core/Query/OrchestrationQuery.cs index 2932d11da..0fc4140f6 100644 --- a/src/DurableTask.Core/Query/OrchestrationQuery.cs +++ b/src/DurableTask.Core/Query/OrchestrationQuery.cs @@ -69,5 +69,11 @@ public OrchestrationQuery() { } /// Determines whether the query will include the input of the orchestration. /// public bool FetchInputsAndOutputs { get; set; } = true; + + /// + /// Whether to exclude entities from the query results. This defaults to false for compatibility with older SDKs, + /// but is set to true by the newer SDKs. + /// + public bool ExcludeEntities { get; set; } = false; } } \ No newline at end of file diff --git a/src/DurableTask.Core/TaskEntityDispatcher.cs b/src/DurableTask.Core/TaskEntityDispatcher.cs new file mode 100644 index 000000000..df7b1bef2 --- /dev/null +++ b/src/DurableTask.Core/TaskEntityDispatcher.cs @@ -0,0 +1,883 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- +namespace DurableTask.Core +{ + using System; + using System.Collections.Generic; + using System.Diagnostics; + using System.Threading; + using System.Threading.Tasks; + using DurableTask.Core.Common; + using DurableTask.Core.Entities; + using DurableTask.Core.Entities.EventFormat; + using DurableTask.Core.Entities.OperationFormat; + using DurableTask.Core.Exceptions; + using DurableTask.Core.History; + using DurableTask.Core.Logging; + using DurableTask.Core.Middleware; + using DurableTask.Core.Tracing; + using Newtonsoft.Json; + + /// + /// Dispatcher for orchestrations and entities to handle processing and renewing, completion of orchestration events. + /// + public class TaskEntityDispatcher + { + readonly INameVersionObjectManager objectManager; + readonly IOrchestrationService orchestrationService; + readonly IEntityOrchestrationService entityOrchestrationService; + readonly WorkItemDispatcher dispatcher; + readonly DispatchMiddlewarePipeline dispatchPipeline; + readonly EntityBackendProperties entityBackendProperties; + readonly LogHelper logHelper; + readonly ErrorPropagationMode errorPropagationMode; + readonly TaskOrchestrationDispatcher.NonBlockingCountdownLock concurrentSessionLock; + + internal TaskEntityDispatcher( + IOrchestrationService orchestrationService, + INameVersionObjectManager entityObjectManager, + DispatchMiddlewarePipeline entityDispatchPipeline, + LogHelper logHelper, + ErrorPropagationMode errorPropagationMode) + { + this.objectManager = entityObjectManager ?? throw new ArgumentNullException(nameof(entityObjectManager)); + this.orchestrationService = orchestrationService ?? throw new ArgumentNullException(nameof(orchestrationService)); + this.dispatchPipeline = entityDispatchPipeline ?? throw new ArgumentNullException(nameof(entityDispatchPipeline)); + this.logHelper = logHelper ?? throw new ArgumentNullException(nameof(logHelper)); + this.errorPropagationMode = errorPropagationMode; + this.entityOrchestrationService = (orchestrationService as IEntityOrchestrationService)!; + this.entityBackendProperties = entityOrchestrationService.EntityBackendProperties; + + this.dispatcher = new WorkItemDispatcher( + "TaskEntityDispatcher", + item => item == null ? string.Empty : item.InstanceId, + this.OnFetchWorkItemAsync, + this.OnProcessWorkItemSessionAsync) + { + GetDelayInSecondsAfterOnFetchException = orchestrationService.GetDelayInSecondsAfterOnFetchException, + GetDelayInSecondsAfterOnProcessException = orchestrationService.GetDelayInSecondsAfterOnProcessException, + SafeReleaseWorkItem = orchestrationService.ReleaseTaskOrchestrationWorkItemAsync, + AbortWorkItem = orchestrationService.AbandonTaskOrchestrationWorkItemAsync, + DispatcherCount = orchestrationService.TaskOrchestrationDispatcherCount, + MaxConcurrentWorkItems = this.entityBackendProperties.MaxConcurrentTaskEntityWorkItems, + LogHelper = logHelper, + }; + + // To avoid starvation, we only allow half of all concurrently executing entities to + // leverage extended sessions. + var maxConcurrentSessions = (int)Math.Ceiling(this.dispatcher.MaxConcurrentWorkItems / 2.0); + this.concurrentSessionLock = new TaskOrchestrationDispatcher.NonBlockingCountdownLock(maxConcurrentSessions); + } + + /// + /// The entity options configured, or null if the backend does not support entities. + /// + public EntityBackendProperties EntityBackendProperties => this.entityBackendProperties; + + /// + /// Starts the dispatcher to start getting and processing entity message batches + /// + public async Task StartAsync() + { + await this.dispatcher.StartAsync(); + } + + /// + /// Stops the dispatcher to stop getting and processing entity message batches + /// + /// Flag indicating whether to stop gracefully or immediately + public async Task StopAsync(bool forced) + { + await this.dispatcher.StopAsync(forced); + } + + /// + /// Method to get the next work item to process within supplied timeout + /// + /// The max timeout to wait + /// A cancellation token used to cancel a fetch operation. + /// A new TaskOrchestrationWorkItem + protected Task OnFetchWorkItemAsync(TimeSpan receiveTimeout, CancellationToken cancellationToken) + { + return this.entityOrchestrationService.LockNextEntityWorkItemAsync(receiveTimeout, cancellationToken); + } + + async Task OnProcessWorkItemSessionAsync(TaskOrchestrationWorkItem workItem) + { + try + { + if (workItem.Session == null) + { + // Legacy behavior + await this.OnProcessWorkItemAsync(workItem); + return; + } + + var isExtendedSession = false; + + var processCount = 0; + try + { + while (true) + { + // While the work item contains messages that need to be processed, execute them. + if (workItem.NewMessages?.Count > 0) + { + bool isCompletedOrInterrupted = await this.OnProcessWorkItemAsync(workItem); + if (isCompletedOrInterrupted) + { + break; + } + + processCount++; + } + + // Fetches beyond the first require getting an extended session lock, used to prevent starvation. + if (processCount > 0 && !isExtendedSession) + { + isExtendedSession = this.concurrentSessionLock.Acquire(); + if (!isExtendedSession) + { + break; + } + } + + Stopwatch timer = Stopwatch.StartNew(); + + // Wait for new messages to arrive for the session. This call is expected to block (asynchronously) + // until either new messages are available or until a provider-specific timeout has expired. + workItem.NewMessages = await workItem.Session.FetchNewOrchestrationMessagesAsync(workItem); + if (workItem.NewMessages == null) + { + break; + } + + workItem.OrchestrationRuntimeState.NewEvents.Clear(); + } + } + finally + { + if (isExtendedSession) + { + this.concurrentSessionLock.Release(); + } + } + } + catch (SessionAbortedException e) + { + // Either the orchestration or the orchestration service explicitly abandoned the session. + OrchestrationInstance instance = workItem.OrchestrationRuntimeState?.OrchestrationInstance ?? new OrchestrationInstance { InstanceId = workItem.InstanceId }; + this.logHelper.OrchestrationAborted(instance, e.Message); + await this.orchestrationService.AbandonTaskOrchestrationWorkItemAsync(workItem); + } + } + + class WorkItemEffects + { + public List ActivityMessages; + public List TimerMessages; + public List InstanceMessages; + public int taskIdCounter; + public string InstanceId; + public OrchestrationRuntimeState RuntimeState; + } + + /// + /// Method to process a new work item + /// + /// The work item to process + protected async Task OnProcessWorkItemAsync(TaskOrchestrationWorkItem workItem) + { + OrchestrationRuntimeState originalOrchestrationRuntimeState = workItem.OrchestrationRuntimeState; + + OrchestrationRuntimeState runtimeState = workItem.OrchestrationRuntimeState; + runtimeState.AddEvent(new OrchestratorStartedEvent(-1)); + + Task renewTask = null; + using var renewCancellationTokenSource = new CancellationTokenSource(); + if (workItem.LockedUntilUtc < DateTime.MaxValue) + { + // start a task to run RenewUntil + renewTask = Task.Factory.StartNew( + () => TaskOrchestrationDispatcher.RenewUntil(workItem, this.orchestrationService, this.logHelper, nameof(TaskEntityDispatcher), renewCancellationTokenSource.Token), + renewCancellationTokenSource.Token); + } + + WorkItemEffects effects = new WorkItemEffects() + { + ActivityMessages = new List(), + TimerMessages = new List(), + InstanceMessages = new List(), + taskIdCounter = 0, + InstanceId = workItem.InstanceId, + RuntimeState = runtimeState, + }; + + try + { + // Assumes that: if the batch contains a new "ExecutionStarted" event, it is the first message in the batch. + if (!TaskOrchestrationDispatcher.ReconcileMessagesWithState(workItem, nameof(TaskEntityDispatcher), this.errorPropagationMode, this.logHelper)) + { + // TODO : mark an orchestration as faulted if there is data corruption + this.logHelper.DroppingOrchestrationWorkItem(workItem, "Received work-item for an invalid orchestration"); + } + else + { + + // we start with processing all the requests and figuring out which ones to execute now + // results can depend on whether the entity is locked, what the maximum batch size is, + // and whether the messages arrived out of order + + this.DetermineWork(workItem.OrchestrationRuntimeState, + out SchedulerState schedulerState, + out Work workToDoNow); + + if (workToDoNow.OperationCount > 0) + { + // execute the user-defined operations on this entity, via the middleware + var result = await this.ExecuteViaMiddlewareAsync(workToDoNow, runtimeState.OrchestrationInstance, schedulerState.EntityState); + var operationResults = result.Results!; + + // if we encountered an error, record it as the result of the operations + // so that callers are notified that the operation did not succeed. + if (result.FailureDetails != null) + { + OperationResult errorResult = new OperationResult() + { + // for older SDKs only + Result = result.FailureDetails.ErrorMessage, + ErrorMessage = "entity dispatch failed", + + // for newer SDKs only + FailureDetails = result.FailureDetails, + }; + + for (int i = operationResults.Count; i < workToDoNow.OperationCount; i++) + { + operationResults.Add(errorResult); + } + } + + // go through all results + // for each operation that is not a signal, send a result message back to the calling orchestrator + for (int i = 0; i < result.Results!.Count; i++) + { + var req = workToDoNow.Operations[i]; + if (!req.IsSignal) + { + this.SendResultMessage(effects, req, result.Results[i]); + } + } + + if (result.Results.Count < workToDoNow.OperationCount) + { + // some requests were not processed (e.g. due to shutdown or timeout) + // in this case we just defer the work so it can be retried + var deferred = workToDoNow.RemoveDeferredWork(result.Results.Count); + schedulerState.PutBack(deferred); + workToDoNow.ToBeContinued(schedulerState); + } + + // update the entity state based on the result + schedulerState.EntityState = result.EntityState; + + // perform the actions + foreach (var action in result.Actions!) + { + switch (action) + { + case (SendSignalOperationAction sendSignalAction): + this.SendSignalMessage(effects, schedulerState, sendSignalAction); + break; + case (StartNewOrchestrationOperationAction startAction): + this.ProcessSendStartMessage(effects, runtimeState, startAction); + break; + } + } + } + + // process the lock request, if any + if (workToDoNow.LockRequest != null) + { + this.ProcessLockRequest(effects, schedulerState, workToDoNow.LockRequest); + } + + if (workToDoNow.ToBeRescheduled != null) + { + foreach (var request in workToDoNow.ToBeRescheduled) + { + // Reschedule all signals that were received before their time + this.SendScheduledSelfMessage(effects, request); + } + } + + if (workToDoNow.SuspendAndContinue) + { + this.SendContinueSelfMessage(effects); + } + + // this batch is complete. Since this is an entity, we now + // (always) start a new execution, as in continue-as-new + + var serializedSchedulerState = this.SerializeSchedulerStateForNextExecution(schedulerState); + var nextExecutionStartedEvent = new ExecutionStartedEvent(-1, serializedSchedulerState) + { + OrchestrationInstance = new OrchestrationInstance + { + InstanceId = workItem.InstanceId, + ExecutionId = Guid.NewGuid().ToString("N") + }, + Tags = runtimeState.Tags, + ParentInstance = runtimeState.ParentInstance, + Name = runtimeState.Name, + Version = runtimeState.Version + }; + var entityStatus = new EntityStatus() + { + EntityExists = schedulerState.EntityExists, + BacklogQueueSize = schedulerState.Queue?.Count ?? 0, + LockedBy = schedulerState.LockedBy, + }; + var serializedEntityStatus = JsonConvert.SerializeObject(entityStatus, Serializer.InternalSerializerSettings); + + // create the new runtime state for the next execution + runtimeState = new OrchestrationRuntimeState(); + runtimeState.Status = serializedEntityStatus; + runtimeState.AddEvent(new OrchestratorStartedEvent(-1)); + runtimeState.AddEvent(nextExecutionStartedEvent); + runtimeState.AddEvent(new OrchestratorCompletedEvent(-1)); + } + } + finally + { + if (renewTask != null) + { + try + { + renewCancellationTokenSource.Cancel(); + await renewTask; + } + catch (ObjectDisposedException) + { + // ignore + } + catch (OperationCanceledException) + { + // ignore + } + } + } + + OrchestrationState instanceState = (runtimeState.ExecutionStartedEvent != null) ? + instanceState = Utils.BuildOrchestrationState(runtimeState) : null; + + if (workItem.RestoreOriginalRuntimeStateDuringCompletion) + { + // some backends expect the original runtime state object + workItem.OrchestrationRuntimeState = originalOrchestrationRuntimeState; + } + else + { + workItem.OrchestrationRuntimeState = runtimeState; + } + + await this.orchestrationService.CompleteTaskOrchestrationWorkItemAsync( + workItem, + runtimeState, + effects.ActivityMessages, + effects.InstanceMessages, + effects.TimerMessages, + null, + instanceState); + + if (workItem.RestoreOriginalRuntimeStateDuringCompletion) + { + workItem.OrchestrationRuntimeState = runtimeState; + } + + return true; + } + + void ProcessLockRequest(WorkItemEffects effects, SchedulerState schedulerState, RequestMessage request) + { + this.logHelper.EntityLockAcquired(effects.InstanceId, request); + + // mark the entity state as locked + schedulerState.LockedBy = request.ParentInstanceId; + + request.Position++; + + if (request.Position < request.LockSet.Length) + { + // send lock request to next entity in the lock set + var target = new OrchestrationInstance() { InstanceId = request.LockSet[request.Position].ToString() }; + this.SendLockRequestMessage(effects, schedulerState, target, request); + } + else + { + // send lock acquisition completed response back to originating orchestration instance + var target = new OrchestrationInstance() { InstanceId = request.ParentInstanceId, ExecutionId = request.ParentExecutionId }; + this.SendLockResponseMessage(effects, target, request.Id); + } + } + + string SerializeSchedulerStateForNextExecution(SchedulerState schedulerState) + { + if (this.entityBackendProperties.SupportsImplicitEntityDeletion && schedulerState.IsEmpty && !schedulerState.Suspended) + { + // this entity scheduler is idle and the entity is deleted, so the instance and history can be removed from storage + // we convey this to the durability provider by issuing a continue-as-new with null input + return null; + } + else + { + // we persist the state of the entity scheduler and entity + return JsonConvert.SerializeObject(schedulerState, typeof(SchedulerState), Serializer.InternalSerializerSettings); + } + } + + #region Preprocess to determine work + + void DetermineWork(OrchestrationRuntimeState runtimeState, out SchedulerState schedulerState, out Work batch) + { + string instanceId = runtimeState.OrchestrationInstance.InstanceId; + schedulerState = new SchedulerState(); + batch = new Work(); + + Queue lockHolderMessages = null; + + foreach (HistoryEvent e in runtimeState.Events) + { + switch (e.EventType) + { + case EventType.ExecutionStarted: + + + if (runtimeState.Input != null) + { + try + { + // restore the scheduler state from the input + JsonConvert.PopulateObject(runtimeState.Input, schedulerState, Serializer.InternalSerializerSettings); + } + catch (Exception exception) + { + throw new EntitySchedulerException("Failed to deserialize entity scheduler state - may be corrupted or wrong version.", exception); + } + } + break; + + case EventType.EventRaised: + EventRaisedEvent eventRaisedEvent = (EventRaisedEvent)e; + + if (EntityMessageEventNames.IsRequestMessage(eventRaisedEvent.Name)) + { + // we are receiving an operation request or a lock request + var requestMessage = new RequestMessage(); + + try + { + JsonConvert.PopulateObject(eventRaisedEvent.Input, requestMessage, Serializer.InternalSerializerSettings); + } + catch (Exception exception) + { + throw new EntitySchedulerException("Failed to deserialize incoming request message - may be corrupted or wrong version.", exception); + } + + IEnumerable deliverNow; + + if (requestMessage.ScheduledTime.HasValue) + { + if ((requestMessage.ScheduledTime.Value - DateTime.UtcNow) > TimeSpan.FromMilliseconds(100)) + { + // message was delivered too early. This can happen e.g. if the orchestration service has limits on the delay times for messages. + // We handle this by rescheduling the message instead of processing it. + deliverNow = Array.Empty(); + batch.AddMessageToBeRescheduled(requestMessage); + } + else + { + // the message is scheduled to be delivered immediately. + // There are no FIFO guarantees for scheduled messages, so we skip the message sorter. + deliverNow = new RequestMessage[] { requestMessage }; + } + } + else + { + // run this through the message sorter to help with reordering and duplicate filtering + deliverNow = schedulerState.MessageSorter.ReceiveInOrder(requestMessage, this.entityBackendProperties.EntityMessageReorderWindow); + } + + foreach (var message in deliverNow) + { + if (schedulerState.LockedBy != null && schedulerState.LockedBy == message.ParentInstanceId) + { + if (lockHolderMessages == null) + { + lockHolderMessages = new Queue(); + } + + lockHolderMessages.Enqueue(message); + } + else + { + schedulerState.Enqueue(message); + } + } + } + else if (EntityMessageEventNames.IsReleaseMessage(eventRaisedEvent.Name)) + { + // we are receiving a lock release + var message = new ReleaseMessage(); + try + { + // restore the scheduler state from the input + JsonConvert.PopulateObject(eventRaisedEvent.Input, message, Serializer.InternalSerializerSettings); + } + catch (Exception exception) + { + throw new EntitySchedulerException("Failed to deserialize lock release message - may be corrupted or wrong version.", exception); + } + + if (schedulerState.LockedBy == message.ParentInstanceId) + { + this.logHelper.EntityLockReleased(instanceId, message); + schedulerState.LockedBy = null; + } + } + else + { + // this is a continue message. + // Resumes processing of previously queued operations, if any. + schedulerState.Suspended = false; + } + + break; + } + } + + // lock holder messages go to the front of the queue + if (lockHolderMessages != null) + { + schedulerState.PutBack(lockHolderMessages); + } + + if (!schedulerState.Suspended) + { + // 2. We add as many requests from the queue to the batch as possible, + // stopping at lock requests or when the maximum batch size is reached + while (schedulerState.MayDequeue()) + { + if (batch.OperationCount == this.entityBackendProperties.MaxEntityOperationBatchSize) + { + // we have reached the maximum batch size already + // insert a delay after this batch to ensure write back + batch.ToBeContinued(schedulerState); + break; + } + + var request = schedulerState.Dequeue(); + + if (request.IsLockRequest) + { + batch.AddLockRequest(request); + break; + } + else + { + batch.AddOperation(request); + } + } + } + } + + class Work + { + List operationBatch; // a (possibly empty) sequence of operations to be executed on the entity + RequestMessage lockRequest = null; // zero or one lock request to be executed after all the operations + List toBeRescheduled; // a (possibly empty) list of timed messages that were delivered too early and should be rescheduled + bool suspendAndContinue; // a flag telling as to send ourselves a continue signal + + public int OperationCount => this.operationBatch?.Count ?? 0; + public IReadOnlyList Operations => this.operationBatch; + public IReadOnlyList ToBeRescheduled => this.toBeRescheduled; + public RequestMessage LockRequest => this.lockRequest; + public bool SuspendAndContinue => this.suspendAndContinue; + + public void AddOperation(RequestMessage operationMessage) + { + if (this.operationBatch == null) + { + this.operationBatch = new List(); + } + this.operationBatch.Add(operationMessage); + } + + public void AddLockRequest(RequestMessage lockRequest) + { + Debug.Assert(this.lockRequest == null); + this.lockRequest = lockRequest; + } + + public void AddMessageToBeRescheduled(RequestMessage requestMessage) + { + if (this.toBeRescheduled == null) + { + this.toBeRescheduled = new List(); + } + this.toBeRescheduled.Add(requestMessage); + } + + public void ToBeContinued(SchedulerState schedulerState) + { + if (!schedulerState.Suspended) + { + this.suspendAndContinue = true; + } + } + + public List GetOperationRequests() + { + var operations = new List(this.operationBatch.Count); + for (int i = 0; i < this.operationBatch.Count; i++) + { + var request = this.operationBatch[i]; + operations.Add(new OperationRequest() + { + Operation = request.Operation, + Id = request.Id, + Input = request.Input, + }); + } + return operations; + } + + public Queue RemoveDeferredWork(int index) + { + var deferred = new Queue(); + for (int i = index; i < this.operationBatch.Count; i++) + { + deferred.Enqueue(this.operationBatch[i]); + } + this.operationBatch.RemoveRange(index, this.operationBatch.Count - index); + if (this.lockRequest != null) + { + deferred.Enqueue(this.lockRequest); + this.lockRequest = null; + } + return deferred; + } + } + + #endregion + + #region Send Messages + + void SendResultMessage(WorkItemEffects effects, RequestMessage request, OperationResult result) + { + var destination = new OrchestrationInstance() + { + InstanceId = request.ParentInstanceId, + ExecutionId = request.ParentExecutionId, + }; + var responseMessage = new ResponseMessage() + { + Result = result.Result, + ErrorMessage = result.ErrorMessage, + FailureDetails = result.FailureDetails, + }; + this.ProcessSendEventMessage(effects, destination, EntityMessageEventNames.ResponseMessageEventName(request.Id), responseMessage); + } + + void SendSignalMessage(WorkItemEffects effects, SchedulerState schedulerState, SendSignalOperationAction action) + { + OrchestrationInstance destination = new OrchestrationInstance() + { + InstanceId = action.InstanceId + }; + RequestMessage message = new RequestMessage() + { + ParentInstanceId = effects.InstanceId, + ParentExecutionId = null, // for entities, message sorter persists across executions + Id = Guid.NewGuid(), + IsSignal = true, + Operation = action.Name, + ScheduledTime = action.ScheduledTime, + }; + string eventName; + if (action.ScheduledTime.HasValue) + { + DateTime original = action.ScheduledTime.Value; + DateTime capped = this.entityBackendProperties.GetCappedScheduledTime(DateTime.UtcNow, original); + eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(capped); + } + else + { + eventName = EntityMessageEventNames.RequestMessageEventName; + schedulerState.MessageSorter.LabelOutgoingMessage(message, action.InstanceId, DateTime.UtcNow, this.entityBackendProperties.EntityMessageReorderWindow); + } + this.ProcessSendEventMessage(effects, destination, eventName, message); + } + + void SendLockRequestMessage(WorkItemEffects effects, SchedulerState schedulerState, OrchestrationInstance target, RequestMessage message) + { + schedulerState.MessageSorter.LabelOutgoingMessage(message, target.InstanceId, DateTime.UtcNow, this.entityBackendProperties.EntityMessageReorderWindow); + this.ProcessSendEventMessage(effects, target, EntityMessageEventNames.RequestMessageEventName, message); + } + + void SendLockResponseMessage(WorkItemEffects effects, OrchestrationInstance target, Guid requestId) + { + var message = new ResponseMessage() + { + // content is ignored by receiver but helps with tracing + Result = ResponseMessage.LockAcquisitionCompletion, + }; + this.ProcessSendEventMessage(effects, target, EntityMessageEventNames.ResponseMessageEventName(requestId), message); + } + + void SendScheduledSelfMessage(WorkItemEffects effects, RequestMessage request) + { + var self = new OrchestrationInstance() + { + InstanceId = effects.InstanceId, + }; + this.ProcessSendEventMessage(effects, self, EntityMessageEventNames.ScheduledRequestMessageEventName(request.ScheduledTime.Value), request); + } + + void SendContinueSelfMessage(WorkItemEffects effects) + { + var self = new OrchestrationInstance() + { + InstanceId = effects.InstanceId, + }; + this.ProcessSendEventMessage(effects, self, EntityMessageEventNames.ContinueMessageEventName, null); + } + + void ProcessSendEventMessage(WorkItemEffects effects, OrchestrationInstance destination, string eventName, object eventContent) + { + string serializedContent = null; + if (eventContent != null) + { + serializedContent = JsonConvert.SerializeObject(eventContent, Serializer.InternalSerializerSettings); + } + + var eventSentEvent = new EventSentEvent(effects.taskIdCounter++) + { + InstanceId = destination.InstanceId, + Name = eventName, + Input = serializedContent, + }; + this.logHelper.RaisingEvent(effects.RuntimeState.OrchestrationInstance, eventSentEvent); + + effects.InstanceMessages.Add(new TaskMessage + { + OrchestrationInstance = destination, + Event = new EventRaisedEvent(-1, serializedContent) + { + Name = eventName, + Input = serializedContent, + }, + }); + } + + void ProcessSendStartMessage(WorkItemEffects effects, OrchestrationRuntimeState runtimeState, StartNewOrchestrationOperationAction action) + { + OrchestrationInstance destination = new OrchestrationInstance() + { + InstanceId = action.InstanceId, + ExecutionId = Guid.NewGuid().ToString("N"), + }; + var executionStartedEvent = new ExecutionStartedEvent(-1, action.Input) + { + Tags = OrchestrationTags.MergeTags( + runtimeState.Tags, + new Dictionary() { { OrchestrationTags.FireAndForget, "" } }), + OrchestrationInstance = destination, + ScheduledStartTime = action.ScheduledStartTime, + ParentInstance = new ParentInstance + { + OrchestrationInstance = runtimeState.OrchestrationInstance, + Name = runtimeState.Name, + Version = runtimeState.Version, + TaskScheduleId = effects.taskIdCounter++, + }, + Name = action.Name, + Version = action.Version, + }; + this.logHelper.SchedulingOrchestration(executionStartedEvent); + + effects.InstanceMessages.Add(new TaskMessage + { + OrchestrationInstance = destination, + Event = executionStartedEvent, + }); + } + + #endregion + + async Task ExecuteViaMiddlewareAsync(Work workToDoNow, OrchestrationInstance instance, string serializedEntityState) + { + // the request object that will be passed to the worker + var request = new EntityBatchRequest() + { + InstanceId = instance.InstanceId, + EntityState = serializedEntityState, + Operations = workToDoNow.GetOperationRequests(), + }; + + this.logHelper.EntityBatchExecuting(request); + + var entityId = EntityId.FromString(instance.InstanceId); + string entityName = entityId.Name; + + // Get the TaskEntity implementation. If it's not found, it either means that the developer never + // registered it (which is an error, and we'll throw for this further down) or it could be that some custom + // middleware (e.g. out-of-process execution middleware) is intended to implement the entity logic. + TaskEntity taskEntity = this.objectManager.GetObject(entityName, version: null); + + var dispatchContext = new DispatchMiddlewareContext(); + dispatchContext.SetProperty(request); + + await this.dispatchPipeline.RunAsync(dispatchContext, async _ => + { + // Check to see if the custom middleware intercepted and substituted the orchestration execution + // with its own execution behavior, providing us with the end results. If so, we can terminate + // the dispatch pipeline here. + var resultFromMiddleware = dispatchContext.GetProperty(); + if (resultFromMiddleware != null) + { + return; + } + + if (taskEntity == null) + { + throw TraceHelper.TraceExceptionInstance( + TraceEventType.Error, + "TaskOrchestrationDispatcher-EntityTypeMissing", + instance, + new TypeMissingException($"Entity not found: {entityName}")); + } + + var result = await taskEntity.ExecuteOperationBatchAsync(request); + + dispatchContext.SetProperty(result); + }); + + var result = dispatchContext.GetProperty(); + + this.logHelper.EntityBatchExecuted(request, result); + + return result; + } + } +} \ No newline at end of file diff --git a/src/DurableTask.Core/TaskHubClient.cs b/src/DurableTask.Core/TaskHubClient.cs index af03ac1a5..d7faa4961 100644 --- a/src/DurableTask.Core/TaskHubClient.cs +++ b/src/DurableTask.Core/TaskHubClient.cs @@ -33,6 +33,9 @@ public sealed class TaskHubClient readonly DataConverter defaultConverter; readonly LogHelper logHelper; + internal LogHelper LogHelper => this.logHelper; + internal DataConverter DefaultConverter => this.defaultConverter; + /// /// The orchestration service client for this task hub client /// diff --git a/src/DurableTask.Core/TaskHubWorker.cs b/src/DurableTask.Core/TaskHubWorker.cs index 1b93bd62e..5a45752c6 100644 --- a/src/DurableTask.Core/TaskHubWorker.cs +++ b/src/DurableTask.Core/TaskHubWorker.cs @@ -21,6 +21,7 @@ namespace DurableTask.Core using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; + using DurableTask.Core.Entities; using DurableTask.Core.Exceptions; using DurableTask.Core.Logging; using DurableTask.Core.Middleware; @@ -34,10 +35,13 @@ public sealed class TaskHubWorker : IDisposable { readonly INameVersionObjectManager activityManager; readonly INameVersionObjectManager orchestrationManager; + readonly INameVersionObjectManager entityManager; readonly DispatchMiddlewarePipeline orchestrationDispatchPipeline = new DispatchMiddlewarePipeline(); + readonly DispatchMiddlewarePipeline entityDispatchPipeline = new DispatchMiddlewarePipeline(); readonly DispatchMiddlewarePipeline activityDispatchPipeline = new DispatchMiddlewarePipeline(); + readonly bool dispatchEntitiesSeparately; readonly SemaphoreSlim slimLock = new SemaphoreSlim(1, 1); readonly LogHelper logHelper; @@ -51,6 +55,7 @@ public sealed class TaskHubWorker : IDisposable TaskActivityDispatcher activityDispatcher; TaskOrchestrationDispatcher orchestrationDispatcher; + TaskEntityDispatcher entityDispatcher; /// /// Create a new TaskHubWorker with given OrchestrationService @@ -60,7 +65,8 @@ public TaskHubWorker(IOrchestrationService orchestrationService) : this( orchestrationService, new NameVersionObjectManager(), - new NameVersionObjectManager()) + new NameVersionObjectManager(), + new NameVersionObjectManager()) { } @@ -75,6 +81,7 @@ public TaskHubWorker(IOrchestrationService orchestrationService, ILoggerFactory orchestrationService, new NameVersionObjectManager(), new NameVersionObjectManager(), + new NameVersionObjectManager(), loggerFactory) { } @@ -93,11 +100,11 @@ public TaskHubWorker( orchestrationService, orchestrationObjectManager, activityObjectManager, + new NameVersionObjectManager(), loggerFactory: null) { } - /// /// Create a new with given and name version managers /// @@ -110,11 +117,36 @@ public TaskHubWorker( INameVersionObjectManager orchestrationObjectManager, INameVersionObjectManager activityObjectManager, ILoggerFactory loggerFactory = null) + : this( + orchestrationService, + orchestrationObjectManager, + activityObjectManager, + new NameVersionObjectManager(), + loggerFactory: null) + { + } + + /// + /// Create a new TaskHubWorker with given OrchestrationService and name version managers + /// + /// Reference the orchestration service implementation + /// NameVersionObjectManager for Orchestrations + /// NameVersionObjectManager for Activities + /// The NameVersionObjectManager for entities. The version is the entity key. + /// The to use for logging + public TaskHubWorker( + IOrchestrationService orchestrationService, + INameVersionObjectManager orchestrationObjectManager, + INameVersionObjectManager activityObjectManager, + INameVersionObjectManager entityObjectManager, + ILoggerFactory loggerFactory = null) { this.orchestrationManager = orchestrationObjectManager ?? throw new ArgumentException("orchestrationObjectManager"); this.activityManager = activityObjectManager ?? throw new ArgumentException("activityObjectManager"); + this.entityManager = entityObjectManager ?? throw new ArgumentException("entityObjectManager"); this.orchestrationService = orchestrationService ?? throw new ArgumentException("orchestrationService"); this.logHelper = new LogHelper(loggerFactory?.CreateLogger("DurableTask.Core")); + this.dispatchEntitiesSeparately = (orchestrationService as IEntityOrchestrationService)?.EntityBackendProperties?.UseSeparateQueueForEntityWorkItems ?? false; } /// @@ -153,6 +185,15 @@ public void AddOrchestrationDispatcherMiddleware(Func + /// Adds a middleware delegate to the entity dispatch pipeline. + /// + /// Delegate to invoke whenever a message is dispatched to an entity. + public void AddEntityDispatcherMiddleware(Func, Task> middleware) + { + this.entityDispatchPipeline.Add(middleware ?? throw new ArgumentNullException(nameof(middleware))); + } + /// /// Adds a middleware delegate to the activity dispatch pipeline. /// @@ -192,10 +233,25 @@ public async Task StartAsync() this.logHelper, this.ErrorPropagationMode); + if (this.dispatchEntitiesSeparately) + { + this.entityDispatcher = new TaskEntityDispatcher( + this.orchestrationService, + this.entityManager, + this.entityDispatchPipeline, + this.logHelper, + this.ErrorPropagationMode); + } + await this.orchestrationService.StartAsync(); await this.orchestrationDispatcher.StartAsync(); await this.activityDispatcher.StartAsync(); + if (this.dispatchEntitiesSeparately) + { + await this.entityDispatcher.StartAsync(); + } + this.logHelper.TaskHubWorkerStarted(sw.Elapsed); this.isStarted = true; } @@ -233,6 +289,7 @@ public async Task StopAsync(bool isForced) { this.orchestrationDispatcher.StopAsync(isForced), this.activityDispatcher.StopAsync(isForced), + this.dispatchEntitiesSeparately ? this.entityDispatcher.StopAsync(isForced) : Task.CompletedTask, }; await Task.WhenAll(dispatcherShutdowns); @@ -282,6 +339,53 @@ public TaskHubWorker AddTaskOrchestrations(params ObjectCreator + /// Loads user defined TaskEntity classes in the TaskHubWorker + /// + /// Types deriving from TaskEntity class + /// + public TaskHubWorker AddTaskEntities(params Type[] taskEntityTypes) + { + if (!this.dispatchEntitiesSeparately) + { + throw new NotSupportedException("The configured backend does not support separate entity dispatch."); + } + + foreach (Type type in taskEntityTypes) + { + ObjectCreator creator = new NameValueObjectCreator( + type.Name, + string.Empty, + type); + + this.entityManager.Add(creator); + } + + return this; + } + + /// + /// Loads user defined TaskEntity classes in the TaskHubWorker + /// + /// + /// User specified ObjectCreators that will + /// create classes deriving TaskEntities with specific names and versions + /// + public TaskHubWorker AddTaskEntities(params ObjectCreator[] taskEntityCreators) + { + if (!this.dispatchEntitiesSeparately) + { + throw new NotSupportedException("The configured backend does not support separate entity dispatch."); + } + + foreach (ObjectCreator creator in taskEntityCreators) + { + this.entityManager.Add(creator); + } + + return this; + } + /// /// Loads user defined TaskActivity objects in the TaskHubWorker /// diff --git a/src/DurableTask.Core/TaskOrchestrationContext.cs b/src/DurableTask.Core/TaskOrchestrationContext.cs index d56b18de6..77589ed27 100644 --- a/src/DurableTask.Core/TaskOrchestrationContext.cs +++ b/src/DurableTask.Core/TaskOrchestrationContext.cs @@ -21,6 +21,7 @@ namespace DurableTask.Core using System.Threading.Tasks; using DurableTask.Core.Command; using DurableTask.Core.Common; + using DurableTask.Core.Entities; using DurableTask.Core.Exceptions; using DurableTask.Core.History; using DurableTask.Core.Serializing; @@ -47,6 +48,7 @@ public void AddEventToNextIteration(HistoryEvent he) public TaskOrchestrationContext( OrchestrationInstance orchestrationInstance, TaskScheduler taskScheduler, + TaskOrchestrationEntityParameters entityParameters = null, ErrorPropagationMode errorPropagationMode = ErrorPropagationMode.SerializeExceptions) { Utils.UnusedParameter(taskScheduler); @@ -58,6 +60,7 @@ public TaskOrchestrationContext( this.ErrorDataConverter = JsonDataConverter.Default; OrchestrationInstance = orchestrationInstance; IsReplaying = false; + this.EntityParameters = entityParameters; ErrorPropagationMode = errorPropagationMode; this.eventsWhileSuspended = new Queue(); } @@ -196,7 +199,8 @@ public override void SendEvent(OrchestrationInstance orchestrationInstance, stri } int id = this.idCounter++; - string serializedEventData = this.MessageDataConverter.SerializeInternal(eventData); + + string serializedEventData = this.MessageDataConverter.SerializeInternal(eventData); var action = new SendEventOrchestratorAction { @@ -416,7 +420,6 @@ public void HandleEventRaisedEvent(EventRaisedEvent eventRaisedEvent, bool skipC } } - public void HandleTaskCompletedEvent(TaskCompletedEvent completedEvent) { int taskId = completedEvent.TaskScheduledId; @@ -497,8 +500,8 @@ public void HandleSubOrchestrationInstanceFailedEvent(SubOrchestrationInstanceFa // When using ErrorPropagationMode.UseFailureDetails we instead use FailureDetails to convey // error information, which doesn't involve any serialization at all. Exception cause = this.ErrorPropagationMode == ErrorPropagationMode.SerializeExceptions ? - Utils.RetrieveCause(failedEvent.Details, this.ErrorDataConverter) : - null; + Utils.RetrieveCause(failedEvent.Details, this.ErrorDataConverter) + : null; var failedException = new SubOrchestrationFailedException(failedEvent.EventId, taskId, info.Name, info.Version, @@ -608,7 +611,7 @@ public void FailOrchestration(Exception failure) details = orchestrationFailureException.Details; } } - else + else { if (this.ErrorPropagationMode == ErrorPropagationMode.UseFailureDetails) { diff --git a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs index 6ebeaf89b..339865c86 100644 --- a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs +++ b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs @@ -15,13 +15,13 @@ namespace DurableTask.Core { using System; using System.Collections.Generic; - using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; using DurableTask.Core.Command; using DurableTask.Core.Common; + using DurableTask.Core.Entities; using DurableTask.Core.Exceptions; using DurableTask.Core.History; using DurableTask.Core.Logging; @@ -43,6 +43,9 @@ public class TaskOrchestrationDispatcher readonly LogHelper logHelper; ErrorPropagationMode errorPropagationMode; readonly NonBlockingCountdownLock concurrentSessionLock; + readonly IEntityOrchestrationService? entityOrchestrationService; + readonly EntityBackendProperties? entityBackendProperties; + readonly TaskOrchestrationEntityParameters? entityParameters; internal TaskOrchestrationDispatcher( IOrchestrationService orchestrationService, @@ -56,6 +59,9 @@ internal TaskOrchestrationDispatcher( this.dispatchPipeline = dispatchPipeline ?? throw new ArgumentNullException(nameof(dispatchPipeline)); this.logHelper = logHelper ?? throw new ArgumentNullException(nameof(logHelper)); this.errorPropagationMode = errorPropagationMode; + this.entityOrchestrationService = orchestrationService as IEntityOrchestrationService; + this.entityBackendProperties = this.entityOrchestrationService?.EntityBackendProperties; + this.entityParameters = TaskOrchestrationEntityParameters.FromEntityBackendProperties(this.entityBackendProperties); this.dispatcher = new WorkItemDispatcher( "TaskOrchestrationDispatcher", @@ -113,7 +119,18 @@ public async Task StopAsync(bool forced) /// A new TaskOrchestrationWorkItem protected Task OnFetchWorkItemAsync(TimeSpan receiveTimeout, CancellationToken cancellationToken) { - return this.orchestrationService.LockNextTaskOrchestrationWorkItemAsync(receiveTimeout, cancellationToken); + if (this.entityBackendProperties?.UseSeparateQueueForEntityWorkItems == true) + { + // only orchestrations should be served by this dispatcher, so we call + // the method which returns work items for orchestrations only. + return this.entityOrchestrationService!.LockNextOrchestrationWorkItemAsync(receiveTimeout, cancellationToken); + } + else + { + // both entities and orchestrations are served by this dispatcher, + // so we call the method that may return work items for either. + return this.orchestrationService.LockNextTaskOrchestrationWorkItemAsync(receiveTimeout, cancellationToken); + } } @@ -318,14 +335,14 @@ protected async Task OnProcessWorkItemAsync(TaskOrchestrationWorkItem work { // start a task to run RenewUntil renewTask = Task.Factory.StartNew( - () => this.RenewUntil(workItem, renewCancellationTokenSource.Token), + () => RenewUntil(workItem, this.orchestrationService, this.logHelper, nameof(TaskOrchestrationDispatcher), renewCancellationTokenSource.Token), renewCancellationTokenSource.Token); } try { // Assumes that: if the batch contains a new "ExecutionStarted" event, it is the first message in the batch. - if (!this.ReconcileMessagesWithState(workItem)) + if (!ReconcileMessagesWithState(workItem, nameof(TaskOrchestrationDispatcher), this.errorPropagationMode, logHelper)) { // TODO : mark an orchestration as faulted if there is data corruption this.logHelper.DroppingOrchestrationWorkItem(workItem, "Received work-item for an invalid orchestration"); @@ -613,10 +630,10 @@ static OrchestrationExecutionContext GetOrchestrationExecutionContext(Orchestrat return new OrchestrationExecutionContext { OrchestrationTags = runtimeState.Tags ?? new Dictionary(capacity: 0) }; } - TimeSpan MinRenewalInterval = TimeSpan.FromSeconds(5); // prevents excessive retries if clocks are off - TimeSpan MaxRenewalInterval = TimeSpan.FromSeconds(30); + static TimeSpan MinRenewalInterval = TimeSpan.FromSeconds(5); // prevents excessive retries if clocks are off + static TimeSpan MaxRenewalInterval = TimeSpan.FromSeconds(30); - async Task RenewUntil(TaskOrchestrationWorkItem workItem, CancellationToken cancellationToken) + internal static async Task RenewUntil(TaskOrchestrationWorkItem workItem, IOrchestrationService orchestrationService, LogHelper logHelper, string dispatcher, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { @@ -639,16 +656,16 @@ async Task RenewUntil(TaskOrchestrationWorkItem workItem, CancellationToken canc try { - this.logHelper.RenewOrchestrationWorkItemStarting(workItem); - TraceHelper.Trace(TraceEventType.Information, "TaskOrchestrationDispatcher-RenewWorkItemStarting", "Renewing work item for instance {0}", workItem.InstanceId); - await this.orchestrationService.RenewTaskOrchestrationWorkItemLockAsync(workItem); - this.logHelper.RenewOrchestrationWorkItemCompleted(workItem); - TraceHelper.Trace(TraceEventType.Information, "TaskOrchestrationDispatcher-RenewWorkItemCompleted", "Successfully renewed work item for instance {0}", workItem.InstanceId); + logHelper.RenewOrchestrationWorkItemStarting(workItem); + TraceHelper.Trace(TraceEventType.Information, $"{dispatcher}-RenewWorkItemStarting", "Renewing work item for instance {0}", workItem.InstanceId); + await orchestrationService.RenewTaskOrchestrationWorkItemLockAsync(workItem); + logHelper.RenewOrchestrationWorkItemCompleted(workItem); + TraceHelper.Trace(TraceEventType.Information, $"{dispatcher}-RenewWorkItemCompleted", "Successfully renewed work item for instance {0}", workItem.InstanceId); } catch (Exception exception) when (!Utils.IsFatal(exception)) { - this.logHelper.RenewOrchestrationWorkItemFailed(workItem, exception); - TraceHelper.TraceException(TraceEventType.Warning, "TaskOrchestrationDispatcher-RenewWorkItemFailed", exception, "Failed to renew work item for instance {0}", workItem.InstanceId); + logHelper.RenewOrchestrationWorkItemFailed(workItem, exception); + TraceHelper.TraceException(TraceEventType.Warning, $"{dispatcher}-RenewWorkItemFailed", exception, "Failed to renew work item for instance {0}", workItem.InstanceId); } } } @@ -666,6 +683,7 @@ async Task ExecuteOrchestrationAsync(Orchestration dispatchContext.SetProperty(runtimeState); dispatchContext.SetProperty(workItem); dispatchContext.SetProperty(GetOrchestrationExecutionContext(runtimeState)); + dispatchContext.SetProperty(this.entityParameters); TaskOrchestrationExecutor? executor = null; @@ -693,7 +711,9 @@ await this.dispatchPipeline.RunAsync(dispatchContext, _ => runtimeState, taskOrchestration, this.orchestrationService.EventBehaviourForContinueAsNew, + this.entityParameters, this.errorPropagationMode); + OrchestratorExecutionResult resultFromOrchestrator = executor.Execute(); dispatchContext.SetProperty(resultFromOrchestrator); return CompletedTask; @@ -735,8 +755,11 @@ await this.dispatchPipeline.RunAsync(dispatchContext, _ => /// Assumes that: if the batch contains a new "ExecutionStarted" event, it is the first message in the batch. /// /// A batch of work item messages. + /// The name of the dispatcher, used for tracing. + /// The error propagation mode. + /// The log helper. /// True if workItem should be processed further. False otherwise. - bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) + internal static bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem, string dispatcher, ErrorPropagationMode errorPropagationMode, LogHelper logHelper) { foreach (TaskMessage message in workItem.NewMessages) { @@ -745,7 +768,7 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) { throw TraceHelper.TraceException( TraceEventType.Error, - "TaskOrchestrationDispatcher-OrchestrationInstanceMissing", + $"{dispatcher}-OrchestrationInstanceMissing", new InvalidOperationException("Message does not contain any OrchestrationInstance information")); } @@ -763,10 +786,10 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) return false; } - this.logHelper.ProcessingOrchestrationMessage(workItem, message); + logHelper.ProcessingOrchestrationMessage(workItem, message); TraceHelper.TraceInstance( TraceEventType.Information, - "TaskOrchestrationDispatcher-ProcessEvent", + $"{dispatcher}-ProcessEvent", orchestrationInstance!, "Processing new event with Id {0} and type {1}", message.Event.EventId, @@ -777,10 +800,10 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) if (workItem.OrchestrationRuntimeState.ExecutionStartedEvent != null) { // this was caused due to a dupe execution started event, swallow this one - this.logHelper.DroppingOrchestrationMessage(workItem, message, "Duplicate start event"); + logHelper.DroppingOrchestrationMessage(workItem, message, "Duplicate start event"); TraceHelper.TraceInstance( TraceEventType.Warning, - "TaskOrchestrationDispatcher-DuplicateStartEvent", + $"{dispatcher}-DuplicateStartEvent", orchestrationInstance!, "Duplicate start event. Ignoring event with Id {0} and type {1} ", message.Event.EventId, @@ -794,13 +817,13 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) workItem.OrchestrationRuntimeState.OrchestrationInstance?.ExecutionId)) { // eat up any events for previous executions - this.logHelper.DroppingOrchestrationMessage( + logHelper.DroppingOrchestrationMessage( workItem, message, $"ExecutionId of event ({orchestrationInstance.ExecutionId}) does not match current executionId"); TraceHelper.TraceInstance( TraceEventType.Warning, - "TaskOrchestrationDispatcher-ExecutionIdMismatch", + $"{dispatcher}-ExecutionIdMismatch", orchestrationInstance, "ExecutionId of event does not match current executionId. Ignoring event with Id {0} and type {1} ", message.Event.EventId, @@ -828,7 +851,7 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent = (SubOrchestrationInstanceCreatedEvent)workItem.OrchestrationRuntimeState.Events.FirstOrDefault(x => x.EventId == subOrchestrationInstanceFailedEvent.TaskScheduledId); // We immediately publish the activity span for this sub-orchestration by creating the activity and immediately calling Dispose() on it. - TraceHelper.EmitTraceActivityForSubOrchestrationFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, subOrchestrationCreatedEvent, subOrchestrationInstanceFailedEvent, this.errorPropagationMode); + TraceHelper.EmitTraceActivityForSubOrchestrationFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, subOrchestrationCreatedEvent, subOrchestrationInstanceFailedEvent, errorPropagationMode); } } @@ -840,7 +863,7 @@ bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workItem) else if (message.Event is TaskFailedEvent taskFailedEvent) { TaskScheduledEvent taskScheduledEvent = (TaskScheduledEvent)workItem.OrchestrationRuntimeState.Events.LastOrDefault(x => x.EventId == taskFailedEvent.TaskScheduledId); - TraceHelper.EmitTraceActivityForTaskFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, taskScheduledEvent, taskFailedEvent, this.errorPropagationMode); + TraceHelper.EmitTraceActivityForTaskFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, taskScheduledEvent, taskFailedEvent, errorPropagationMode); } workItem.OrchestrationRuntimeState.AddEvent(message.Event); @@ -1145,7 +1168,7 @@ TaskMessage ProcessSendEventDecision( }; } - class NonBlockingCountdownLock + internal class NonBlockingCountdownLock { int available; diff --git a/src/DurableTask.Core/TaskOrchestrationExecutor.cs b/src/DurableTask.Core/TaskOrchestrationExecutor.cs index b0ca99976..af8b850bf 100644 --- a/src/DurableTask.Core/TaskOrchestrationExecutor.cs +++ b/src/DurableTask.Core/TaskOrchestrationExecutor.cs @@ -14,7 +14,6 @@ namespace DurableTask.Core { using System; - using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -22,6 +21,7 @@ namespace DurableTask.Core using System.Threading; using System.Threading.Tasks; using DurableTask.Core.Common; + using DurableTask.Core.Entities; using DurableTask.Core.Exceptions; using DurableTask.Core.History; @@ -43,23 +43,43 @@ public class TaskOrchestrationExecutor /// /// /// + /// /// public TaskOrchestrationExecutor( OrchestrationRuntimeState orchestrationRuntimeState, TaskOrchestration taskOrchestration, BehaviorOnContinueAsNew eventBehaviourForContinueAsNew, + TaskOrchestrationEntityParameters? entityParameters, ErrorPropagationMode errorPropagationMode = ErrorPropagationMode.SerializeExceptions) { this.decisionScheduler = new SynchronousTaskScheduler(); this.context = new TaskOrchestrationContext( orchestrationRuntimeState.OrchestrationInstance, this.decisionScheduler, + entityParameters, errorPropagationMode); this.orchestrationRuntimeState = orchestrationRuntimeState; this.taskOrchestration = taskOrchestration; this.skipCarryOverEvents = eventBehaviourForContinueAsNew == BehaviorOnContinueAsNew.Ignore; } + /// + /// Initializes a new instance of the class. + /// This overload is needed only to avoid breaking changes because this is a public constructor. + /// + /// + /// + /// + /// + public TaskOrchestrationExecutor( + OrchestrationRuntimeState orchestrationRuntimeState, + TaskOrchestration taskOrchestration, + BehaviorOnContinueAsNew eventBehaviourForContinueAsNew, + ErrorPropagationMode errorPropagationMode = ErrorPropagationMode.SerializeExceptions) + : this(orchestrationRuntimeState, taskOrchestration, eventBehaviourForContinueAsNew, entityParameters: null, errorPropagationMode) + { + } + internal bool IsCompleted => this.result != null && (this.result.IsCompleted || this.result.IsFaulted); /// From 1214ea2d0c6b5e562f12a5b77bba778c5d6c92a9 Mon Sep 17 00:00:00 2001 From: Sebastian Burckhardt Date: Thu, 19 Oct 2023 13:06:33 -0700 Subject: [PATCH 09/36] Fix entity preview bugs (#998) * fix bugs in logging code * fix bug in CleanEntityStorage (not reading continuation token) --- src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs | 1 + src/DurableTask.Core/Logging/LogEvents.cs | 4 ++-- src/DurableTask.Core/TaskHubWorker.cs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs index dead69db6..3ba243908 100644 --- a/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs +++ b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs @@ -140,6 +140,7 @@ async ValueTask> ConvertResultsAsync(IEnumerable(); foreach (OrchestrationState state in page.OrchestrationState) diff --git a/src/DurableTask.Core/Logging/LogEvents.cs b/src/DurableTask.Core/Logging/LogEvents.cs index ebf489ded..3c5ff995a 100644 --- a/src/DurableTask.Core/Logging/LogEvents.cs +++ b/src/DurableTask.Core/Logging/LogEvents.cs @@ -1252,8 +1252,8 @@ public EntityBatchExecuted(EntityBatchRequest request, EntityBatchResult result) public int EntityStateLength { get; } public override EventId EventId => new EventId( - EventIds.EntityBatchExecuting, - nameof(EventIds.EntityBatchExecuting)); + EventIds.EntityBatchExecuted, + nameof(EventIds.EntityBatchExecuted)); public override LogLevel Level => LogLevel.Information; diff --git a/src/DurableTask.Core/TaskHubWorker.cs b/src/DurableTask.Core/TaskHubWorker.cs index 5a45752c6..76883e5ce 100644 --- a/src/DurableTask.Core/TaskHubWorker.cs +++ b/src/DurableTask.Core/TaskHubWorker.cs @@ -122,7 +122,7 @@ public TaskHubWorker( orchestrationObjectManager, activityObjectManager, new NameVersionObjectManager(), - loggerFactory: null) + loggerFactory) { } From 6f902190fcf7f14d42b07e940f516e47525dbc18 Mon Sep 17 00:00:00 2001 From: Sebastian Burckhardt Date: Thu, 19 Oct 2023 13:23:11 -0700 Subject: [PATCH 10/36] udpate version suffix from preview.1 to preview.2 (#999) --- src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj | 2 +- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index 1025cf027..f88a20a55 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -30,7 +30,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix)-preview.1 + $(VersionPrefix)-preview.2 diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 46336110a..1581ae42f 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -27,7 +27,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix)-preview.1 + $(VersionPrefix)-preview.2 From f7d67e1542355b01c87e40510cc6d6b2fd8ea16b Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:06:06 -0800 Subject: [PATCH 11/36] update version suffix for public release (#1008) --- src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj | 2 +- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index f88a20a55..f2921cd2e 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -30,7 +30,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix)-preview.2 + $(VersionPrefix) diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 1581ae42f..8b0399e7e 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -27,7 +27,7 @@ $(MajorVersion).$(MinorVersion).0.0 - $(VersionPrefix)-preview.2 + $(VersionPrefix) From 196a8584577b565bbebbf389296e820c6a17a505 Mon Sep 17 00:00:00 2001 From: Varshitha Bachu Date: Mon, 13 Nov 2023 13:24:09 -0800 Subject: [PATCH 12/36] Increment DurableTask.ApplicationInsights version (#1009) --- .../DurableTask.ApplicationInsights.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj index ab23d14f3..f56846a8e 100644 --- a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj +++ b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj @@ -12,7 +12,7 @@ 0 1 - 2 + 3 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 From 009f2e587f15a79e2fd368ac8dce5febed08efec Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 5 Dec 2023 17:22:09 -0800 Subject: [PATCH 13/36] Log warning on multiple execution completed events and allow termination to override previous execution completed events (#949) --- src/DurableTask.Core/Logging/EventIds.cs | 2 + src/DurableTask.Core/Logging/LogEvents.cs | 40 +++++++++++++++++++ src/DurableTask.Core/Logging/LogHelper.cs | 8 ++++ .../Logging/StructuredEventSource.cs | 20 ++++++++++ .../OrchestrationRuntimeState.cs | 40 ++++++++++++++++--- .../TaskOrchestrationDispatcher.cs | 1 + 6 files changed, 105 insertions(+), 6 deletions(-) diff --git a/src/DurableTask.Core/Logging/EventIds.cs b/src/DurableTask.Core/Logging/EventIds.cs index 2998e5f8d..f7386eb99 100644 --- a/src/DurableTask.Core/Logging/EventIds.cs +++ b/src/DurableTask.Core/Logging/EventIds.cs @@ -67,5 +67,7 @@ static class EventIds public const int RenewOrchestrationWorkItemStarting = 70; public const int RenewOrchestrationWorkItemCompleted = 71; public const int RenewOrchestrationWorkItemFailed = 72; + + public const int OrchestrationDebugTrace = 73; } } diff --git a/src/DurableTask.Core/Logging/LogEvents.cs b/src/DurableTask.Core/Logging/LogEvents.cs index 3c5ff995a..612e2664f 100644 --- a/src/DurableTask.Core/Logging/LogEvents.cs +++ b/src/DurableTask.Core/Logging/LogEvents.cs @@ -1848,5 +1848,45 @@ void IEventSourceEvent.WriteEventSource() => Utils.AppName, Utils.PackageVersion); } + + internal class OrchestrationDebugTrace : StructuredLogEvent, IEventSourceEvent + { + public OrchestrationDebugTrace(string instanceId, string executionId, string details) + { + this.InstanceId = instanceId; + this.ExecutionId = executionId; + this.Details = details; + } + + [StructuredLogField] + public string InstanceId { get; } + + [StructuredLogField] + public string ExecutionId { get; } + + [StructuredLogField] + public string Name { get; } + + [StructuredLogField] + public string Details { get; } + + public override EventId EventId => new EventId( + EventIds.OrchestrationDebugTrace, + nameof(EventIds.OrchestrationDebugTrace)); + + public override LogLevel Level => LogLevel.Debug; + + protected override string CreateLogMessage() => + $"{this.InstanceId}: Orchestration Debug Trace: {this.Details}"; + + void IEventSourceEvent.WriteEventSource() => + StructuredEventSource.Log.OrchestrationDebugTrace( + this.InstanceId, + this.ExecutionId, + this.Details, + Utils.AppName, + Utils.PackageVersion); + } + } } diff --git a/src/DurableTask.Core/Logging/LogHelper.cs b/src/DurableTask.Core/Logging/LogHelper.cs index 61d2dc05c..109c14c42 100644 --- a/src/DurableTask.Core/Logging/LogHelper.cs +++ b/src/DurableTask.Core/Logging/LogHelper.cs @@ -730,6 +730,14 @@ internal void RenewActivityMessageFailed(TaskActivityWorkItem workItem, Exceptio } #endregion + internal void OrchestrationDebugTrace(string instanceId, string executionId, string details) + { + if (this.IsStructuredLoggingEnabled) + { + this.WriteStructuredLog(new LogEvents.OrchestrationDebugTrace(instanceId, executionId, details)); + } + } + void WriteStructuredLog(ILogEvent logEvent, Exception? exception = null) { this.log?.LogDurableEvent(logEvent, exception); diff --git a/src/DurableTask.Core/Logging/StructuredEventSource.cs b/src/DurableTask.Core/Logging/StructuredEventSource.cs index b6ec19a32..162a226f2 100644 --- a/src/DurableTask.Core/Logging/StructuredEventSource.cs +++ b/src/DurableTask.Core/Logging/StructuredEventSource.cs @@ -961,5 +961,25 @@ internal void RenewOrchestrationWorkItemFailed( ExtensionVersion); } } + + [Event(EventIds.OrchestrationDebugTrace, Level = EventLevel.Verbose, Version = 1)] + internal void OrchestrationDebugTrace( + string InstanceId, + string ExecutionId, + string Details, + string AppName, + string ExtensionVersion) + { + if (this.IsEnabled(EventLevel.Verbose)) + { + this.WriteEvent( + EventIds.OrchestrationDebugTrace, + InstanceId, + ExecutionId, + Details, + AppName, + ExtensionVersion); + } + } } } diff --git a/src/DurableTask.Core/OrchestrationRuntimeState.cs b/src/DurableTask.Core/OrchestrationRuntimeState.cs index e9401658b..f4e61afd4 100644 --- a/src/DurableTask.Core/OrchestrationRuntimeState.cs +++ b/src/DurableTask.Core/OrchestrationRuntimeState.cs @@ -18,6 +18,7 @@ namespace DurableTask.Core using System.Diagnostics; using DurableTask.Core.Common; using DurableTask.Core.History; + using DurableTask.Core.Logging; using DurableTask.Core.Tracing; /// @@ -184,6 +185,14 @@ public OrchestrationStatus OrchestrationStatus this.Events.Count == 1 && this.Events[0].EventType == EventType.OrchestratorStarted || this.ExecutionStartedEvent != null; + /// + /// Gets or sets a LogHelper instance that can be used to log messages. + /// + /// + /// Ideally, this would be set in the constructor but that would require a larger refactoring. + /// + internal LogHelper? LogHelper { get; set; } = null; + /// /// Adds a new history event to the Events list and NewEvents list /// @@ -260,14 +269,33 @@ void SetMarkerEvents(HistoryEvent historyEvent) } else if (historyEvent is ExecutionCompletedEvent completedEvent) { - if (ExecutionCompletedEvent != null) + if (ExecutionCompletedEvent == null) { - throw new InvalidOperationException( - "Multiple ExecutionCompletedEvent found, potential corruption in state storage"); + ExecutionCompletedEvent = completedEvent; + orchestrationStatus = completedEvent.OrchestrationStatus; + } + else + { + // It's not generally expected to receive multiple execution completed events for a given orchestrator, but it's possible under certain race conditions. + // For example: when an orchestrator is signaled to terminate at the same time as it attempts to continue-as-new. + var log = $"Received new {completedEvent.GetType().Name} event despite the orchestration being already in the {orchestrationStatus} state."; + + if (orchestrationStatus == OrchestrationStatus.ContinuedAsNew && completedEvent.OrchestrationStatus == OrchestrationStatus.Terminated) + { + // If the orchestration planned to continue-as-new but termination is requested, we transition to the terminated state. + // This is because termination should be considered to be forceful. + log += " Discarding previous 'ExecutionCompletedEvent' as termination is forceful."; + ExecutionCompletedEvent = completedEvent; + orchestrationStatus = completedEvent.OrchestrationStatus; + } + else + { + // otherwise, we ignore the new event. + log += " Discarding new 'ExecutionCompletedEvent'."; + } + + LogHelper?.OrchestrationDebugTrace(this.OrchestrationInstance?.InstanceId ?? "", this.OrchestrationInstance?.ExecutionId ?? "", log); } - - ExecutionCompletedEvent = completedEvent; - orchestrationStatus = completedEvent.OrchestrationStatus; } else if (historyEvent is ExecutionSuspendedEvent) { diff --git a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs index 339865c86..1b01e7c78 100644 --- a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs +++ b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs @@ -313,6 +313,7 @@ protected async Task OnProcessWorkItemAsync(TaskOrchestrationWorkItem work IList? carryOverEvents = null; string? carryOverStatus = null; + workItem.OrchestrationRuntimeState.LogHelper = this.logHelper; OrchestrationRuntimeState runtimeState = workItem.OrchestrationRuntimeState; runtimeState.AddEvent(new OrchestratorStartedEvent(-1)); From 620db5916ff4b6dbbaba1259e30533e3fe1e7c73 Mon Sep 17 00:00:00 2001 From: Jacob Viau Date: Thu, 7 Dec 2023 14:39:29 -0800 Subject: [PATCH 14/36] Add small getting started for distributed tracing (#1013) * Add small getting started for distributed tracing * Add distinction to getting started --- docs/telemetry/traces/getting-started.md | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/telemetry/traces/getting-started.md diff --git a/docs/telemetry/traces/getting-started.md b/docs/telemetry/traces/getting-started.md new file mode 100644 index 000000000..6ba72e786 --- /dev/null +++ b/docs/telemetry/traces/getting-started.md @@ -0,0 +1,26 @@ +# Getting Started - Distributed Tracing + +> ⚠ Important: durable task distributed tracing is currently [experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/document-status.md). The schema is subject to changes until it is marked as stable. These changes may occur in any package update. + +> ⚠ Important: this guide only applies DurableTask users. For Durable Functions, please see [here](https://github.com/Azure/azure-functions-durable-extension/blob/dev/samples/distributed-tracing/v2/DistributedTracingSample/README.md) + +Distributed tracing in DurableTask uses the `ActivitySource` approach, it is both OpenTelemetry and Application Insights compatible. + +## OpenTelemetry + +Add the `"DurableTask.Core"` source to the OTel trace builder. + +``` CSharp +Sdk.CreateTracerProviderBuilder() + .AddSource("DurableTask.Core") + .Build() +``` + +See [sample](../../../samples/DistributedTraceSample/OpenTelemetry) + +## Application Insights + +1. Add reference to [Microsoft.Azure.DurableTask.ApplicationInsights](https://www.nuget.org/packages/Microsoft.Azure.DurableTask.ApplicationInsights) +2. Add the `DurableTelemetryModule` to AppInsights: `services.TryAddEnumerable(ServiceDescriptor.Singleton());` + +See [sample](../../../samples/DistributedTraceSample/ApplicationInsights) From c6ab576667f9c40c78c4c20e767bf8e2f599537e Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Fri, 15 Dec 2023 17:30:44 -0800 Subject: [PATCH 15/36] Fix InvalidCastException for history event type mismatch (#1018) --- src/DurableTask.Core/TaskOrchestrationDispatcher.cs | 8 ++++---- src/DurableTask.Core/Tracing/TraceHelper.cs | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs index 1b01e7c78..fc051994f 100644 --- a/src/DurableTask.Core/TaskOrchestrationDispatcher.cs +++ b/src/DurableTask.Core/TaskOrchestrationDispatcher.cs @@ -842,14 +842,14 @@ internal static bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workIt } else if (historyEvent is SubOrchestrationInstanceCompletedEvent subOrchestrationInstanceCompletedEvent) { - SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent = (SubOrchestrationInstanceCreatedEvent)workItem.OrchestrationRuntimeState.Events.FirstOrDefault(x => x.EventId == subOrchestrationInstanceCompletedEvent.TaskScheduledId); + SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent = workItem.OrchestrationRuntimeState.Events.OfType().FirstOrDefault(x => x.EventId == subOrchestrationInstanceCompletedEvent.TaskScheduledId); // We immediately publish the activity span for this sub-orchestration by creating the activity and immediately calling Dispose() on it. TraceHelper.EmitTraceActivityForSubOrchestrationCompleted(workItem.OrchestrationRuntimeState.OrchestrationInstance, subOrchestrationCreatedEvent); } else if (historyEvent is SubOrchestrationInstanceFailedEvent subOrchestrationInstanceFailedEvent) { - SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent = (SubOrchestrationInstanceCreatedEvent)workItem.OrchestrationRuntimeState.Events.FirstOrDefault(x => x.EventId == subOrchestrationInstanceFailedEvent.TaskScheduledId); + SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent = workItem.OrchestrationRuntimeState.Events.OfType().FirstOrDefault(x => x.EventId == subOrchestrationInstanceFailedEvent.TaskScheduledId); // We immediately publish the activity span for this sub-orchestration by creating the activity and immediately calling Dispose() on it. TraceHelper.EmitTraceActivityForSubOrchestrationFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, subOrchestrationCreatedEvent, subOrchestrationInstanceFailedEvent, errorPropagationMode); @@ -858,12 +858,12 @@ internal static bool ReconcileMessagesWithState(TaskOrchestrationWorkItem workIt if (message.Event is TaskCompletedEvent taskCompletedEvent) { - TaskScheduledEvent taskScheduledEvent = (TaskScheduledEvent)workItem.OrchestrationRuntimeState.Events.LastOrDefault(x => x.EventId == taskCompletedEvent.TaskScheduledId); + TaskScheduledEvent taskScheduledEvent = workItem.OrchestrationRuntimeState.Events.OfType().LastOrDefault(x => x.EventId == taskCompletedEvent.TaskScheduledId); TraceHelper.EmitTraceActivityForTaskCompleted(workItem.OrchestrationRuntimeState.OrchestrationInstance, taskScheduledEvent); } else if (message.Event is TaskFailedEvent taskFailedEvent) { - TaskScheduledEvent taskScheduledEvent = (TaskScheduledEvent)workItem.OrchestrationRuntimeState.Events.LastOrDefault(x => x.EventId == taskFailedEvent.TaskScheduledId); + TaskScheduledEvent taskScheduledEvent = workItem.OrchestrationRuntimeState.Events.OfType().LastOrDefault(x => x.EventId == taskFailedEvent.TaskScheduledId); TraceHelper.EmitTraceActivityForTaskFailed(workItem.OrchestrationRuntimeState.OrchestrationInstance, taskScheduledEvent, taskFailedEvent, errorPropagationMode); } diff --git a/src/DurableTask.Core/Tracing/TraceHelper.cs b/src/DurableTask.Core/Tracing/TraceHelper.cs index 768d6bda6..143ba8af6 100644 --- a/src/DurableTask.Core/Tracing/TraceHelper.cs +++ b/src/DurableTask.Core/Tracing/TraceHelper.cs @@ -20,7 +20,6 @@ namespace DurableTask.Core.Tracing using System.Runtime.ExceptionServices; using DurableTask.Core.Common; using DurableTask.Core.History; - using DurableTask.Core.Serializing; /// /// Helper class for logging/tracing From f45e43c043daac79bb9b522b8027db72a57bc1b7 Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 2 Jan 2024 13:12:23 -0800 Subject: [PATCH 16/36] Patch advisories (#1023) --- samples/DurableTask.Samples/DurableTask.Samples.csproj | 1 - .../DurableTask.AzureStorage.csproj | 1 - src/DurableTask.Core/DurableTask.Core.csproj | 3 ++- src/DurableTask.Emulator/DurableTask.Emulator.csproj | 8 -------- .../DurableTask.AzureStorage.Tests.csproj | 2 -- test/DurableTask.Core.Tests/DurableTask.Core.Tests.csproj | 2 -- .../DurableTask.SqlServer.Tests.csproj | 2 +- .../DurableTask.Test.Orchestrations.csproj | 8 -------- 8 files changed, 3 insertions(+), 24 deletions(-) diff --git a/samples/DurableTask.Samples/DurableTask.Samples.csproj b/samples/DurableTask.Samples/DurableTask.Samples.csproj index 36e285423..25a8f4980 100644 --- a/samples/DurableTask.Samples/DurableTask.Samples.csproj +++ b/samples/DurableTask.Samples/DurableTask.Samples.csproj @@ -11,7 +11,6 @@ - diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index f2921cd2e..e0bb41766 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -35,7 +35,6 @@ - diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 8b0399e7e..b453bfefc 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -32,7 +32,8 @@ - + + diff --git a/src/DurableTask.Emulator/DurableTask.Emulator.csproj b/src/DurableTask.Emulator/DurableTask.Emulator.csproj index e165bbe31..b89e40bcc 100644 --- a/src/DurableTask.Emulator/DurableTask.Emulator.csproj +++ b/src/DurableTask.Emulator/DurableTask.Emulator.csproj @@ -8,14 +8,6 @@ NU5125;NU5048 - - - - - - - - diff --git a/test/DurableTask.AzureStorage.Tests/DurableTask.AzureStorage.Tests.csproj b/test/DurableTask.AzureStorage.Tests/DurableTask.AzureStorage.Tests.csproj index 04f54cf2b..09d3d341b 100644 --- a/test/DurableTask.AzureStorage.Tests/DurableTask.AzureStorage.Tests.csproj +++ b/test/DurableTask.AzureStorage.Tests/DurableTask.AzureStorage.Tests.csproj @@ -9,14 +9,12 @@ - - diff --git a/test/DurableTask.Core.Tests/DurableTask.Core.Tests.csproj b/test/DurableTask.Core.Tests/DurableTask.Core.Tests.csproj index 3800b3898..a6154f583 100644 --- a/test/DurableTask.Core.Tests/DurableTask.Core.Tests.csproj +++ b/test/DurableTask.Core.Tests/DurableTask.Core.Tests.csproj @@ -10,7 +10,6 @@ - @@ -18,7 +17,6 @@ - diff --git a/test/DurableTask.SqlServer.Tests/DurableTask.SqlServer.Tests.csproj b/test/DurableTask.SqlServer.Tests/DurableTask.SqlServer.Tests.csproj index b601fc142..cf578db09 100644 --- a/test/DurableTask.SqlServer.Tests/DurableTask.SqlServer.Tests.csproj +++ b/test/DurableTask.SqlServer.Tests/DurableTask.SqlServer.Tests.csproj @@ -23,7 +23,7 @@ - + diff --git a/test/DurableTask.Test.Orchestrations/DurableTask.Test.Orchestrations.csproj b/test/DurableTask.Test.Orchestrations/DurableTask.Test.Orchestrations.csproj index e2e94505d..c390fe115 100644 --- a/test/DurableTask.Test.Orchestrations/DurableTask.Test.Orchestrations.csproj +++ b/test/DurableTask.Test.Orchestrations/DurableTask.Test.Orchestrations.csproj @@ -4,14 +4,6 @@ netstandard2.0;net462 - - - - - - - - From 1585a61538100d42281c0dd5a9aecb48d349d01a Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:13:02 -0800 Subject: [PATCH 17/36] Add orchestrator scheduled actions check when suspended (#1024) --- .../TaskOrchestrationContext.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/DurableTask.Core/TaskOrchestrationContext.cs b/src/DurableTask.Core/TaskOrchestrationContext.cs index 77589ed27..eb5b41760 100644 --- a/src/DurableTask.Core/TaskOrchestrationContext.cs +++ b/src/DurableTask.Core/TaskOrchestrationContext.cs @@ -17,6 +17,7 @@ namespace DurableTask.Core using System.Collections.Generic; using System.Diagnostics; using System.Globalization; + using System.Linq; using System.Threading; using System.Threading.Tasks; using DurableTask.Core.Command; @@ -35,6 +36,7 @@ internal class TaskOrchestrationContext : OrchestrationContext private bool executionCompletedOrTerminated; private int idCounter; private readonly Queue eventsWhileSuspended; + private readonly IDictionary suspendedActionsMap; public bool IsSuspended { get; private set; } @@ -63,6 +65,7 @@ public TaskOrchestrationContext( this.EntityParameters = entityParameters; ErrorPropagationMode = errorPropagationMode; this.eventsWhileSuspended = new Queue(); + this.suspendedActionsMap = new SortedDictionary(); } public IEnumerable OrchestratorActions => this.orchestratorActionsMap.Values; @@ -568,11 +571,35 @@ public void HandleEventWhileSuspended(HistoryEvent historyEvent) public void HandleExecutionSuspendedEvent(ExecutionSuspendedEvent suspendedEvent) { this.IsSuspended = true; + + // When the orchestrator is suspended, a task could potentially be added to the orchestratorActionsMap. + // This could lead to the task being executed repeatedly without completion until the orchestrator is resumed. + // To prevent this scenario, check if orchestratorActionsMap is empty before proceeding. + if (this.orchestratorActionsMap.Any()) + { + // If not, store its contents to a temporary dictionary to allow processing of the task later when orchestrator resumes. + foreach (var pair in this.orchestratorActionsMap) + { + this.suspendedActionsMap.Add(pair.Key, pair.Value); + } + this.orchestratorActionsMap.Clear(); + } } public void HandleExecutionResumedEvent(ExecutionResumedEvent resumedEvent, Action eventProcessor) { this.IsSuspended = false; + + // Add the actions stored in the suspendedActionsMap before back to orchestratorActionsMap to ensure proper sequencing. + if (this.suspendedActionsMap.Any()) + { + foreach(var pair in this.suspendedActionsMap) + { + this.orchestratorActionsMap.Add(pair.Key, pair.Value); + } + this.suspendedActionsMap.Clear(); + } + while (eventsWhileSuspended.Count > 0) { eventProcessor(eventsWhileSuspended.Dequeue()); From 5ccb7b8f815e2d3efee22b4344697c448294a843 Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:13:18 -0800 Subject: [PATCH 18/36] Increase DurableTask.Core to 2.16.1 (#1027) --- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index b453bfefc..bcf349346 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -18,7 +18,7 @@ 2 16 - 0 + 1 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 From 8ee14f23d9ba73aa71ba4b979df04b105f24b1ef Mon Sep 17 00:00:00 2001 From: Braedon Date: Sat, 13 Jan 2024 05:11:16 +1100 Subject: [PATCH 19/36] Add new CreateScheduledOrchestrationInstanceAsync override to allow specifying name/version/instanceId & startAt (#978) --- src/DurableTask.Core/TaskHubClient.cs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.Core/TaskHubClient.cs b/src/DurableTask.Core/TaskHubClient.cs index d7faa4961..fb045eea0 100644 --- a/src/DurableTask.Core/TaskHubClient.cs +++ b/src/DurableTask.Core/TaskHubClient.cs @@ -74,7 +74,7 @@ public TaskHubClient(IOrchestrationServiceClient serviceClient, DataConverter da } /// - /// Create a new orchestration of the specified type with the specified instance id, scheduled to start at an specific time + /// Create a new orchestration of the specified type with the specified instance id, scheduled to start at the specified time /// /// Type that derives from TaskOrchestration /// Input parameter to the specified TaskOrchestration @@ -98,7 +98,7 @@ public Task CreateScheduledOrchestrationInstanceAsync( } /// - /// Create a new orchestration of the specified type with the specified instance id, scheduled to start at an specific time + /// Create a new orchestration of the specified type with the specified instance id, scheduled to start at the specified time /// /// Type that derives from TaskOrchestration /// Instance id for the orchestration to be created, must be unique across the Task Hub @@ -123,6 +123,29 @@ public Task CreateScheduledOrchestrationInstanceAsync( startAt: startAt); } + /// + /// Create a new orchestration of the specified name and version with the specified instance id, scheduled to start at the specified time. + /// + /// Name of the orchestration as specified by the ObjectCreator + /// Name of the orchestration as specified by the ObjectCreator + /// Instance id for the orchestration to be created, must be unique across the Task Hub + /// Input parameter to the specified TaskOrchestration + /// Orchestration start time + /// OrchestrationInstance that represents the orchestration that was created + public Task CreateScheduledOrchestrationInstanceAsync(string name, string version, string instanceId, object input, DateTime startAt) + { + return InternalCreateOrchestrationInstanceWithRaisedEventAsync( + name, + version, + instanceId, + input, + null, + null, + null, + null, + startAt: startAt); + } + /// /// Create a new orchestration of the specified type with an automatically generated instance id /// From 5d3f27a8475f1214da79b63ba6f7eede3445c7e1 Mon Sep 17 00:00:00 2001 From: kevxms <126736350+kevxms@users.noreply.github.com> Date: Fri, 12 Jan 2024 10:34:37 -0800 Subject: [PATCH 20/36] Support task registration from interface with inheritance, generics, method overloading (#1021) --- src/DurableTask.Core/NameVersionHelper.cs | 53 ++++++ src/DurableTask.Core/OrchestrationContext.cs | 60 +++++-- src/DurableTask.Core/ScheduleProxy.cs | 11 +- src/DurableTask.Core/ScheduleProxyV2.cs | 35 ++++ src/DurableTask.Core/TaskHubWorker.cs | 72 +++++++-- .../EmulatorFunctionalTests.cs | 152 ++++++++++++++++++ 6 files changed, 355 insertions(+), 28 deletions(-) create mode 100644 src/DurableTask.Core/ScheduleProxyV2.cs diff --git a/src/DurableTask.Core/NameVersionHelper.cs b/src/DurableTask.Core/NameVersionHelper.cs index f45ad94c0..52e09c88d 100644 --- a/src/DurableTask.Core/NameVersionHelper.cs +++ b/src/DurableTask.Core/NameVersionHelper.cs @@ -14,7 +14,9 @@ namespace DurableTask.Core { using System; + using System.Collections.Generic; using System.Dynamic; + using System.Linq; using System.Reflection; /// @@ -99,5 +101,56 @@ internal static string GetFullyQualifiedMethodName(string declaringType, string return declaringType + "." + methodName; } + + /// + /// Gets the fully qualified method name by joining a prefix representing the declaring type and a suffix representing the parameter list. + /// For example, + /// "DurableTask.Emulator.Tests.EmulatorFunctionalTests+IInheritedTestOrchestrationTasksB`2[System.Int32,System.String].Juggle.(Int32,Boolean)" + /// would be the result for the method `Juggle(int, bool)` as member of + /// generic type interface declared like `DurableTask.Emulator.Tests.EmulatorFunctionalTests.IInheritedTestOrchestrationTasksB{int, string}`, + /// even if the method were inherited from a base interface. + /// + /// typically the result of call to Type.ToString(): Type.FullName is more verbose + /// + /// + internal static string GetFullyQualifiedMethodName(string declaringType, MethodInfo methodInfo) + { + IEnumerable paramTypeNames = methodInfo.GetParameters().Select(x => x.ParameterType.Name); + string paramTypeNamesCsv = string.Join(",", paramTypeNames); + string methodNameWithParameterList = $"{methodInfo.Name}.({paramTypeNamesCsv})"; + return GetFullyQualifiedMethodName(declaringType, methodNameWithParameterList); + } + + /// + /// Gets all methods from an interface, including those inherited from a base interface + /// + /// + /// + /// + /// + internal static IList GetAllInterfaceMethods(Type t, Func getMethodUniqueId, HashSet visited = null) + { + if (visited == null) + { + visited = new HashSet(); + } + List result = new List(); + foreach (MethodInfo m in t.GetMethods()) + { + string name = getMethodUniqueId(m); + if (!visited.Contains(name)) + { + // In some cases, such as when a generic type interface inherits an interface with the same name, Task.GetMethod includes the methods from the base interface. + // This check is to avoid dupicates from these. + result.Add(m); + visited.Add(name); + } + } + foreach (Type baseInterface in t.GetInterfaces()) + { + result.AddRange(GetAllInterfaceMethods(baseInterface, getMethodUniqueId, visited: visited)); + } + return result; + } } } \ No newline at end of file diff --git a/src/DurableTask.Core/OrchestrationContext.cs b/src/DurableTask.Core/OrchestrationContext.cs index 290fc9ae1..5a48eb93f 100644 --- a/src/DurableTask.Core/OrchestrationContext.cs +++ b/src/DurableTask.Core/OrchestrationContext.cs @@ -91,27 +91,25 @@ public virtual T CreateClient() where T : class /// If true, the method name translation from the interface contains /// the interface name, if false then only the method name is used /// + /// + /// This is deprecated and exists only for back-compatibility. + /// See , which adds support for C# interface features such as inheritance, generics, and method overloading. + /// /// public virtual T CreateClient(bool useFullyQualifiedMethodNames) where T : class { - if (!typeof(T).IsInterface && !typeof(T).IsClass) - { - throw new InvalidOperationException($"{nameof(T)} must be an interface or class."); - } - - IInterceptor scheduleProxy = new ScheduleProxy(this, useFullyQualifiedMethodNames); - - if (typeof(T).IsClass) - { - if (typeof(T).IsSealed) - { - throw new InvalidOperationException("Class cannot be sealed."); - } - - return ProxyGenerator.CreateClassProxy(scheduleProxy); - } + return CreateClient(() => new ScheduleProxy(this, useFullyQualifiedMethodNames)); + } - return ProxyGenerator.CreateInterfaceProxyWithoutTarget(scheduleProxy); + /// + /// Create a proxy client class to schedule remote TaskActivities via a strongly typed interface. + /// + /// + /// + /// + public virtual T CreateClientV2() where T : class + { + return CreateClient(() => new ScheduleProxyV2(this, typeof(T).ToString())); } /// @@ -410,5 +408,33 @@ public abstract Task CreateSubOrchestrationInstance(string name, string ve /// the first execution of this orchestration instance. /// public abstract void ContinueAsNew(string newVersion, object input); + + /// + /// Create a proxy client class to schedule remote TaskActivities via a strongly typed interface. + /// + /// + /// + /// + private static T CreateClient(Func createScheduleProxy) where T : class + { + if (!typeof(T).IsInterface && !typeof(T).IsClass) + { + throw new InvalidOperationException($"{nameof(T)} must be an interface or class."); + } + + IInterceptor scheduleProxy = createScheduleProxy(); + + if (typeof(T).IsClass) + { + if (typeof(T).IsSealed) + { + throw new InvalidOperationException("Class cannot be sealed."); + } + + return ProxyGenerator.CreateClassProxy(scheduleProxy); + } + + return ProxyGenerator.CreateInterfaceProxyWithoutTarget(scheduleProxy); + } } } \ No newline at end of file diff --git a/src/DurableTask.Core/ScheduleProxy.cs b/src/DurableTask.Core/ScheduleProxy.cs index 7f21d2037..4922d2cf1 100644 --- a/src/DurableTask.Core/ScheduleProxy.cs +++ b/src/DurableTask.Core/ScheduleProxy.cs @@ -21,6 +21,10 @@ namespace DurableTask.Core using Castle.DynamicProxy; using DurableTask.Core.Common; + /// + /// This is deprecated and exists only for back-compatibility. + /// See , which adds support for C# interface features such as inheritance, generics, and method overloading. + /// internal class ScheduleProxy : IInterceptor { private readonly OrchestrationContext context; @@ -64,7 +68,7 @@ public void Intercept(IInvocation invocation) arguments.Add(new Utils.TypeMetadata { AssemblyName = typeArg.Assembly.FullName!, FullyQualifiedTypeName = typeArg.FullName }); } - string normalizedMethodName = NameVersionHelper.GetDefaultName(invocation.Method, this.useFullyQualifiedMethodNames); + string normalizedMethodName = this.NormalizeMethodName(invocation.Method); if (returnType == typeof(Task)) { @@ -93,5 +97,10 @@ public void Intercept(IInvocation invocation) return; } + + protected virtual string NormalizeMethodName(MethodInfo method) + { + return NameVersionHelper.GetDefaultName(method, this.useFullyQualifiedMethodNames); + } } } \ No newline at end of file diff --git a/src/DurableTask.Core/ScheduleProxyV2.cs b/src/DurableTask.Core/ScheduleProxyV2.cs new file mode 100644 index 000000000..22e078dc6 --- /dev/null +++ b/src/DurableTask.Core/ScheduleProxyV2.cs @@ -0,0 +1,35 @@ +// ---------------------------------------------------------------------------------- +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +namespace DurableTask.Core +{ + using System.Reflection; + using Castle.DynamicProxy; + + internal class ScheduleProxyV2 : ScheduleProxy, IInterceptor + { + private readonly string declaringTypeFullName; + + public ScheduleProxyV2(OrchestrationContext context, string declaringTypeFullName) + : base(context) + { + this.declaringTypeFullName = declaringTypeFullName; + } + + protected override string NormalizeMethodName(MethodInfo method) + { + // uses declaring type defined externally because MethodInfo members, such as Method.DeclaringType, could return the base type that the method inherits from + return string.IsNullOrEmpty(this.declaringTypeFullName) ? method.Name : NameVersionHelper.GetFullyQualifiedMethodName(this.declaringTypeFullName, method); + } + } +} diff --git a/src/DurableTask.Core/TaskHubWorker.cs b/src/DurableTask.Core/TaskHubWorker.cs index 76883e5ce..24271dc78 100644 --- a/src/DurableTask.Core/TaskHubWorker.cs +++ b/src/DurableTask.Core/TaskHubWorker.cs @@ -439,6 +439,10 @@ public TaskHubWorker AddTaskActivities(params ObjectCreator[] task /// and version set to an empty string. Methods can then be invoked from task orchestrations /// by calling ScheduleTask(name, version) with name as the method name and string.Empty as the version. /// + /// + /// This is deprecated and exists only for back-compatibility. + /// See , which adds support for C# interface features such as inheritance, generics, and method overloading. + /// /// Interface /// Object that implements this interface public TaskHubWorker AddTaskActivitiesFromInterface(T activities) @@ -452,6 +456,10 @@ public TaskHubWorker AddTaskActivitiesFromInterface(T activities) /// and version set to an empty string. Methods can then be invoked from task orchestrations /// by calling ScheduleTask(name, version) with name as the method name and string.Empty as the version. /// + /// + /// This is deprecated and exists only for back-compatibility. + /// See , which adds support for C# interface features such as inheritance, generics, and method overloading. + /// /// Interface /// Object that implements this interface /// @@ -469,6 +477,23 @@ public TaskHubWorker AddTaskActivitiesFromInterface(T activities, bool useFul /// and version set to an empty string. Methods can then be invoked from task orchestrations /// by calling ScheduleTask(name, version) with name as the method name and string.Empty as the version. /// + /// Interface + /// Object that implements this interface + public TaskHubWorker AddTaskActivitiesFromInterfaceV2(object activities) + { + return this.AddTaskActivitiesFromInterfaceV2(typeof(T), activities); + } + + /// + /// Infers and adds every method in the specified interface T on the + /// passed in object as a different TaskActivity with Name set to the method name + /// and version set to an empty string. Methods can then be invoked from task orchestrations + /// by calling ScheduleTask(name, version) with name as the method name and string.Empty as the version. + /// + /// + /// This is deprecated and exists only for back-compatibility. + /// See , which adds support for C# interface features such as inheritance, generics, and method overloading. + /// /// Interface type. /// Object that implements the interface /// @@ -477,16 +502,7 @@ public TaskHubWorker AddTaskActivitiesFromInterface(T activities, bool useFul /// public TaskHubWorker AddTaskActivitiesFromInterface(Type @interface, object activities, bool useFullyQualifiedMethodNames = false) { - if (!@interface.IsInterface) - { - throw new Exception("Contract can only be an interface."); - } - - if (!@interface.IsAssignableFrom(activities.GetType())) - { - throw new ArgumentException($"{activities.GetType().FullName} does not implement {@interface.FullName}", nameof(activities)); - } - + this.ValidateActivitiesInterfaceType(@interface, activities); foreach (MethodInfo methodInfo in @interface.GetMethods()) { TaskActivity taskActivity = new ReflectionBasedTaskActivity(activities, methodInfo); @@ -500,6 +516,29 @@ public TaskHubWorker AddTaskActivitiesFromInterface(Type @interface, object acti return this; } + /// + /// Infers and adds every method in the specified interface T on the + /// passed in object as a different TaskActivity with Name set to the method name + /// and version set to an empty string. Methods can then be invoked from task orchestrations + /// by calling ScheduleTask(name, version) with name as the method name and string.Empty as the version. + /// + /// Interface type. + /// Object that implements the interface + public TaskHubWorker AddTaskActivitiesFromInterfaceV2(Type @interface, object activities) + { + this.ValidateActivitiesInterfaceType(@interface, activities); + var methods = NameVersionHelper.GetAllInterfaceMethods(@interface, (MethodInfo m) => NameVersionHelper.GetFullyQualifiedMethodName(@interface.ToString(), m)); + foreach (MethodInfo methodInfo in methods) + { + TaskActivity taskActivity = new ReflectionBasedTaskActivity(activities, methodInfo); + string name = NameVersionHelper.GetFullyQualifiedMethodName(@interface.ToString(), methodInfo); + ObjectCreator creator = new NameValueObjectCreator(name, NameVersionHelper.GetDefaultVersion(methodInfo), taskActivity); + this.AddTaskActivities(creator); + } + + return this; + } + /// /// Infers and adds every method in the specified interface or class T on the /// passed in object as a different TaskActivity with Name set to the method name @@ -590,5 +629,18 @@ public void Dispose() { ((IDisposable)this.slimLock).Dispose(); } + + private void ValidateActivitiesInterfaceType(Type @interface, object activities) + { + if (!@interface.IsInterface) + { + throw new Exception("Contract can only be an interface."); + } + + if (!@interface.IsAssignableFrom(activities.GetType())) + { + throw new ArgumentException($"type {activities.GetType().FullName} does not implement {@interface.FullName}"); + } + } } } \ No newline at end of file diff --git a/test/DurableTask.Emulator.Tests/EmulatorFunctionalTests.cs b/test/DurableTask.Emulator.Tests/EmulatorFunctionalTests.cs index 564de7a3a..0ba937bbd 100644 --- a/test/DurableTask.Emulator.Tests/EmulatorFunctionalTests.cs +++ b/test/DurableTask.Emulator.Tests/EmulatorFunctionalTests.cs @@ -314,11 +314,163 @@ await worker.AddTaskOrchestrations(orchestrationType) await worker.StopAsync(true); } + [TestMethod] + public async Task RegisterOrchestrationTasksFromInterface_InterfaceUsingInheritanceGenericsMethodOverloading_OrchestrationSuccess() + { + var orchestrationService = new LocalOrchestrationService(); + + var worker = new TaskHubWorker(orchestrationService); + await worker.AddTaskOrchestrations(typeof(TestInheritedTasksOrchestration)) + .AddTaskActivitiesFromInterfaceV2(new InheritedTestOrchestrationTasksA()) + .AddTaskActivitiesFromInterfaceV2(typeof(IInheritedTestOrchestrationTasksB), new InheritedTestOrchestrationTasksB()) + .StartAsync(); + + var client = new TaskHubClient(orchestrationService); + OrchestrationInstance id = await client.CreateOrchestrationInstanceAsync(typeof(TestInheritedTasksOrchestration), + null); + + var state = await client.WaitForOrchestrationAsync(id, TimeSpan.FromSeconds(30), CancellationToken.None); + Assert.AreEqual(OrchestrationStatus.Completed, state.OrchestrationStatus); + + Assert.AreEqual(InheritedTestOrchestrationTasksA.BumbleResult, TestInheritedTasksOrchestration.BumbleResultA); + Assert.AreEqual(InheritedTestOrchestrationTasksA.WobbleResult, TestInheritedTasksOrchestration.WobbleResultA); + Assert.AreEqual(InheritedTestOrchestrationTasksA.DerivedTaskResult, TestInheritedTasksOrchestration.DerivedTaskResultA); + Assert.AreEqual(InheritedTestOrchestrationTasksA.JuggleResult, TestInheritedTasksOrchestration.JuggleResultA); + + Assert.AreEqual(InheritedTestOrchestrationTasksB.BumbleResult, TestInheritedTasksOrchestration.BumbleResultB); + Assert.AreEqual(InheritedTestOrchestrationTasksB.WobbleResult, TestInheritedTasksOrchestration.WobbleResultB); + Assert.AreEqual(InheritedTestOrchestrationTasksB.OverloadedWobbleResult1, TestInheritedTasksOrchestration.OverloadedWobbleResult1B); + Assert.AreEqual(InheritedTestOrchestrationTasksB.OverloadedWobbleResult2, TestInheritedTasksOrchestration.OverloadedWobbleResult2B); + Assert.AreEqual(InheritedTestOrchestrationTasksB.JuggleResult, TestInheritedTasksOrchestration.JuggleResultB); + } + private static void AssertTagsEqual(IDictionary expectedTags, IDictionary actualTags) { Assert.IsNotNull(actualTags); Assert.AreEqual(expectedTags.Count, actualTags.Count); Assert.IsTrue(expectedTags.All(tag => actualTags.TryGetValue(tag.Key, out var value) && value == tag.Value)); } + + // base interface without generic type parameters + public interface IBaseTestOrchestrationTasks + { + Task Juggle(int toss, bool withFlair); + } + + // generic type base interface inheriting non-generic type with same name + public interface IBaseTestOrchestrationTasks : IBaseTestOrchestrationTasks + { + Task Bumble(TIn fumble, bool likeAKlutz); + Task Wobble(TIn jiggle, bool withGusto); + } + + // interface with derived task + public interface IInheritedTestOrchestrationTasksA : IBaseTestOrchestrationTasks + { + Task DerivedTask(int i); + } + + // interface with overloaded method + public interface IInheritedTestOrchestrationTasksB : IBaseTestOrchestrationTasks + { + // this method overloads methods from both inherited interface and this interface + Task Wobble(TIn name); + Task Wobble(string id, TIn subId); + } + + public class InheritedTestOrchestrationTasksA : IInheritedTestOrchestrationTasksA + { + public const string BumbleResult = nameof(Bumble) + "-A"; + public const string WobbleResult = nameof(Wobble) + "-A"; + public const string DerivedTaskResult = nameof(DerivedTask) + "-A"; + public const int JuggleResult = 419; + + public Task Bumble(string fumble, bool likeAKlutz) + { + return Task.FromResult(BumbleResult); + } + + public Task Wobble(string jiggle, bool withGusto) + { + return Task.FromResult(WobbleResult); + } + + public Task DerivedTask(int i) + { + return Task.FromResult(DerivedTaskResult); + } + + public Task Juggle(int toss, bool withFlair) + { + return Task.FromResult(JuggleResult); + } + } + + public class InheritedTestOrchestrationTasksB : IInheritedTestOrchestrationTasksB + { + public const string BumbleResult = nameof(Bumble) + "-B"; + public const string WobbleResult = nameof(Wobble) + "-B"; + public const string OverloadedWobbleResult1 = nameof(Wobble) + "-B-overloaded-1"; + public const string OverloadedWobbleResult2 = nameof(Wobble) + "-B-overloaded-2"; + public const int JuggleResult = 420; + + public Task Bumble(int fumble, bool likeAKlutz) + { + return Task.FromResult(BumbleResult); + } + + public Task Wobble(int jiggle, bool withGusto) + { + return Task.FromResult(WobbleResult); + } + + public Task Wobble(string id, int subId) + { + return Task.FromResult(OverloadedWobbleResult1); + } + + public Task Wobble(int id) + { + return Task.FromResult(OverloadedWobbleResult2); + } + + public Task Juggle(int toss, bool withFlair) + { + return Task.FromResult(JuggleResult); + } + } + + public class TestInheritedTasksOrchestration : TaskOrchestration + { + // HACK: This is just a hack to communicate result of orchestration back to test + public static string BumbleResultA; + public static string WobbleResultA; + public static string DerivedTaskResultA; + public static int JuggleResultA; + public static string BumbleResultB; + public static string WobbleResultB; + public static string OverloadedWobbleResult1B; + public static string OverloadedWobbleResult2B; + public static int JuggleResultB; + + public override async Task RunTask(OrchestrationContext context, string input) + { + var tasksA = context.CreateClientV2(); + var tasksB = context.CreateClientV2>(); + + BumbleResultA = await tasksA.Bumble(string.Empty, false); + WobbleResultA = await tasksA.Wobble(string.Empty, false); + DerivedTaskResultA = await tasksA.DerivedTask(0); + JuggleResultA = await tasksA.Juggle(1, true); + + BumbleResultB = await tasksB.Bumble(0, false); + WobbleResultB = await tasksB.Wobble(-1, false); + OverloadedWobbleResult1B = await tasksB.Wobble("a", 2); + OverloadedWobbleResult2B = await tasksB.Wobble(1); + JuggleResultB = await tasksB.Juggle(1, true); + + return string.Empty; + } + } } } \ No newline at end of file From 2a30931d023c1687304da17f990270ccdd606478 Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Tue, 16 Jan 2024 09:38:28 -0800 Subject: [PATCH 21/36] Increase AzureStorage and ApplicationInsights package version (#1029) * Update DurableTask.AzureStorage.csproj * Update DurableTask.ApplicationInsights.csproj --- .../DurableTask.ApplicationInsights.csproj | 2 +- src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj index f56846a8e..2df1f8fac 100644 --- a/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj +++ b/src/DurableTask.ApplicationInsights/DurableTask.ApplicationInsights.csproj @@ -12,7 +12,7 @@ 0 1 - 3 + 4 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index e0bb41766..7e281163d 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -21,7 +21,7 @@ 1 17 - 0 + 1 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 From 5f61dbdfd17bc2448e7c9d0dd50405b9df9d3bfd Mon Sep 17 00:00:00 2001 From: Kaushik S Kalmady <19279785+kaushiksk@users.noreply.github.com> Date: Sun, 21 Jan 2024 04:10:19 +0530 Subject: [PATCH 22/36] Update README.md with link to samples in durabletask-samples repo (#1031) Add links to https://github.com/kaushiksk/durabletask-samples which has detailed samples for various kinds of scenarios with capabilities to see disaster recovery scenarios in action, as well as suspend and resume executing orchestrations. --------- Co-authored-by: Chris Gillum --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc4360635..eb989da5c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,13 @@ The core programming model for the Durable Task Framework is contained in the [D ## Learning more -The associated wiki contains more details about the framework and how it can be used: https://github.com/Azure/durabletask/wiki. You can also find great information in [this blog series](https://abhikmitra.github.io/blog/durable-task/). In some cases, the [Durable Functions documentation](https://docs.microsoft.com/en-us/azure/azure-functions/durable/) can actually be useful in learning things about the underlying framework, although not everything will apply. Lastly, you can watch a video with some of the original maintainers in [this Channel 9 video](https://channel9.msdn.com/Shows/On-NET/Building-workflows-with-the-Durable-Task-Framework). +There are several places where you can learn more about this framework. Note that some are external and not owned by Microsoft: + +- [This repo's wiki](https://github.com/Azure/durabletask/wiki), which contains more details about the framework and how it can be used. +- The following blog series contains useful information: https://abhikmitra.github.io/blog/durable-task/ +- Several useful samples are available here: https://github.com/kaushiksk/durabletask-samples +- You can watch a video with some of the original maintainers in [Building Workflows with the Durable Task Framework](https://learn.microsoft.com/shows/on-net/building-workflows-with-the-durable-task-framework). +- In some cases, the [Azure Durable Functions documentation](https://learn.microsoft.com/azure/azure-functions/durable/) can actually be useful in learning things about the underlying framework, although not everything will apply. ## Development Notes From 0dff7648b6ec2439520cb0660275e93ae177e8f4 Mon Sep 17 00:00:00 2001 From: Sebastian Burckhardt Date: Wed, 24 Jan 2024 14:18:24 -0800 Subject: [PATCH 23/36] fix bug where input is not passed along when signaling an entity (#1016) --- src/DurableTask.Core/TaskEntityDispatcher.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DurableTask.Core/TaskEntityDispatcher.cs b/src/DurableTask.Core/TaskEntityDispatcher.cs index df7b1bef2..8e6dd7d8d 100644 --- a/src/DurableTask.Core/TaskEntityDispatcher.cs +++ b/src/DurableTask.Core/TaskEntityDispatcher.cs @@ -712,6 +712,7 @@ void SendSignalMessage(WorkItemEffects effects, SchedulerState schedulerState, S Id = Guid.NewGuid(), IsSignal = true, Operation = action.Name, + Input = action.Input, ScheduledTime = action.ScheduledTime, }; string eventName; From ee0861345763b8a6f5bdc433dc9be3938af3b0cd Mon Sep 17 00:00:00 2001 From: Varshitha Bachu Date: Fri, 9 Feb 2024 14:46:08 -0800 Subject: [PATCH 24/36] Update Distributed Tracing sample images (#1036) --- .../images/ApplicationInsightsExporter.png | Bin 341052 -> 117505 bytes .../OpenTelemetry/images/ZipkinExporter.png | Bin 202898 -> 128539 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/samples/DistributedTraceSample/OpenTelemetry/images/ApplicationInsightsExporter.png b/samples/DistributedTraceSample/OpenTelemetry/images/ApplicationInsightsExporter.png index cd35fda8c651ec897f328584dd2cc9924973495f..60be93c254d10d89523787d98870416e51e0f99f 100644 GIT binary patch literal 117505 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%0DZXxN48kGemU1N*nC&aGrw7N|P= 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 z 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

%T+X9xAkJgH|O|V{6o$ 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%0A>D40- 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

r<7EGvxJb8FnV zwc=iC#$`MOO3w#)43Np71LyiRF`1th`op@B9pa$Muo%BFj>YD;+1#71mlLUs`dkYm zRi#0btSqDe5?lw1-iyjY?pxd6hAxDks*dRw=7F$~$2_v5Z&@y`a3^S!9IT>^(_Ozn zOIg?II@IUJ?>VR^Nb20@!WhnFiBOgJ{)*CStvJ>|g>t09pe%I1pEY7jK+*yYrSkfs zw?qNivf&sh=-Wb$(o@~20%@@$JU5yrq>qa`zl7IS-TX^7wNmoX@~=cm#Nw|+X{Qkg zUP>`c+g~(j`#Sw!6D1BaBYxoQdFkpPaw|=CECvlY@%zgBe#I!uae7rTxwLc7WqX;d z4#?llhZz;u#?znKxHPQ3jlX}d-n|4*{GOFa98aO#9(4{Im5*@2_XS%;>1UIX89@Ku zw#R#sfXVXo*vJF-6=Q%xGk;jgpd=X0pzPLV9GoY77T1Eb;V+#!{pLWjGKv||@tA8N z_t+@P^!L^k`L0r5rn><#(!_au;#$0rR5Ns!Fh?k;$**|>QdlMi762kG z5&SJjZI45+gGxr8WZ`QOB9NJ+f^X>;f@_(81NjSKFzk>II5DkrOiKI|_i0>VOSfZf zjeV6{(5T?&$iRg~6XoqgibGXY+tqxZL<}wO?w3GM;7NkQ-l69peSUZ4;f-g%uSBAG zx0#J(Q!SNG>8t)MBc)IvgTCsopj32v`|$*l>+@cNE(1|MbbwVhWq0S6PgrY4-))kktmNX3YRcdC6HvtzuQGiK%sS6LEgkDe2b zOjFBzl9p)mI3qgV0-yCtM>4-k`S#tE(vR8@l)uq6z22YJySwomuhwMmr2YE+TgzcK z%i5f8K*oExQk($REh+^h_u_N>O;zHoCTP7qK}0-_^}HWY@!>DOzyKp;S&me+P4Qp32HaaHbo^H!HN6=_z^ApZy$P@OL*(ko6(W9|pH3e>+()+d< z%HZg&J!bOSF_kQXG5zCPm2y9|^^`1zeMZ0EnvcOy-a3i9opPqL-0l^M`jQ#5r_tr`cHTw+{<< z>=eDKl6F8+*rb^obwR3e8<$7}16R=%{PSx}NyWOXmP|Xz6rf|)v(tK`!5p2ckfCkR z?M8mEBz}KT%;FlOM|8np(5FRpxB4JPT_ngGS(P=9_acX`_VeI zrZiM(o;5g7-)oJz>p=(5v>Uyy8&v#1tKDs`l$qz8zF+gwtLB`c-@3bX?}ClNkCHv3 zSY=Kjuf(ae3<^&S49GmUTYx?t^FahVvD)Y`g*7%x+CY^+L#m))cGhbSzenW)3yk)`= z4c5K6Elv}*!Ye_r9vhSG!+X4&2ph^3FZaX*i!LzeZ529J=3&#)g7S<8a8vnMEyEFi zXhjOb#bfE9YfI63ZkSbOrlCnwtsdOK-EKpxk{R}wPlXQ5wJaJo^FEAD5k)v|9J_{E ztmI7Xu2^rsdrsRHK<&z^d*?hx>#m%Ksr&>ta-k&59VP%P!1EXOz+bRxXpNhpyH&67 zMF}c<6r0F9K?Fw?Q!enS;#f~Xb={8L1riciA=(57_Lz8I3Jg@Zr&c)oGux7ZCk(BW z@74!!_@) z2di`-P4_(jhvuuJCFvax%s!&6^XmG$e~w-4@oQMAsN0lR2G) zjia}VrrvxMmR&7CI6rDj#B!(YY!k$m(J<{SaLhMoaK&#tvjN6rwpQ~2wp}Viuk%x|M~tPwH2_|zY76Z<8Q=v_Ia1T z^@&aY?ct(*n=HmWuYye>e#FooXJIqPa=ea<>gk%0F#d_^$d;wM{-&QNRi~%X+V&u1 zZ9xeZyV9CN*qrE$6yH

$`uYowhrr9p+0`A#W@{UFd1$exFD4Ev7_g>3WnI zg!#pY*Q4C$LKkq8E_K$L`t=|2HF-PRZG5wZuBUbOI((lOzNerr_fwA;gmqn(qRh;t zKu_^!j#5@%juL~m2XdHxWyfQugJEs?eBDHtgZFG>v;=F$^O*TtL@T!>RgFO7EfX^0 z$qcS;JhUwe3;OK6_g}s!P)my^_?4TwrdZ`${$Yo*WXIh}hwr`{sK9=($2OVzYvy2O z2+;|}{?ric$K%)z?{#!%@xN5&{+0U(V$L7vW9e?i9MjP^&j=GD&>J?%#$#ocoZRS> zsM4=iJ4Sr9+VEVS8pCAF2$Rr zKkqqBmZkRSKYSDblaX{q3+#F1wbO@L?UE6ilpe)xtsZsS%Ni_|d4|iiM~`;x-nH_? z?w8`AV>pUmaWx2?JTfu!2XBv&JWxU^%csfkjM1&K``9is-Ml09f0>>h$Famr46m$u zD6A?Jow^P+tlnlH80MKk5P^200l0KH3Y1=m86QYf2y9$k{9 zzxgq#@Xx`OGh>-xYX#rfuD*W2TbiWyD!C9mru)B+!UV8S?)QHo$A8T`YhC{V0+!UYLWtym`h00=er9LUkt12;$c~_ z)Mlv0YPQ}mfR`fTKWVr`^c?mI5yhqWON|^G8)+3`IKdGs8Hn*5EaQ`IgA6Y4CO1|@ zj~EpDXT%`m`zqg3m!`NK7&R&}3Z=+ zYx+4{P(}1Lj~~iX+-@3vyCN$*q7nK7bC%=r1pDG^PmG@X7uBlqi#dZ}Af4qTDC1#J z^6PsY`qML9u_|m8nD~oPdNOnFTDnub0A>Y*M1=PPD}85Z%jhS|Bp;9E{BWLuXY35&~K;VgNC;W zL%w936b>aRkEimPhA>#2bCUceAm^k8KoI}G=HK-%z2B1=QziK$GiD5E6%c`b<5A)g zN3IRy;}TK*0;m$!IBIJqY`Wepp$yGD{rz}6ina+ohstP3^+q#4dBV=P0d|XPjcVF+ z!3q0YGt@2qMBI#7*S%bD6Ns=k=IO=7g+2vt1dS1WhgBpw;9zt93)`{h1^-v;3vm*2 zPK9wNJE$@D+>Jy^oRw;wVa~>z7qao*$U8cFPU61jyUd1~sV)Rz*Dpi8i%SW1{;bfTAFA!B}|K9$>KEU@$FXSz^F3cMZ zBcX9H@C)?%E_g6J%1axRxMvSyq=39o|4JOdGZ6XsHb|_ ztfXZkXspViHYREqUhK=b)LWq^C1UXYC4=%4SEhB6Ab6b#f7|;^Y4hbj>UOASpRIPf zu#b+HQqE=DH#-5*sMefr1Z61K2F7++Z6x0wFJqohxkE3^2FRcI=s6`fgsXG#bb3j0 zJSzVQw`gUf(e-8+%SCc={mQ-Z|L-1XR`QNAN!7|lS(}-_^=6` z${Ao5GI(wZk3K=qk7&6rOCCwt-^hB)YW<=SXo)Vxav2?~NnS*1yH0217ZXKwJFZAq z9bt!z8!vvL;3j=v(rNr5^3kXEP-#)ZfpCgsX2qkEb;`6?INIwgT}_#M61eY{4oe#@ z=p~7a0{0-M%7J8~Tu-ah=Nrpk796TS47P5$jI}%JoXadyg<~hfAM-+`bc(pw;tLim zPM;ZsBgo{(qTfUL981!nYvTnFZ3CL4JYU`af694Rw!#?3ps`ME54?2ZJGKi;>+ZKx z6rT5em#5u4STcXiBJ{lzq=sB_vDi$SU$*(68Ts$8xBV~5-UFzqZ(;it5m2NEihwi` z=^dmu6%ds!y?2q`JE5u|9g$vwARR)J-fQSldIxEN&`Ssq%D036bKY~`@7$St_lz@6 zW&&aFwRhHf*7N)x?yp!n1$g#e?GHa_z!~YK?Q|x!EDkVkL6+;7>9s8X^Z{4Yi?=|( z9|F;t5M2xqnJjS}+|7%g%m1$^ojlB)KZLF0bNHc9_ODw=w!1BMY0GM< zhhwFYLAv1`BmM#w0E(yl`Nd^(w$jR?jD?j(2d9GDVlv=C=OngC)0O*v+wmJC z>rCBzup*%pNj_1~uijG3_a?%o_q7faR8BuSMS^4V9*WZ~o#8`bhIOAhc(u|LU;oh~ zy1cZ}L2us`m*m*3+iYvkr4kXRdnnt`iiN!PS$|%4(=-~*aJXUuCpeS^TKO)oTNEU_ z43N>|sr+|O8oTt&*7NNA!6ZO(2%LZf*3z`7)(jmnkpE-J)U!ty3v^SK~~C75zJd|cout&08X`-e7Lpk0uXT_K7OC=ax_ELKetvk>JPN)4#XeLVsvn}g4{ ztWS$0NHqsYPoqR}P5Z^Ywp?wUIH=68JxszvbGZd-N3gg)lrU89n)(C;+4GIV*jvfN zYYX0MvCO7KJtG^9BjwGrr(`-as8Y)S2M>PYi(m+r6X|)haeHPw@8%aqmUuMKGDf)^ zvtAN;K)RwZ7od);dp3e1p9$-JOj?jz%&gYndP_bi&Ws8a)VE1 z$x`QD`P{XU1p2u7_EKsdENczEY{ODB7g}t?ofp8UMVyg<-50-=GEJN&a7M9AEyYKT z+f@jC%`=#8*5&~?Ua^6&TQZ6E((S3-DVf)ckR@cu2PtLaec?J`tsV$&D&+uXW2DXN%q%9n@|>+UP^Ds>RYpz zis==jcQ<751YO?ByX}3b61xFUC3u=^h9;tUKEf}ysn(w{?S+ez*L|9iQv;wi#|4;x z#z4+{>$~E_K=pys0WFK7T*X*|?#()ict~c#|63YPHK|sd&Jnpl``DGssVG6N+NSfQ z6NPk#i=R@_F{2{-fCf(>m?*+O!X3R?$xT&~K^F3S2TW~)vegn{(1(SMwP^{cQTIXw zw<`TXHQQJGOAeT9Dk0^pU_%(g}ihvd*uH_4_UI@OwT|jOQ|v8@4=585u>cGh|xP*Mxd%*D@nlG z(KHRIN3g}+*QcHR7L6iKMd_=E0Z^xA5;C7ClV3NCzY}2U0^kh3ibLmnc~p9U*7Bdmgm_1%Eo@e^kNQoNgDT^xa3lXKLy63!wc*bex5y z%8G4lYGBI?>qh*LLea)5WJ8|qvNaVQ6y);LZU+w_JMq~J0G#Y8MJf;>EQt^973KHZ za3^GQ%JHb{3b_HlovY|D@nG`e5IW`IHP1}Jws|yBEvbf@+ovp#E^&)!ptB~R0uJ)W^gC}uYCggy0roOz8AXP{HYu)`p9}4r2m5yid1UX; zK;xY3G$iMf_Qj6QmKS&`TA<|zwOM-Qj!T?~pFnWzJI4#!ysw76r9K$0(^%Q}@+My4 zZjmRz4Q3a3j$H!G^55BAV|qRSTI zH@HR~ru3f|z4TNxTkysiUL)Gb?#1`x6&=c49M+rW+zIVFz@!fUD6+FO02xF9ucU}@ z5c@q%+Q{(g%&ia6K{WT;RCU#(zg$?O{o_ekhJQy~!=%nBF(NpEpEtQEE-DW>j_HvG{2y zJ2p_kR|PGvetAgjc=B6U+@yK#{0s@*3l3S9ow{H4@F*6kjYJ%bRRiitg16Ukvt;8# zqjTu3eA47AJ{bqTnEgVzWOFHH86x`yt~u9 z={td>!*mKVOPAi1AhRI`>H(dZ^82JB3Uas4>`GoqZE7c*QF(Y79XSPI!e9QHq6pXh zTCT1Midu*o>FJVO_wVsKTBPt!$g=kUMQ6C!UTJPFaS5Eh71-*<9!pp!mH{11e$F6+ zBE4q)H@)H}YL3TD6{@?N=7pzr%hzW@q@YG}$u_nt7l(tA^GIl~%?zJ>zW*GpnO-T~ zvFNth2Ppt-1;y~P-7~Iv*@aSqJ7}zPrka~1CkopQfC~4;f!@?Y)V>_Y#-`eW{;;lQ z>@sFyWhszEVpNjooKiWL`!_lX=zF+eG*u|viZuVmxMH?)BkoVv=^>m7*}w5es*zSI zGF%X2X{gQy;>KNPD@BC5q`?)DzlL8-86StYGzNPR?GHZq-iFcFv{4G$$?muoZmllw zB6l;3v)&K6cXxlXDfbV{XBaoDPRF0rYzX>yb`S&@Z~)`7?`a~vRQnQdhho?x`ODui z|IOhvz}@ggSLQF>$=OQ&qA$m&L#y+nxP#lRB%YCPA%Yd{cR_+JqToR2$TWLY~Ejwld%o}M;2P# z5F~fCW#TiYqqVQ5_|XZkX$r87@q0BK*Usybjimi!>;iZpUbhcxFuehOP|0V^oM`qx z)Sn^~x+i~{oFBX2;^Imw5&ByRNQdiI+zoX|k&egI8sY)yh|7`qq0K0>$p?-+lc5TZ zHSE<{=tlTIg@B>D(g3(rQ_I6EumWIjKy@l!0!-Udn@{DxwgtyHbXc8sEF|wgJhcsl z_g4)nKEttlt>*hG<(t<~P@!@L#)=LE2;lw+7;}(-)L-1vWaM=vAb@h>Ccc&;RQ^g4 zInPiBU4a-w)OAT8ZxyRS2W1ifgDSGY`)6JI_k?kV0RE|`(ZtPUvFW1Mku?&!DVnQi zJZ->&{NG0kK$61Hu(#9!o2|PhH9sp5Ci4J5-CylP1zGFWuhoo~IM<&b!5M)T<+z&h zPgdXjuyxRdx>#X4ie8#{4Lp#1{%ac`Fb(CjnrY)!^;~CNDX}d8L1NesoBVPPpWGES# z@Bb2fYM1c;b`byuoBwakfKReiNEP@kysOK z((V2MfJkIjU!$$?F_?4`RhB!SGq--LE&Lg?y8@(?5{Gr-tXT2K06s3i37}~cei+KM z)zFBaI^^c#8{Qg24MRXDNS_&nu+aQ%Pvhs*XIk{oLjxf>t{NF|B&GFQ`v_aBfNuTTg@66sQ$1osQ~nrly$BX)qf}5{%QQXm1ums z@1egNwZpE6`MZSwP>BL7gud>**%eoK^t;apObl4ouVrbE%<$fN@u5xIZ`VmOe1btB z?*{bOax1ic0h0r`C)O4Ppf_)CE2}1e_bw7yc>K^fk1ah?r*Q6UrAZgadg?b)mm=6@ z8ZV}?Z97b>1kC+LB&h(IjRr+*pB4BtD-&ROO^y4%xM8xt)HV6jO6_^7cr^qvl(zA$ z3RE-2@WfirP)a3;n3#?ic>V%M*28hjCka)50ytDzzSOm3BC#u8lmJRb*2c{Wu4oR~ zT>R(Y*5(QG8&&^wz?uA=i*{_SG<}7xa}uj{_hfF&(Y9&mfXRHTwq)C~@BZ?MEr}F5 zPT|`%*Ha#9nE-Ar42G;^YeZS9D~4WrZ#_F2_h%%v2&w-SdSP%%iMd(I?idinG8{IC zl7XII;J|JZSVil_5sAnP3il>B2(Q(`N;qOd}Kz}wkF;%?3Wq!4>vkAqZ@GiR)p z^4=K?z2}sGHZ^92l-(=t$hMoKdjq$0a5ais)}<14C@*n%f4)+@a4l|i8zh$6?5&`5 zU1B%unU|(*QEjM;^6uxyLOQeQ)IU0to!+^HS<2E1nUOgIwknA7f{Y+Rw}*G9EzU_lv`nQ?U}*c`LklgKYyVm4=IQz2DvE77Nr@x*dC z#f6Xhg}miVy<{?cRa8-`SaAEoF*=sWc&C$;Lj%M!vE!sT?iCmv%gwjGnels?QIbTu zT0K*j86>vHHEvA5b9_60!d5S8iR!&s=o@xCOgp>0LEtJTp>f^a=5`KTVq9Dcy(!G( ze@r8=g+-q$odfp$p2vbYpr%lfW4PGUv#cW;e!oH3dKTK-V(UYn-@E7hl>^u zW^)mw23Tt(zG2T+`4J`Lrae$zNMy56t^-A{C-!<|FjRZp=b51XyB3rwd4u=79HLON z7!OX4GM5Wr!`mO(lu1srV+$7UeIBSV@!i&d_p4o7O4=wX0r@GW05c(W3;!U$)f5Qu zCG-90PU2HtP-6`hLISE5gGEy@H;Icm4PfuGOR!P$O%b&p;-O3m12ny6$x<#log%d| zrEwA4sCBJJF|2(nKvgZD@V9SK9Ak!*f{$@{kBvtVuFnmMSW;8W&YpM5P!)oa=e>Hqe-~k}vZREiP zv>%BoMQHWDRuj~ib*bvCv=?J`OTUx9VcAhHwPVQuu-?LX$vr*7iPrLNrL50DIYaZ zwrHVp?rqMKTsVUgR`|eZw||cVS_SG*=D270Hx$ioFzZ`7CZYvUV>UD(qJj zI{-b9>Y2N5MDDx%wzW-hz+tOWG z^c~DJZJuo68IV{s{~!P*HhaCx_CUMMRIhageF8uQ2!XGwDvdnYA^^VR#ONH^#YmWk z*}$P}eke^4CnAK>>Oq)&11?=-&BKu~zgx$MNfDJ`PVnQdWY>GE~Cf3v=37;f+TQQ%gV8- za&*|NfpWeO+drR146?Z5q+e@uw5*+LW15bNcmy2f?4i413?k&YhxnBX#}N!7fa=>IlQ;qLQ#BNA5n|9T=O7nz#(AomUZ(- zv0p-q_6n4T55vOe_?bfpE@N36$d)yt9<+J^QjX7ao!_J$5_~sOEQyI=ucQQ0D}jF0 zhQy(|Wm7cNIjD}9+y1nKNExLvlM8um3ApmBvJ{wqtnvF95Swk59!DJn_ z9Wn}OOswSfwSO0JL$%g0sz&{@%~6E>Q!kx^(eRUI$gh};jSq;s#L+LppvBS-Z2jSb z879Qf->NMyqVYL$Se$<51gE%1`FX$gFeuuoln~zD6%V-vf=K|fKIqol3mWoYRc|+5 zS0hy9-;!q!3(AkS8RiiTNaLaI*5oz>`^Qvf%Dzb}7=a(uAa@H|;QjR1MmZdRRJTDc z_ObiU;{v#g8u;)mP5y2XW1Zd2M|a64!E%)OQRJwZGX~s} zdCQ)*g-X(B!=XEIgc#d$l0gn${j9NjvlTS4-d?Pbg`SN`zW~;j-IpZ)f^rzvH z7FU;;{5ee5Z=xy95p=v*mSShESFMFBP32x-_TV<WgtR!=fg~eMfh2F zkDkE;@3+zF@nmKL?5>C(R9DqKZP}Jzn3fZM)0vu;!(ik^etFyO)W+sEeHi{+!TGIFrsLLMV zSYubJZ2vztH4p|rwsYWeX6#bjkkONW$+j?dg=tir=7DQl42f>(8O<8o$RFo4zRq1O zuLsMT5;Vmd+{>;x&aBg{YywIkC%kq<)0ZLru14xDmwSQPQPa~NGY;6@BVpJX zja`3G$i&iJIU4SzjCoq94s;rNZ2P~<9*u09cH6>po4I#U+$tU9%8t6geYF5%5WqA=7UOMi{2(=bjk84A8|X=~7s2#cxeb-$2gmpwV_@zQT( z@pf*+mjfWRm$IjN*ftA4fL2@*-tK9PEwA@RVZ3IZjs=^^F_nwqEl7OPjoRU3MOv2d zS+4{0iAx}cCMdK}eL*UeR6)h0>&2IODz_zJKL#WRfZzzZll7*5;Z!bVZga%KteK5+ z#-_cV79)z=Edt@NQ!Oqu*Ztc}!?16qnmj~nE*J~@3H50RiW5sSd9l!&8R83u(1zPE zpbL__^7Nto&2=*w!a_9hftcH{ME%z=^3qn&& z4(;P5dgb0oM1UaWw|KZ`k-T4Q=C6vYN;4*5>-W`uYo~87<|x!034-l6KN;W*X;)2eBpr=jXsu9onm-#cVAAu zq(1_n@U@DJ`t?W&?;kr*)hy1eOuRge46otCxDc1SOPcHs$erd7>YVP@mB`()m%%kO z^w-WgoKWgU^k(yvg|LVjgd7To^V34@Ie%?*Y+7a=MqGt=m|hL&Ec(t_sqI>grsEA| z#G(y&_bk<7%Ju0`7pPP1**gCBg~uzG3g-*b_078$j6$z6i)KB3+Lgl6-K(_9aN~^J z62aqmn|wYJvA>fJ5az|I7g7;d4dU3I){p%-`j2oHf6k(cJIdW;J0l&9qOE=KU(Jnc zeB1CVnNKV2Ct5X&E82omoQzs47^aqPiX8d#szr2|j*-JQ#TdMOY2EVNrX{Nl9H>6A zUY%9g3><(rx9ahZZEj!R0?WwkK+kRg!!J?QIUKX{$TU0`6d#@Cc;d}Rc#9Z$R>^L)P- zEt?F5x9%d7ZJZ-5CC9}Zr`<5KLmM>j`){z;Xyt}Y)RlPOK1F2Z?m+9@@-VOU;qEM0 z6-hb$(HC7S!Hn2L73W)83mjY-LYj{=rdw#l6NyydDf@;mkSN&IWm+YNe#6(e8 zf)_{!VaCJotFVdc+2G5IhN9(_(zo3C%L8kL*-mh`T{mKPzcXUc)~Bmim!0M-ts4d%;6~rD_hE7xm{Y`$n*) zZENND@XBo{!lrhV*V+EqX2cBO0#)CIUIv=#r6a4&pnFvpj|Rs*+84_9+$uT!af6+R znYgbA?GvDL-vY|@s+Y^GmxYfn-R|ra-8v$JpHfLpDWj7Fx|o6m5p`<-i?LyP#j-)b zkB)}vQT)}9cQ=&MMLz-m{ve7<1w|5f>LkpB4Z8I31qbzeA)4#70F$MZdG5Ib54^qeDFwW@FCT?;akM zc<2kcdBZE66{}hdE{BbJO+i9GCD-4F$&!*_45WFdVj2lm&ocbAq_8b|;6jDvn$f z3lW{26|cHg;urfRZ$`mhdVjX>_*;Pqw`p9d0!lBw*49bP!<-f|7#iyQ3bm}q#pTG4dB?0tVz(t)#R{R;D+xOuOnXD|Ig z)qSIZ6fOC!93e%A%IC9h`%&QLNZKXerlO5uIx1QY^{ zZD|e~|HiD6u7St=O9mjLnZi~5*V$^n}@8G#f1;|eJC$iep!E;x0miKtB5yS%Wr z_2CfJW_V2R4`Wqs7OEeZP3h+t6%#&&uIfIZisycfUg zFQMZ#SvOk#VcFdL84y3NkmfR(#hNQ(FE7aqDfN4&nNsS zG3X@dAwdtWhzOPDRC2}FG)_Hrb@O-Afa)^pFLA|J;(v8XA?aKDMnv(XUu@Dh ze*j}fi{dE<@uKOE>Z&V;GBdj|2FwR+f9;uffX_4r1zy=!`^U(Z!p^c8d2Ug2j?*eI zp>O8=NE3Ns#c{F@m~qa&T~|0xd^U zuzV!pzs2uSLri1lEgy^(E}!vVWd|5K8)MtOZ}CPxTE0K=@|va0oI`adKvH#gF0xOW z9;^CvcwoSO{~W44_;>GiaO2K>OzMFkG~{GTa`f_uC|rQ04Unb&@z-1k{DRPHZky}h zX3($3NkCVr%qZ#gAN=oq0N`WLTpRQL^A*Z}>L!210Vq8;D-(CW_U}WsqvDNf>%aRh?-dB<1J6{EPgUWaf@{_FaI|H+Kfxs5yeJSqe!#Cm>^NlwEpAnyDV8BZzw+f_(L&dcE^);LbV2Q%t158FG2UvCyQX8tgl z8b1bq{oEIQsn6Sg6Ib_^e0XcvqV(^SfRAAu+PB*@@0;?F+%7kM@Z|HAS4tg!oR5P& z&z(0r@VRuiArXGK)f)a{y%hKDb3?Mi$^%}yobI7Mcv5%;~y;|>FhAGjJaIh(6w zRj!8=c36*05j*v4-l7~(?7exw3`I!h^Lloh&y5%t_m|J^z^QE|O#0N(L*=-SqKAx{ z>k1Bycl6fQQy)bSD8FDjh<&)buAIs1+0**fExnSC&p&ECTf#q!Q^es+S5EBfqXvy= z0X#x<4&uRXnEj@Mw|Eqs1L$+8G#YmqIhPuFeuyZ7?%NI=&Lc_(I;MzGF3vnKzoM4Y zeY7F2clTE_-z6RHn$2O9_F>+x)5NmxkTpaaAIs-6Si1YSbk#usVv zKUCrop%*^p8)u+GX=9Cy#7{~IJ|Yoag;G*`<=zJ6`b?`_0PcZshA}3<>c>Tev4{UX z>^_};_j6`)zPqWSr4^<4TDqA3MmZ6M7F*va;w9z1*I1)fZY&GhK@Xr+$=o+v?wz`Q zs_OxtyNC&^|KxaRbq5DQtCNttbzAspqH$dD!e}Bl_5+5sFNdy=YnB9`3HE+`OOh<~ z>#V=2bea{-ps3@m8D<#IF^nS;<&+wr667_HBa-}DwM|g!g7kn_sj9|#cp}EtL6pw} zjhIS}507;wLpHBA`}JNXuETS&KVE_hx-R^>3gaWrbSx04?g}nKF^%MnLyLiEJ*MG- z^KTBfhG|`Jh0}K}_B^sb=-~6Mig9j!VJE4oUu9kwT(NeUXn4oGrW;{p76&$R#9EL$ zJ#Fw{_JgebyiH~F05*0;9R??7AIUYkGmf5{^w~fqKc!#x2Y0)kKf)o@3`BSkuYvZO zd=eDCO(MUHS{D_Uqi13AO?W&mkJl=mPLUTQhsu$DxBNUh#m>?%Pu29xH<(C}GS5J1oO#IPfZ@9^fwv`^Lerc|N=ia!& zahKyb@a2m5S;=E8jZ%K$gJJxLt0;%6&AJh2ph0+f=PhlaT@kalKV5t@O+YPZp4#YM z74uAY-ZKue?Qlsr$96OlCqxmLff#TB-?RB7W-5)ITwI(PL1RpEl(AutlEJ*Vhj~No zIXDGL4q?wgM*A1dhw{gN3gorZ=?@It2)ZFS2h%!}tJC)VqdAZ&h!b7CqFUZMII#~k zyIiXLcc_*?vL2j{2%1!!?PdajVn*yBpY7ILF##+#KGXMQC+mi8P28fq;bzaB=I8Kr z{-Jy4>rh<+${1{Cxzx>93Yu83Vf=L0uSlGEu4jNZeoY+*N0CPwLB;4z8T1Nj9m)9? zhwP&0rN)<9=Y*-76A_k{vD{m6%}y0W8As`%N7O~d`(Are{`MNOVqFy7^lv2Y^M5A& z&8%Tv@bY)~Y4e%7RHp@5RFU(m6v@6id1!8kYs=CS_40fTdGc}EjW@)0FVE`VecLdX zzN1<%LCs@@TzvA*Us6J9k%}1PfpY3%#1VUyf=y{@KFVgC2$(@74499nix8uM*v>>4CPfW`aSSVMxz zB;?7rnId`S$Mi2s^&=J2iY}*~46seLMQumhD5aD{TR0*&Y>ll7&2n~3sP(7mC?oB{ z#rMA7t5E_bEykFc@IC!jIXHu3$Q}2$hYlN&v}?XoXJguGRKZs8(s8A4l)CNLRtV~b*zL?<}As)=|09GbJ5eb^eK=Zjpr{4i^+#7XxBaKnnx z6t4ncCbV3dfY6*tZ^pU% ziCsEbXG~FRw~1vVt4qm;L+4u|jBw3@^i|FJNSk48Y&PkF^%muhOyd#wi@WaNaE8`# z5uFI}=b7pdrmD5qb{qO@4Ske12)OREYU=UThLEaHVQ~p*rSrw$&=AB0iW}`Im$v^r zqjN;-Nx`12oZi_G!3EO^!5ZL89Cr`w^Ka-nLiRDXwXE}H34&Fh2roAsw za`)eLSwyMgYToZWtoHlzV)z9-AgC#kUh;k_YC(W7=m;z0P2A3*BzKLm%huIgY>T$a zjY${8r05i}$A!0^Y0;2&9mvP5(QJE;3i2s$J$fg0?I%t=d1-6ecOw@NbFr?S4URfP z%cnoiIrim-NZn>eY;DAD!+RgoU)f%*FKy6EmY^Bl`y{_DFp!s*&Y6X{zlC($ez#F@ zU(T$2K;p#VzF#HF=HpVula~8o`mP4wyi|&XG?-+8@MK*-l0)_VYRU6FXpKqoo1*77 zZj7Ytl5OeIv+R28MM_w6pwyqmQD5$DpCPOlPv25^xrL%`dHf^y2j^2L%kXM1j!|_I zB+ssC;(aXcsCn`ZqBP>grVY0&n)yuWAh8`Yd>mz*A?Z6qhR3W$g)J6deOApSxMgf&Aky9R!S2G_3pUDa z$-~pbPXzL#4qVS{8+*L_864jdxMAm5VrPYXIGCHSgX2TDdU!){YKB7oQj<~amJheI zFO%SIi_Od1*6fP)Fc|*IJsdxe6@*Eg)@|5$Z=i*Bk&d0X?qnuc6n0Ks08^J1S`a!h}JT(h_lk{94*0 zr{gUheV^^Bli|c>b7$S5Jg{G3lnn$xM*rj_-eze9NBbMU8!hkM4sv+4`dy8J?_N&= z(5vcJei9uxsL{k*iEdc`hDxb_XK&U>vAgtqbny8f>ximmBUwX#j|f8@pXQr))39_* z+`2hB>0%}@9^B8mRctj(w4c_^x>~mZ53ba$0cvf)gB!KKltQoJbM3*sP;=aHH;$~O zrF7xF-{pSA;f!8No?lQp8sSFNuK9u<`w1YZm}C_-jEtgTl4t^hdRJbchhBzeBu75c z@lQL>Uvz#|5OMV~)Ce4f#hua3(4l0C&i;}lY0Rv2sRz!3&cGS)P1`jY1z zi9K4?+G{8EY6;RHb1Jm2=^CM#`M^mv-G<|#SDXf2gZ$s|! zTXm3p+3gm^?d(mzD-)}b}XaPl-8`vGAjI=_Ej;VXQ|(j0*rNcDb?sH9$L zBG^+HO0<8mwnxl^JksY48S-+Jx~~PA_wo?e^56AtMc=YCN&}a0OTp93P>1_Mc=b)o z5X6iKamK`V|-A6XVqhqu*J_1AQZd0M1Hw-lMu*1X;oE zIaat))VM{VY(M1#snf?pvxnpnw8j+?(F-SpejsP@3T7fc5kJovRdKgMn`4v3Lh$3? zhn2iz-GL;zMsj87Hkx%S17@_oZ|Yog<1yJlC$`5k+8ab;LTAYC&=c-dK$qzM+T!Yh z9MdYw766)DZvipH_!Z*DnL@nk#-PLt&>sS~=S(cTmibilFDT8yNK3t_E&p!P+H?041tPWe6_@XxO?12vkUukVVe zale~Nkw}&Obo2hYAd@`U-vN6bU8r`CU-hei(%f3fp4Z+)+ zXVkV&S>>sIQRP9Gv0hDdvEYSYV6BnE1wQccB2qwK_;?~-7%YdtB!WtPVO#VFJH6u# ztvB6F(6aevNvL1oOr@>l)6W!_hkZr;NT~E zCUuzsYA=-mA#|a>LY~}DQ75x7qakE^mZh^VRm@&fqCRX=KzYcL*Y`;k`h8^3wn+xS9Eu8cHk|+jCD{B^fEw} zTaIBUy7B`qz0ky!i16vL#1lh~7SbJG|yeM0Th zMnP;b1#4gXjx$DJxW+c4EkMca>XbZM5m552_=)DADNjfBLmZ2cE?JXNPK411z)cDH z>mn9JmH^eUOdqy0ZS{`1{k=)JoBJI|Zxd^(jN^BoX}0(M6k{pE&WIbrA?jnZUbPjn z9hwiwR+FW1${2HJGuAW1!*s_!a(a(viCyx|4T$32JpEl(YBDt$3p_3v{jFZ(S~%4H z!M%1-^7dxhDk>6sAKNz536rYYd|kLp89uDDv%5{8ci^MCEFVj2?6dliz9rG!O}tM_ zvD3nqU`|Co^2ISfCCi7wy1I8k;`dK2GtOmy6hW4R=0U2khh)n#ifTe=iC_lhA4>xs z__15eAEpy}GPnAZBHs*Be7jiFvL{{Mu>^dgoSU%FN@IWw*l&ex|YGZw|Z* zQh;Kn2$VmPe6n9~qJB<(ln?3Th#RY&h&g$Sb596A@gZz1M4z#!Ikj5qvujBk6)aUg zeq!&H8##fKomSSN_u>QhkJJQ$Pws=Z!?I8Ou1+EUSXvM_0GK+NRxcaFTEVW84YDp~ zTX2F+r(jp6*fwFT_-ro5B`Z2UiGr&kR}jVj{r%|uU|LR@q3ZVc27%MFrgR_Bpr=o) zi)ukm_Z`uuboNFHGTW3j+?S@cAYLFCeHZhB%%6`l3E!G`sROmd`^YPwDjz5CwLv`@es`6dh~V_k%bl+3yto=)qcKt|5@}9<6|k z9(Ms7rq^^pnQJTT$#pWk{Z4SjAbd8Dd=DxlucGENzoNopbm6T0gQ%_xP;qr>gDbZG zqlEQ8-n4mm=1mO|{xp3ToJ@U?2S-jkp%)#-ya(ul{qOGq6kh5SU2*`+i>M;CJf)L^$hp1vc?kuj&Bf!c z|MHvO=-uhNTwQl+)X=m5M)m_D`{?c92HdVx^?oyzYMKwkFQ$g0hqBJMpqNv0Y=FwK z;SsNo1{&*Ifx!n{&TDZw?dPY=t=`J2lZ%WFOi=!hd0)?q&>g3yH&q;f;W#jXpbx0Z zO08Uc!oV=7Bdts$97NYr0mVq)(Rg^>%Tr%GQXf>gU7zdPzvudm-tE4GtrN25OR!OU zmR!rH9j4uIk%;zD@?VD=3IzD)W*S$8M$k3Nc#7t2`pzYSDDl`Z{smTDhu;WV->*VI_|^Rf2S%eCd1nd%qPvZ*&a_-=W|Ea*sr&#l2fkb%z83M1%03NdvrV7VDG~n)JpeJy ztiX~bpz%gkI(e(SmX&BR^ZuHr4D1@Tnv1P5MVso)!Wo`4aD{5aI*Yluh(VvBB=I^v zTd{FikH!mJo!vENXPSxi_!Rf_f-_O}dlhu-F?na1o802L_9V00UWa#UgwHl^XXYO( zHoVQ;@9~Y593J&jK}m$aY;brl{=~m`c)N9)K+gYWWScZ3t8&`;Sb9||oZXm)Fx8by95-5-&`0n@mN6frf z5GsKO7FOO1 zq63la{*KHoGEHD{fLY4?c*Iu6YVgMgB&Be9N;8Geg8m4Ocq88{<1Jkt;7bNC zl~j682&ZV3KAK;zpi3ES>ef`yVG7Z3(}qJj>Ls7IC^VyKoj6{1`MTiz z>w!{bAlq*m`&p5tv`E^(go`f@Zd_!hR($@^wF-N&k>p9agNUgSbzW%+`}6h{Fd8yf zMPW(0T3BM2BiVYpGnNeoJ8j<k?dkA@ zX{MuNKguqNR^e|a5#S%oeXduAoKHs~aVmypVv03W2FWa((WW&AoCVs^wi?Pq!*!G8 zzi5gl_x*kve6Hf2wBX}0b+}vDUHP&k^e{?}4<%%$|(evq-W*{U%GFE|%{a4Ja?gVtKaukd^>MqrDH#^weoGF|%=cT>)#-}}P$NaWQ%9NnrK}cZ@X}0a zM^UM5D~B6xV0MURrdqXlnA0=9-((!={_+m{+lTWO+t9|h zBvTo8CCzqMnmis`BltkzdzEs&B_b8PbFqT5oX;-ZCW|yV028?XlE~dB5?8>(C%pFfx7}+`c8$S? z^PRcwW`CX1uL8S}aGg($Do4K^>IlLtjiE>4S9(=qQkJe$fC6bO(>-kc9s)XJTriAgbW%6h9bwW@r{m) z&v}Vl8>UDm$B5L&9-qBp4=5^?&;_;qpi0r8zhoQU#)WwQi)w?2=~Jm6N@G(Eean;g z>SY8`n=aODK=&(#_B6pV8{UMZ8?gi&t+!gu1DK@Gl^x0{J;ODuw85zZ$t&}08g@A| zEKOergdwgpz?zn?PXpH3*yS#ast^$Y2dMc;i>51yiWV{X3 zoDulxUqHmxD~*df2A{Wn^Q_y90L0qh#4&&AJJc^q2WO;m4Jnd9S?e%2KViEGrlK9 z;qA%=CpEh7xO#h9 zL-ZyCvQSoRSDo>A#>%Oph}7~t;Y)kK;bR-uQC9wyD*@p|t+|kp3E@qa)?g2rb!USw z&Gy9(en;i^zDSga`nm}fFC=ouExV+71;r_U3bh}tvS9{oEptX+eETSR_xw)m= z$M#3-+tksLH={~dbXH2z!|Aj^{bNNk7l!Qo`pA<5P)PlElZ?LORS`7#bVH$1ClFVj zLL>*_DN5)_ADi~Ngbcd1O_NychIt~sc+OTmGy*UB(?4y<| zldLCdkldFHM;SuOwk_uiHu0E%orxx4$mPWvoJAypCTjD7t{&WsDt{CLe*J2m@plVd zjuD_kRE$2s7ZVTzCqR$%J=@3|bngi%^Fi4c z>(y}mkjAxGmAFKF<>vg9nC&lR5tRMjVsoLXMbG7)*5%wJ7pdlkr{LBTfX zR5Kcas%9xoTu*j(Lp6B+mLRnfEfnjh`-DW3=R`Ov$-n8OF`G*9@(HNcJ9JvX5<6H_Yk;m)z(X|AY8c` zp{>n?8NA(I|DNsdr@@fg_+p6PHwP*zN-g-JQssPS9QEcqsDrDSJN5Sz+2U8e?h`v&ystL9uP5j{N<-#4LW7_=s*W1|g*&fDu*!Kg>ext7?Lb+AMN9VHC zaDCK1?IAR0un{IU+MguH8FzY|e`{x1B}-k{_0{Kk%u@1dvoCfMDJI#xF*KmnZOOneZ^RaS(RW^O$lCSTpH&U& z?#T9ga>jK1BA)eGMMtSt*`@30-@BG5;DK1jEm##vg>jh63n^=f3W_xS1X*dd&|D z4EaY=w2Ru6F19mg6OLZ-)G{ukExt8|4fv$zI^KAH@a&s4k}rB=DiE5LCW71=$#<~( znTCewb(~wiF%gI4zfncuT7hOmjM;fj@f~xk3u&7M*|q5LkR?&LrVslfaC!$y2$7u? zj+T^-<;qE@{WwP4)uk}Ic)O9PMXBWktNu}7CBu(8iJ@&=cf<1fCX z36RlHl_^5~Vu?x&gh5Nq3mvY`{$Z>QC(#P}NN=o%&^6SdG{U5}Vj|8%Fh@{2a<9*7 zJ&6}3!r)_&^ycH+7vaj@u+ttBR2Y%9>f&}$*n!tdvOB8!t(qL&$4_>+S6fQRs-v~n zIyqM6tJpC1^ywya0oKD~hC;((8s*)05Bt(qHyzv9gicsEFnX4fe$EO$g<+_Zew1!$ z&_TzJwG!p~M1pcz9b{38 zf-K6HYT7ftSl7R^C<%L4=F&slrboK<-J3>+-f9kA3-i6_hCh>BEWIsa0jT+8+htlsT!qNtoy z+nw~nCEo*m%D}Stph;j^LT$W$6&X1V*@?4#M2VaF&x07sE5ug0eDLGFPkHm3g^>!Z zoC*)kD<1P>7Z}=&etxRGSgxd6@@v#^PK2-civjo_OjydDW!x`*&b&Y$hD&9OweQLy?M z&;Y-K|GG%qAKMyRHZY#<3RyBH_@y}c@=xs?o2k zt{%(&c68*qr;2vWp=P>u>Z)Soof}m{at*<$=s4mM3by|-8@ktr$)^~dBa*8;f5OTb z|FE(*{Gg-l@)OFS*fP){M14DGdYj_ZsF8bWm$l*E7gXut9(;~d)CzQPRiAYCK?yzY zn>BDo_m=VmO+Zd~m*I&Y37Fd%OQeimV4-6JG1l*r3Xk_Z168<9>hV4>7Yzk@iT!nk zSpMsE1hx0Ea=FI%_&^El3Rx;Zzt4XifflzSi*ANc*EJk-D+s9g*Fk5MaKmS=yLO)1 z4XeMGN=K{SG4dGK)95Jgj_VP3u&(f1C!Rd}OT_c2ZqW9h=k~FI?uk~(a&oHwQ=%mO zUs@%ZGj>ia6uec4JJ|>W?S2gby9IEOcdD`4x(}uwWYqTgy40TPP#9d~0~jyzC-wSpu}S6xmY7Y?CDykK`eB8lxNtNK}Ggw1(= z%VYSoW9BUW2@&UFi$IjpvCC86AMBpVU70=q^&WZrGq#Mk(oDts#=zRrl`ab(b%h?t zRkLI@-Iqny9*{tci!X|2ad|-XpNSUyL_^i_9e#gwZ8#GoY zms0?t#_R+X=()Wx4Qh=pZ z$W&ElP=6&sI&1X*vN)6I2tTdiigZ@eO7~@dbCWr*$I?s4ys~D*h#?%?xFmc%M|=}M zp`(;%4zTbLAK|b=ZVu#Hw6})PvC1r*pR95ehiCpOJqU~jWH1+x;Xh{odt(1wp8W3O z`E-B-p|M@V80ZUxI%bE^fvYN`YD%(|Ld;Mihwl!*@UchrK}+`Dbj73`yfTjDB07(o z^-A%bp3lnsa9yRfa@e@A%B5vUftY2Qk(HGI^2=uH$oP#;dD($ESI!|OY4fs8>suq1 zJ@`oFh@M^Lvv)XR;cP-O$L1EFdBUzTD&{FCUL)1#GvPpFO!Rs7gIIx% zQoZnAlSG3I%+`CKi}SK`jxbHVqBKQY2ND_cF5$-SH*1ZNGFcqMoNF8%hYQc6K7}Au z-`}ggiw+SOJa~IpL_U9DL~H0On#qpx{<@Xq;uuh@Dv&4AY)9k1FlG(9=uZGW>EZ-ol?ncO1 zCf)jN$8^$TuYd^_a?6%ZP{jzSpMOFE(=IUB`^}esX6EK?|U7h!ZLTD+aLB5=!XO@ z9%Nt1{5cgJ9db$0RP?h&bRN8@h%Ncaw$^1)n}H|J?C%@rpHSDp5@r7qz(FOOsiSL~8+ z$DY3m*f_(@Gb3{5WbUsnmm>!5YsCrskZl|Kr_)P}TP5Ehb*sPD15U{&52mQIFFvQx zWGyzNM<~qIrhF;)|NIpeD8Fd%tQ2s{JRz$U!*$(dn!6jX&sBHCY%scZ(q{uV_xb7= z{p&%>+0M(c`k#5R0^KD{Pc@x>i(Lz=40>Kg3G?YnA{O_!R=NVpRUyKm?8T&^&b5h#kq>tX|J?Xd9-E4S5; z4=b4CLBLKO!>3l5*j$YyX+xdgnejONn|bNN43MIV^wR4F*GZveCX+vR@brA6R#Hda zig8_-n9~(hDR=e`SJ1f)FaYZ>k_x$aYSNE0K_Pz`2Mck zxD&rAoTRb5T~HWpleTCWB3yU$EIa-4`crt@>+v7v(KGbEkqzN{o$a&!Jkx%-l(1TS zVacAA4!6yZuNu8w8+YN4Dr_WYQQ;HP|Gz{>(eD;Fas*uqT_dnR?UNu1$Mu?xC=Oqr zf9`oU=a!||+KVg4jN*|q}%F@5A3w@YW zb}c+P$Atv~>_6sx(fJXu0>$NJ=>*y4U@GdXjjBCA?@pg-NbY1|dJ)=>JoCa#qfGb* zy(V!sCvNNwSz1o6)%wn(bko=_r47T!wEI!Y_Y2HpIcAD!m{M3rP(08aoee!apOEpd zwXh!hN0kA!W&!{UR=(Vv$%o69VwQNb5ND99&7F@rO&Fa@br@#eHQ%l_SpTd0Mg$@% zSyXPRrch@6FQ+|4_dzR7o%!qoebf%8E!ol!!&;@g2;-%pGb`&_?_up@hX63f#2^*< zNUJ=Dv!S9ke(pv6?!!@ov2#XS;RsRH_NE~3<_^=1L;k@p_e2SO`mU?)Lpf$zM@6qgP?vSOV5sfN*V^f%ig%4+aX7HBwms6P@DABjG!K1f4;Dk^F9n=CT=qV* zd8=8)nsBqBza>S;0M24-V_x!l)inAlX?jSo;ACJcY7bL5+_oIkaG%{a@9M2VdO!9+ zDK1;5ZgYz>EDKRM@1R(M~VC|%url}lbV!*SnlxS!Jpuxkw>a3*d; z!kU?Rt-ua*URhFlN<_^~L1-^QH|I0Ttex_q71NI1EZgb7vfDHmAs>7Xpnd+CJ&NpUq;yRCVj3vmWhP!he|0r z71K7JN+!^B<9X$7aXUycBvn4sD22sKy`KCMfA&!H#i*G;=~2CtLX(!~$MU|-vyc5I zo@kL*csGmIEZV#~1oI^npEj!UN8Zi&pQsK-HX6Y(Ty=QF!#9%lO?o_}(My`nXEcVz zzTNX^M@q z-_+#TDw0$Vw=w&qme5^F%3U+)s`)!&fnbk}9l+?LhM z;}S%BiG1i=DfuP3^E%gc3R7J9n!i4Q=4q=y!bK-(CW9O;Uux(Y)J_B;hn-z|%z*-j zPPYqK8DYpBp`8n@>ny%|d`5)H($6`I%ZB`xd(=`pR?w_s&CmqYb}Wuj)}AXm>VGSlhW4 z^Qki{wAwBsWq5};sp!GmvtN;?@ z#Cugaye9joAvB^3Gbc+pG#AkSmirh_hcgm+L@o1m!-&!mld{D<_m1V*3KV}y6Z3m|ZL1&mai={R z?D$z6bG7naZ0FR2WwoiM92OI|A2j{&ugFT9XA&x6epW$2%Xdm(N{%evfnp?h?Sn9* zh`QYYf~!g>Z3X}IT{=v?Llm_}x|OevymiAS4@|?n_s6YHX2GE8;%b7RQSF;^jDi`q zqeUl_120*#(eWrn@|2XST);0*yN)QhEIX;ObcEu&(~h#^=McO6?T#AQSF+!`A*#jzXo1 z9_foxpc5*UQ`2!M7}W|^SQa)fez@mPd$@95!$~I6^dJ!GZ*olbiQ;a&3`dx+*JfRC zp8ePuvIxen|kh-k?YKS(gTr3CP~!`u9&nan=glA9p&eK zM#5{prRBpb4WZ1lse95wqh1SW*`1VBRPzk|f!Ei!IO%ZmQ3?-1&^A|A#9`BO!Dk7| z^Q)->NK)`B<{J_o^o0Xg28qY4nYro{65a88qw{%q)vU<`0j)^1eUsO5Y^YHB z*gHjXwvKNTikV`(SRh31zw$NW8O-yh9O;58wY+mryPtQ2!3T})2Ns)lqqY3=H_oSf zoiV}8KvEfZDBOLDu<|~|J`_R`r4v=%ucXv{cO&jmS{7*IJFJH0`W=%RV^kk(MD>o? z7HuueYS~V`;K(|b0lkP~ebzvYG~Hrl?QOI}3UtJJEAnaS=3qNY|3CuE-<~9OvEz1c zLz?HpYEw!y-H&QZpGn$Z3CVbuuu)h3A!%$o`zr2rkp|-aE**c#17j(%NomIBy%efZ zk$q`jFTu7$*u@|#nglQWk7$;8M`JZq3+!W%KgI1III%4Z*_{2L6vL>7%;gdtP@PMsbv~0s|&v1pKP9)0*;!YAdzBCgD|AD=JQ0^6bh^M`fz+ceEHr z(716c>ah7d%+w_ydQ@)bhe(2G{x5NRLQlGJYZzMWki~KJeL+S6efVDCn^)%)d_7vInr{^XuWu;e@ zLzA8m20%*c%)hztz44?ZmfiJnZ@HhB0U^m>NcY%g{7_UIihRxZGo&zq&Lk9@_hJr> zjZFISn>$eMsmcr^P#)ue^0*H$hoEEr3*QBB2fP%a5C!Wwvz!#PZk2XuV%w)&r;Ue* zA#z)Pt5qQyNs3yrFi8tJllJu`Z1`V+W}fpi#XfD>5b~N}b#e;>FW$R^vrpx(80;Tt z07af@V2>{5-8P;xlxnq4p;vPa`!ZsuLLv`XhGF{S6E`Lyz#Z6rvF-xnEx?@wrcRP+ z);8t_{<-0Uzx9);AcA_J5{3$5b2~R7DO>=$K%AYWBu84=lb59+6DQl35tbQfy_}OU zO3LZRc?mzkWp$&FcWYlrJ*Y#9HBUKza7Jxf?KPP+;^uedj2&M}FC-X>?O44@qOTI7xk_AH z7%4W1;>0g2^6*vz;qF%rDy=1)Swt!Fe3cMS)_(XTqpvWK8v*Pj1OLF4<@6n_tm-%~ z2@rs)7;;_72|Kscl3|xHUhRBU7PCM%8qe6nd8e}l%UBf6t2#%(qC5OflPX0bhK|SI zDk~z1iJkk4NJZ*qgyMOT8#a9Z2_)a#8~;hn+x!K-A?}sw2&6s!#-P%ZFF6q}do6pL z)6-#_Uc1Zw`NfSB*;An^-oX@N@HeZ#1!Ds{zH+6E!r1dANmenuZ$VAtB)jt$$nGSf zK=7f6BxcouZ^SssEgzFv+S=Lr#9mb}%C`76cs2p;4^kQ9U&=&?jocH_BDY)#t(iKp33>m=!Q_k|Y*LKj`>;g$ zP`GV(JrW)H=+4(jP#0Wlc0$H-{@8+`*)oy80%~3xDuNo)Zr__jQvq4MH)7Pa89++q zJadpsT*O4&f9{R{WNLJOex>2p41wb}{|2wb*{IDufQwIvvGVu-B&&d0ixr2ZkIr|7 z4CXedS-IpER_AH(w(i%`itkm=EL>2p{p%)C|B5N^^oBmvJc56K@d_9#{;_4>w z#A^8YOfZ)KIwk6GAU0ua^itKme{osSGCslVE%EgC*kQ{1l--rvxNkbXV>;pBrBULO zA1*fE34cO`+`nL^to_rLyJ4E zFqSQRzsUpi<|q(>--hwi$1E26sf7U!c3!*4Foa#o?T%-GQ5}O299LE|Xy2Q8k=!CA z*XRg0z%Agr^ZrkJYuXA@P?c->>2%d~B|~n~G7#CkF?B}CN1s9&v7z_&W9H=h@`b9#N-FSm^$?SE8UqSX} zSIg^YAW9cA#e8NccSjrJ7I@{F!IgtWW~nzhs0s<2oLX^fzcHqW!u%~n+bFv% z+E`T_Jz(z%RchqXd7*FFa}W~l(?csI$=Ug&f3!RHeQJD|{%!>n*c9raE(K^$QI&iSt8|%GoUXmz-i_NP*;Nxhw5}4Xul9SAgz`B=(YHq@g|tv?MnSn) zGSTymo(p?!6XSrJPTNaj*By)d>d*-=>{lug2Mg z9TFXTl{2i?S&-|Cx`J!2Q|80w)AOw9(roiD2X>-U&}D&ZGA@Y08kw5TC(2@qf{~g% zhBcI;%x^n}xI+z}uPR|T%QuA=Y}D&y>1OT14GV3icUsr}vfOYuP*04c&zGTbTOuzG6!aE0gV)H@4Q=!k#Sb7}3_YV(w&gs6CJQ{1zTiayyOhzeJh8@TG(2)pD9 zW#ur38=YI48<+z{x<~et!q<%jwi&a{2zU*7%%uV`?xe=z7ptaN+{b!j_LoA*MboAFhh9}JfnSH`YY z32`L7aUQ%~I(nw7#8K!rfLmHsj}vrIlXJQh*P!aAM*&@>ZcfVG>GgD5pR)>7hSFo_ zXe{FF?t5fl%luy1uCEQ0sK+QM>xTreeGpnwaHKPQv$$pb=z7fFXh@k-_Tjnf-F^lx zAxz2j0O-Ddr)%Y>J7fZxhzW82l56jyP^ch%@Sg_aIjtMSv#G*%mer zgFYBn%1$iXj<`Ev9xp7%k(gz_Hg39&FgpDMcV;@y(1(3}I(GsG?GN=Jl*^}@HKu@~ z_SmnODPG@Sm+y^UrIBp^W|d69ktSE6~XoSbfg2Nn_@dPQBo` zSp{otQuL%h?8E6QAwlFv|LAk*dq0I7@`~CY6CoRqz2r#{LEy$#&ndKXg^f-m^n-+N zd8t;dy!^&r;3hS+0vzIEDrX{taEm+rAE&UV8 zxiX!MXbFax)9y1HG;u|dAx-_Os#ErlP(s1ST&qzSo*RM9?(#_*PhCs%bl8cbq81i% zAJ*JvmNgD2DD?W%{U$g#DPl%@jOO=V#QgwSI_Z1EYLz!4Lllo{Q?Gw)E+^KG3o>2} zB#1j*`najA7=mHR%bHG1yIiEIrzblgt}?O_*7%3PJ}*gmMc1VKeIa5cM=9zGe&$;L zN7K#n35|lwPA1HkwI!*$OohG8AA3F`cY3Ox6J42?mD-sOXl)*+nS<40XnP)8^W*%; z>+&HXl^s`6$^?xY-)97zKZ~CKV~56QFN6B<;IhVK_tr-X`uLAK=ktXeZdcpN>||qH zBWFF?<{F@;h$wIIfzp*LKK6zw#T`k-0yfWTmxDacv$22@;)9*Ojy^7A?20oOUyap0 zpZTRnx3{AMy`jo>v9KcUyK!1)fU-=+c9X(~Q!+9( zi`IuHK_tWL{>66j(Aisiy@R)#qO)6jUc<7V*w*xYoN3`m zGFguso7#lbSu?J9DnCRZ4z%o5EQfDwRTcdeT^5kr2!A1H0Ou@rs~bP_pu_aV6t8ad zK@wkGg%@MSzChg9n0hx+h^1qbK=g?J2uuA3osjNo`Gf9}2@MH9hsIMSRODf9QArl0 z*vR=Nj9~Dl`M@7QDzB4dYhb|qs4OOPs64Mkov-98X)xa@t71=T0Z^Bpq3zynYLRi- z0l2$AzW$<4kPLif>{4f98*YO|-ZqgC9rFQuH$WZUS@?8DD=p&_NQWpLaqTh_OKqOC z-ukPi!a_q4rJEgsnx(uZRkNz}y_2nBTenZH!1P;Zx(cj4U2G$68%O)uQhA;$8h)xkgR#M})9CxMGhS#J_+DqDdIAQer}^+< zvftOUS+%gh-OKG9SU^OX1BaPIny#4qbk#N%j(o_IWFLUH=VgmnE;Dn++rIt;A#ty+ zq?HXD&^Jk=B-hbgeIo~S+()D5a;2>YPAiz^*kaA(4EQvHxT{5m2I?3YUtV(T;VlIlk>fCO#pJ=bUcm=e~Hu`X{tSMV4 zRI0#>OL)D=x>H~*!nZy?DkVE}U-XCpy*IZkLghXR_nY<|3;bb1-J!;hbd}E>yM z!}%@n+ME{C7&N{`HPK;ITox*why9FQU=1pcO1qtSI742KD)_YjcxqG;X%(T^+f!`p zYIrq@b5(eSa>Kc9)x9@FI{h6rT4F7?E&BN4_-_ErwwaP*t}Y#`jx~JZa6dnMkoyVY z^Lk)tZ^lUI^1gVT0*s8XTYhKgm>@IQ=QTF_ddVOAvfZ=mNJKS`{!^AxypOi_m1lih zZ*IvIJ&+4CQ;$;7$;cX84Z}*3`HI)0o!(msM25=YCoiji%+Q|uE=W| zN++Sp@nGwL?RxR>Rm-JxwJY1U#y-#Ndy*?EPCae?uosPO#jU2(8rEL&hdmI?Tv%SS zS(_U>eOr~IG5zWtrLgGI#-kIJ6mMwNR~$9ON;$cgn)hZZV?t#zsJ1)S-R+?GL&b$d z|LJ$>^WUiQ96CJd?)Dn+=jkQ;7ocd8ZD~H;5~b&UP-)iHdT-OK&3S*>cs<>X^~hse zXiup*aHO7kJdE4Tr!1XtblgUBu(JSO;A%Et4`Apqm=|A&&AW?5D0Q~mK!cNe@q$K5 zDm$Is-QVlbjkeDs){t;H*iJGsAqEjm@$~oDOdyW}dooUT41nKCK+S%%vD5Rv5B^sv z@SPHda~#MQ#R0L%ErKzD-BpTD71!~7?q&T4qYxXSVAwE!hoYcEpzZ{M)H z_Hh61y@>{%VPRdl6o*YYali#8STKRL|Axl7g3dms6=ROdfD|5MwpWV$g4Z+nw0 zzY^VWi$)6Y-WLCpBKc#H&5M>uZw5FbmzQr9@62&{u`eCMD~e|n$r<>#7vX%1)Fkqk6<6WUwnRj?26t?2Y< zy0Y*_w}2|X?D%QPqoLEHOL9@JL+)tAI_jqrjWvAYmE(1F4MhD)CPLgu1hh~zDk>56^9_nI!HY&KRiQ--4?jjECg@09 zlEXizEb5?LhdBuv;|P=%s%+UHCIrxFxfTQJZN8I&_1M1)*4>8xaO_i@@GVx{(UvYQ zxqieWeTQT4p`$C}q>^2%RbryNtJXaO1xnV{2~$r;wltP&_sFi?KpxrS#0!pGy*l0z z;r4GhzNDT|D4XVjVC!^l3`ksJ8Ar4P+nd2zc8VXsLpvRCbsXx|AL=-W4ZT-i0-pAf zvb!6(R7w3#G&Tdxv*p^RYG*qaWKFd9Z)vGbSXJwRX00pX_IO97IzY^agf{gVmKw;!{q6AQTTQOMouW1QJ_B8ct9IRFLM0Axf*Pm65uB&O$jEue8~h zzOpATxD}P|$5qz6WN?fff^vayg`avjqmilF_VpXXlXCU^- z%XE>Uwg{4aG7)~g#*$dBZLm7S9N|o)JbJHsJ?@OwtrJ@ z^h&|gLpA&^VU68oHc^?YQb)c{uzp=bEsR{=@ma~lPR*TlCimQ(`Px3|us4S4>5U_> z18GFpoOk;s3Z2lCqCBSg@da|yDQ$tN@MgUNlG6W@Ei8E#7x33Dg50_n18X!qik;6_ z@OB)D$H{zrL>umDfF#ybmR0yT?yZeUf4bOGh|Y?gq>w_ZFS<;cS(D_*rhbKg8umy( z;HV(mqV&koo;aFt|H!Xza#vNu1jA6iI^0z|I;jW*(L<9+96=9s%xf2_XkW9!wS(DQ z<3^g1PaIx4oB*33a5c&u*)C7xA<+PnId4u$R_uA(3PAwN0CQxqR@xXJV+xH=2vQ14 z9do;MwSclCf|PBlzlL6v;npfu{ZT-kOT|Vu)a!l3bGO9qHMe^>8DBZB5kndJk@C+}K)XZOx&G!LdSjZ#7f zHUE%{dyUkhkDSW)YCwk|;$DWliPgDCpxD{R;QB@dm;E)yXkC;Dm)m7GaVmNqoql;# z!8GlMxq=et$3QBGo65bec9U;48S}ARNFmIFSFWvJu4I;g7T>JgI>mju;j&LB@82ECg0ois zPIz1?dOJ8Z>A5xs9c_il-{fj2;KcsR1?uPt!`pu{o?jh_3bT3jS)hU$Jm^vycmO0N zIQTC%>DL#4d+D%y{l*RJJt58iGB0hY!DDY$KHCSqy}dL*0F4uy^%W++YVbx6R__HNo8MhMZnE0j1M4!m8>}qTtZ>5qU(u@)|E5$xMJ2aP zMnJJqnY%-ZJPP*X;W3l6{e}6DY1N69#6=1F7l>h{l>iw6i1{xXS&3njbY=lwV$oxD zgW+Nn^&?hi;?GF@`p-N|+6rjk(f;?Ui)Q@|wpP&(?7OsdT)*E`mvKhU7AFBJ{I=8?y%Xvov%}K zBIS|+nN;02cS4$?)N&;^IsHt^Sg7RI=SRiK6dx!vC=IMSvWS<<8VJlmgMhL>2 zaLsdwQv+4GI$G-Sko%pZ*I%VP=Q`39M!wVYoDMh94_@%+`85h+{J7}X+~2y`4|==H zbD4R%5#L)Q(9hbSJ^WLU9_ejt5_R}REF*89?j*jGDr7Yx%ldqRW)HY>5Vz6 zMwh%PV|~$FZ6xB}IG};Oiry!uvBBv_WmEm{ zeaJB+vtTrrTjFY=>E-}J>GR#H0lvHE6g^BA4L&+cmwE)2MZcq#H$-y~5w$0HCDmD- zmMug{!S8fn&xO1lOiuyNm$=#Z+-@4s!@pPkgYHOgYL9RGaG4`r8oF=tE12*HLjD1F zI$yEZn8${Q;O+>P$V)1Yi8gPm@GalDSw@o@hffMD?{!1Ng^+H)2?{+@*ECoCF;OeVhIs6;eiSB%Dw^}XT+=@`;h;+WQg0U`x zq3Q~&XRaPdV;m=cyhS2{mktsiWj2|!#(COL6$B!OQ z`hEN;lBYywV0G!rb8E48D{S*(*Q7{GNF7^V7c@EB`WMy@0?KoKUdA= zbJ5K)mtyP$6pc>QMUb+Hq*?DYjiUOdYsuZ!qkhMXqgy9(u?6mEg9Cz-|8& zzDo@WQB(b!wpl!dn*OW}Nt?EhYQ@k6IJY4=|&nq^PWh@Rb9_2%EwG?CZyUpdFq zQA?tMiFW5|)QlOXzbww*Ca7@`d&1Ecx@G@xv^Y^FbK1BLaFtdYG2uN*54q%fnxFa1 zQ^97Q;V2io`z&Uur_I!TS6*s}DGz08Uk`ninNZcmx{;yRU#6SQo#4S}nb-vxTS}8E zzv%p5{OqwY?~&s{zDjuE84OSGvdz=JR8fkDgoS6}F_x>-kNWe26lyQ?a#|xGE#8Tb zL@XCs{l9exn!}`TD@=}*H!q~ukwjw7))t0mHU%a7UikfgfoOqSXKOi}?=YDMBZO{k zd3gOe;25UoIb1zI=BD``5gZeediWO2;WhKX+bVTvr%Th|V$im?H%JVLt>%3byJKmI zc?7Jhuh(~v_)3l!C?Jx*uPoU0v}PDXnAKcGRm?~{^VVoSIsI~0@~KsuG6+_f!}ZGW zbOKMlm$=MCX>gL2*alS>aV_cU2g(XPro60HfUAW!irMA(k{u&GF`NWWGH=*lIpmmRzNucbXi=+CvpUsz~nnuMb&mJlL zKBI+IY3**Wl!*8*5Z1>my)8rxCw!Xss^lfo*g`*lSz7a!)x1UdcL%Nk=H^vf|fX`FA)J**)q0r7{_nxmH??d*QB8?Z~v8~KcZ!m{0U zzCP3=ou0#`6vbTRVXV|8#=rME*l5?zC;iicNxg65iPV?NgBGNg*Y^te>|!YGK!y!v z6WL!SwVhrWq^}j~L|6+7hFQp=^`}Lw-uFFqIIxXSw?8&mI;Tulhqy_1V??^`%N0)U z-0d^$u^>LOqUb3@`3lt=?w1KLf|qT~Eu@Dkj|d^HHj}>0)4DTldW4Qd8APA0n^oA*ND4mfrwRq1&(^)6|z$ zm}ak+3Qo2KUZwADe$@{EiQbg-+K>+ZV5r{zHK{+Y;NY=dTl8VL4fc7`fZ8CaA*qJe zrNUwflpz&{QCAG;jcUQrD&;o|XH*zR_J={&L?4eqNfH=uo;;r)&yOgf3+#4pEji^W zyv39DY3fc;;rH5cOhBdU+mfnFG&643(`n`I`&dQfG9l!PLt0AM0T`dU{^F??o>2cW%51N>O-IZCqKwgx$;2suA64 z(l7YB8u6G%H69*DsvZ(7%d_fVz2s)9TzU4C`7O7bOmB&KgIfoL+?qOZnlZeHg_nCr zM$lt@mfbMOH}gTxy9*UFTBE)Bjg1`XKKsnIudK)2!0oc=8z{p51;+5p6BYTysQ4vi z>0w*8-*eW|x2YsfEWNV@KG>=Rr|9cGW%2r%?*AVt%XDPHK_aZ}(B6hq%LciVVBK?m zy6SYT3KV~8&~X^iQLv8-w;naR4l^S;N+@$5S+1PMI~}M`TSfGvr6sXu?Zth2{|m85 zI*mNu$oEPAqN04TXQiQ3ce_UezJ7dB;G*l@2n@oUeQz2of*UX~$eXdcVB5Zw z#5t&#;NjX!ROC2JVHR@sM|w&@H=xrfmimT|48F)11PMd$bFXOO_!r879`g)cIG18i5D+koV*JL6aYu!~a*2NIt z=H=6T;{uy?g>pxG>kiMrXkL*J(EE=(Cs5%Dc*SLS;Sut@s`;)+xbfR_{MRSHa{`eP}HT0#g^B+$g?hdNi?nghvr z?c3$!t1i-3_;Sh~{MEQE)6lU7w75`oy*F ztIu~7)d+G+APc9C)3^yMg3&1lUuBbFU$JJSyUmghJ@6s+W+@t)_$)HJlB3Vt?DJKd z8ZN){M2=SouhH;lR}7#P8-*<*=)SG$CBdchMUb1D&enaXaJ2pJ>G}0yrnUU)!NyUe zD6B{BQTG?gr6q}ru-LZ(qKHUmfZ~eQew07zq}^Mw-Ec?jqyY13)Wlb2#yhJH>E0q5 z51;U(=GIvEV(p7&n@_!Ub8dLlPpS}OKd^I->*rx$Md7wI`pbf&L+U~9_QM%HUsqi` zw2@bkS}r+`9J*@dkb<7Wp;Rt!=eZBp6xNn>?H%3Fr8Wm|m5F ztj`eXctOnYD9NicA88MEiVqr6on4 z$`$KrhUl!wKB91@>&0E5(XM@1L4uz>C!lNr zr5!5IgAdOY()2+B%T5P0feHBqPTVqf+1040Xz2so@M>V$f1fPjL>9Avls?yl(MK^FC&1bPJ_8`F(mL9gM=q*?hu`i`H;7d9NIJ1v!9dFj!xF0SV2Oj zl>251WoPBSiXWgYTwL|<#6jtR^{gu~X1B{Wg=*DUUm6TKCZ1tbYZRRCIDk7;IapAY zBrd4ZFq;>BTsUYYc|gAZFlwS)_l3*f^^1Z%jf=}{>F?frue@MqgR+<{f`asRLKdEk z-5{81tcTMy|3QP*#;wbfJaShtkHXO5i}w4B>xkJ-x~@(G+mG@fu9-N+zxYCHC__D=v~ga z&HBmFO=4y^S_rB2cj+DbM6k!I)BuYCEwj=94pQ_n_DH4miEw*^#1DBP-PSHnhE=t7{>QG90;;2QQKm^f~ zs6G%R_jr;~BYALOlCkOxF{@995W8qANn}Q3TJu<$|DCkY+$oMv~ zP8kpz@ED@U1;PWdZb$Q~rA5E(qir}}_O48xG-Xr(?KMG&LvFcv{@Z_WzH~K#i5Rm==BWg~S@;&Wa zoY#y&2!cvjt|Erxq7~%YL;2~k-h~Sl9N=W@fDSw0urB?N!;<&+QG?PXA8T@Ubh~|Jsv1to)4Smt*T^ zLn#mws3`39sM@R5p)T+QKv~yHsC8FH0WK5Io9=D)%)g8A_-GC6vg!zA6QkatwjL_P zf>DDFXAy&M;?!=FO!aXbf#-|)e>iwUNdT1D?aK$R_ zP2#EahGWmYQ#L~0FP_0P;gP)}e8S$74}xV*0{z-gA_8-&orBa9lKk1{>~I73ubm&N zd4~BX90i6o7p2_RU+(JGx!p8|VJx9vCX*g;Q*~ZcuiM3ZeyU4Yx&lPKlZ{dx8KTR4 z=Q6*-^Ep1|_o9!vz%|75+w;3(j)jj8UBM{6vng`LqjOw4IOQ|G6xLpT{rJA+X?fVW z=*q?C^^Y&A4+0b5<_q*p!(o>yEPz?$#T`#j2y)&Lj<2j4+*p4Lfj$JffcLAkW12r7 zK}tE7Jxi+!O2xm0u<-vSgbjNVxzd7-E;Ql_I<;I+(6pp`K~Cd+hD6QrC>B=jiJP<>@p0jHdcyEtPI6?|L=9iM z>U_|nP()Qxl-!{8%?zaX&DbEmK&A7 z>gS?S*TaIo-@}=R=^&p5B-$I25moUz$uo(hw>d{_?@&&%3RbhA8r3SmZg@SLeeMvEq$fCW)TW5DbC&mO-o)- zfhHzOZWKkgpU$Z}bepzw{N0d5SjZDQ$0ZP@`rv+M0bC`<+t~&YD$EU4h3$BY} zZ|<~0NL$wi)c#h#3awlxG11~lr;IZyrJ+{#CiOH-ypsl^v`Psqe>hqn_iyuSj~`&G+Kx&Q6}Vy^qNu65e+>89BD8WC z7hEZfK^39m(lfAEbWEg>)IRnFcwD~NvEjF}$8z&}St`ONDj23O-9ylsfBY|Bb2}V{ z?5eC|6ei97#QyTL$6^fu(8HI1S6Xis@;;ERq_@%{Jim0Zf^u$nbs&6&|NW@$do6Nj z#v(O?izvIvcVBhGxeaKNznc;(iRaQNlzx5-QAv|E?_;s4R|<#z`j^}VRh{(;zWxea zXw{Q<`aMiLZ${28gDLoM${dDTSIv$6#fxxZ=Gz$%D)$kFt7iCnK9Q6HVCJndr>jOj zhPPo?ldkw%1 z6nox(0VrOfwC+|L!_7CCO;dq`bq|i!q)2)4W7MC1qi?qYrLG+pwHp!biWQ#@+U0gS zllKP5UAam??$W;Sl)U8sH22nFQMHZQH=uw5f{2JnDM&X+r;37fBaH$gF(56CA_7t( z-65UQ&7gD+-7rYQ07KUh?={@s_w(%c*!$SW`@Q=+zHj|8LCmb0HS0RpdH&AXJo{!7 ztGK98P#Y34fK<3ufAcv|q&l~shCGYV`S2s%kN<&(K69tTfTl(n$?-u<%T(_zz9{wB z`#C1V#J)`28VB!R&xLVZF#C>0DFH=GD9ZRpp_t02#4U*no)xQqS-P@f)dHy=MkAjK z^NXby1qYV8SuM~`=c*lyyZ+_ra`SAijZO*=O?=kCIygVq9lJcOJgRf4YsDf&rkCs8|^eeKB>EN^fRkD_IMKC;p2%A*?WEtmPrZFs+1$o z?FZ&%^EbpnZkvnjtmoiYG4uG{3N-$26}~FFP7@#eb1f<9?p|Vb<3v+W)y^Kn9%U^R z0$)C*^2CN|JVS{S+FgLk?!FH3^SPJY04vVfkvp{4~c*tZp1_phXjhuy4Heu>+eipwm9qfRxho(Ug&^5n9O z@%bgFe-7KtJwqkMdfj@3?#I0LXon{7fK|1-}75s#?^^7=IH?gai&um#@n ze=g|h^Ki|)<-(&SQ8(l11?t?MLD*N`k`Mok%36DP(mhN04FRe({ zZA5;*m5L?}L>M+v3=>y1l?QKWM~s~8sB=}NsWP6D_tQMBF_2t*5l+a2#j8I_h8kCm z6=tiBtOcmD^5yxtmcX?wt=3C2-g}3#@AT)o0cc9zdxt$^fhc-2+U0Vcp^?scjfE6y zG7W8l6Az+n=t{lxd8KAO8`o;!93dhp_3n9|d)*H=0hTXWzc*9E{yS5aH5f`Ah7OcF z{qbcroYNo|<9WtM9$CF_yO%7UbV@ePX_mb3do!AY*Ek{oomvYKwy;cY_VAF8eJeMU zwX~>JBwQHQMzkM8Im(v}A9wmuQD?uLqelHS-0rLP7UTMi3NpsacCVU9Deh#Z7J=P- z{-(0Ms4>|y>hlR4YBu3QL_rA?HKH+%HP?;o*mXqC(PXZdmN?7%*L0mh9a{(4i)m*90{J&U(u{vhz+Cx}HwYcGy#jscoeUC(}&htk)0`hxKSh z@tJT&i8_y!F``zBE)3VV#N?<&b(W7#cVR{CFaeR_;o;a&Vqezdx#6Lq6riFpWVx7_ zn*N@4hV$jL?jzwe(BmE(`Of7IANu!J$j4v+uHZ?t⋘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 z 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 H=;Qwai!Pxa literal 202898 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Ϡ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

>dQU2|(wT<~XspcHthvYi9XYe^#6J z2H|E`KjF_Ynrw>wX33n$>@FX2Rjd@3MBLYDTrthn>OFR`h|T$UWaTi`gq!Wwz`#jY zh}!R?D?cAsYb}3%Hi3B)t)Q@>xM#_(@-+To)N#_EeZpj^V{%3|gZ}};XZgh8&+Lb~d||dyX^rX& zNaZu~YTyvft1MCY;)!N6+t^m9id&^rm1yiHBQMWl`FI%HVb=joIq~8&q)=qMz`oM$ zoV~2DCA1Cn)cxTnVagp0QpGl3SF04C%h?=e-=E2cnU)_;VT}@y=8ub;jxnhqzpl;W z&Tg}Y&%^-=pk_0kR9|Mxm}ZR1EOX}e<=2{~!RM^=IbW9Xomf4sWtE6oT3+;8`O2T# zghIW|mM2Bduf++YbqH3FU&6AB37ou2I(1)DSLb*B-N4Xusi)PrGfU*_{fPJG3k>wA zQ2U;iIQ2c*5t1V#+&R%dUnv_#Ze9HXx|;3xcj~*!Wp`iHM=Sq?$HZE>jNJb7y>&08 zpsjv1$KzmtzpFh|=&kr!Zjqr=9~QqoVos3y?b#3gf2)vm%qrG2lr?2w^%n$vef{(E zb48hQ=Z&rpHuF^w_AM9CR@2miI3+KU4BTnHa(aINcw7pI9RpRk z{Z9(PbC$Hu6DenZgTxbXB~J!}Y6f5wCtRt0sH{X3B3qsx+bTxL=Sy-pFU{aB%c64B zO}f}R$AyRZyn*0SY5X`RYi9LJGK!JTx_F?k*vzWeTF6Kj#r67`;qh%h%}BOY>%J)w z1ZylYD&9L+xEV!cH?Vvz(5B~t{94c^;@>TX?9@));|KFfJ?o5VObxNoEhuU75}$fm z`A)UP6aDsfQ31v>**Dfb`F&6uPS~mVi!>P<+M0js$35+qu*xS-e4lS}v7_!i^V2bJ zP$T$k=!#jnwW!_#<^eFxnSF%|hAV~kqpT8Iv?c_bn`BnvW zW@*Y7YDQ~T0i(zvqJJuK*W-P;v&yn&<^n$V%wWY7^tzuWulHLhJ8`0Ud3jb5o&hqP zWaM`s5IBqUYZUmJM{V6LBtDTP0LYzP!oJruU;MN2AL|seHj{nAkf=b z12I7(AqJMd*0761)n&)@ww#;JdvU|zYV;J=y-Xhd62ZaPhJPspy&JwW&mGK5OKm16 zN~h;*^mr=hpKwP#OphGU+R(&t7e4M*s?~voMmj_B?^aEA=Z(cXcj;JPY2nOO(Xk)x zu>a`gM`>0e--(n`xIbBmi&hxCWz(Q=KD@r$=RYs2AIws)*Y)~lW@v+rt;^d;P(w}@ z|2 z#8r`Bp#)Xn^%lG^S?y=!-LAer>HhIE{^9%b>5lS6Vk4*W@_RESde$KjnaTPb&g?AF zKyz?#oiotKmVZ+r3Z&r{;ND%oe`!SwHN*M3o~%3qE9Kkwwb6IKpF7qh>;%tX6SXdTVMUHh#4ye%o=zB6WI$ zm}Hu{wVEslc1@Ue1d=H~xHKYw*tkOdgu`*1~P z2*S#V_o`sWb$a`&_Tb(*)1w^xVwnA}})GybZA##dZo5c9Vc{+r(V%OkL3* ztfw#bk>0XJFHWzZQ9)R%kbiMHOo;v>O$}%xS~2iI*9l6*miPWVx2;0)#1~zfQ$--w zL$u=9`=~Cz9L+9C%>U-q+!ZifM8@)xGRnO*g-Lva!v6R}m`nh=?ltH?ygVX>UBP78 zUp;I7Z%C5;&Eo=_+uJ{nqxLIY_oJSH-QV9H*~H&iYo(}v_wpY2Zo7-m_HV`;y#RxN zjS;t|Dr>F!=ODWr^d#0TO9hx4akj@h+-Ux$Y=FksK3D3J)kWjmUNKiK|BBth_&l84 z3QC%#$m-War>{4_FU6vhDvo=SVybv6U$kR6oL_qargju-)a;>dj$^%IH5{B?WXlXd z2r1JyF25Vb`fh74&uyMq13&9*4bnA#^O=pS(e_#uWuPZoZ*<3l&SB6|*Acl!FW)yk||HO|a$^p32^AjF}lJ z^E9uz@;BI85{GNlDq>spITL7E$m6Zfr!pSV7>;++X-?NF2IoP;){HhbG90{5Hw@mwIkR{QOeod%W)MD4*2W`R$n{>@uXdZiMTw}FfBaR6 zbhLnh8OPYO9VgV=^77$nV4=L+dc>5=g@`tGrjlWZI6Z*nZAlwo5TX6`^yilgKhy63 z71(FrmalOHJz>6-v6yig6}G*u*iRnj9~WmKVr^0*-bTXNaZ}7ud0uqHcGzd?eeEYb zO_u!M1lkDs2;q`~CJkzD-WhmX)Q|LR3&~ajFy$G$8`i{0i=ILAE&vlz8*YkPIsb%dTctBTJF0Ak9*PgXF6pk%){Dn)X?Yg+3;J@ zzxi;yb4?V5hn7u6#$T!B|G=SR328b?Sfg=5RmCKL4xp)L0;jblWNS}XvDb>DB&NME z+>m6F@ux-8I1O3&FT$h@OT~ZRZ6qn^zL2**_}9xNi0AWh0m#RahC_-xK#l&Q1-R2ia%ztdq4-%S6D2jSp>&JJhlG zu)*!{iw4?95Y-qan2h=h|C%6CTtkj~R{#$i@V?P;KE1D)LGZ;02L!G@eJAQ>zV}p^ z&y4Lw-Q!}GcRzl^598unB%xybKqI}L-Rants(S5sth+(H9dUTMp*bU3h7M&P#1uKs ztw-p)>MKe>4z==D$(Nq!C{k($Q6&}Ev#J+*Bl}s_25q8(A+Y!MqM0mD1Qy!oIaJyH z1h^(a90xz~i9#5EHa&P=&pdw3=$#H6OJ@tCFe(mE{> z7ZSFlK{GD4dD7#7D&xTW&GJ*&_`R!JuKRI1x%e7;QY;Bk3T#T#g`w;gkzaG-#NYOMc?8#pjoTkTl5%ip)>tqo&$wa~ z*?0I4gzYnoF}ZY*Kt`F(t5O)SWJS05JVexU+76#$*L~g_zB&ZlerUV62*a89JZ&mT8w=2} zHeHt>52`0VXMC(je{nFtsHkJII9fexjUhtnMUDG}n^VbQVz@*FYNNj^p0$)gLz}Kh z1-dcr9uKqdF%tGRW&#H;3yLaqLOF`vU_IX?qgBR4n=7RZ5QSAH_qtMwJ8Qj-fJzB* z-~DpdkrsreZ&puFBH+`>xk*;_rK{~Wq*q>5wgp6aVlpl0b-dp3$U)=8JUQmv2B^5f zb#L9$_Z++8HM%^%Q|ZS)b^e%cR@r%dPQ8`eeT{Fytm?jMRMtY#Z{kYw73KD4aSX#P zZrdqF%TpvL%W+Chh zh{!SVhNiRjHA)(b+UTdU69nP&fntd{`{#*|jVt_tnz)LL{dbuh6X6#x8z^RdcjGl5 zO|N-!5lwjRSU`+x1FsG{@30tSuxu@0=FCLS%V_NZGaIC_xYLT!bZn6)2Ih#5DPxvY zwH%-n>nHy{Q1Iu@H;N?CaeHe027zwQS?t~s)+;u;+jtip({1krQx~c?+s7aYq`>xc z8(wlzXq+W-*9Xaa7fZ^L+LHpPo`w=X`1rRc6u}H@IfgA3Yej`?-z&D@v&Mi9(zCCM z&U)(BqPUuZ71)o+J}3zqRC!)0@gD7^mTn91X8y)I+N}|8t@uOv$;WqHp{yZI!29s#P9NQyi8!+%DMLpo0;c#hl zpST0HZ4^>z_>|0z=^i4%OwtgH)zfUUAu3eJ3`MF&fx7-Y{;gRd_&;QCRqa3I$+F~Z zUnCAI?=(2&8_~*R*<&^Ay7~ewSxUpR2r21X^(^oV+k?xg0T$ISK(xS2_sFYz;hwVEa5Mlr*z%3r0}SBh3q!Q85k4c&AhOInX)ObCUTq4@RQSP zODNcHW%+P$%P~=!I#LPdDOwbvJ6y7_Z%@5HRREaM7VR>uN3?^>Vm;KWKkNO!Uw{h1d+>VoOS2@P!S8FwS~Se>$vfeLjK zR>}C(bIiK>dufiC2-@}f)+YDa<`CcFdUR-}bePF*po0fj$HXC15oO0T>B4dPyf&Z1 z^8E#XLzx1=5tu#FIr{?quyhvJIjhPC#bsS+BIQy-ud>x^sHOSo2dh18X>K&vqXKew z9Qo(mR{qs}0YB*1dv1)vuLd)O2yLrf-y7`NJg9MRYp-oLumPiEfD-)`oo54EgsgPZ z{l%GkFHe5rd?!u!;^)e81r}IxyZ0S$_xoZ9=T6fwqM;T;G5-Y%F{Q97m>;l z8!8FHzmq7C&_KY9m6%5ET1?1hscnbTibb{I=mIJ+kIA7~BzrHFE>v8y3Q5QD=jvL7 zc!kdFZ(k&?B&1_k-zNnzANMnl;MjoL5C}?3YAB)Nt_M4JgeXp0)39jXYE4=#nWJMKZxdoJ5{X{^hq(eY&cJubp zlN*w2M%d~MBH<(FiC!@EmgFph{xhP)z*Xppk<S$jc+!h+a{E`&z?AsNnep z+9vvDJX4=fnBmr0PJ^`oqKdg}S5>`{9!nef)XqKfBuqE$^o1=`pSw@XMncC2QYII+ zCPpj&dFP%_>&@Km`v$hQ(c>Cc^H8r6cTU(Wh1*#wLCz9)-+v6wKMGKe^Srx9>S}(Q z8+vZI<>Typmlp4CXnwy$LGm2M@@O-|l_=Xy!|hN3vHEhR`D~C zd?+46Onj`iPrMZl=t4inO11hKKrnxE@xhUpz&lL3&R&t{TIWEGQV5T7XWw}%gFJug zC1^dC>lg@F+l^Rh>{v2RN-SXWZ-?Opm=goMh_5SnK$L$EF)4)iCycWyrW)HUOUoTQ z%XaE(Lob@4fW#+frXiG8JQS+~_~)1>8mbn&Q^$r0qOa`RWynOzfJ4P8XFM7(Uepzc zqJUchN)dJIR+VqoUOrAK2ox}unvgJz8BJljE*L3vbo*RVlI8oimHN{ysOecvPcq_{ zXyVI*A^jTFU+-NZkdx}Pl#v#ehO13f2p4Q0$mY1HhP zdF>1(s_eNC7}5o0Tz=D8e9y*8LWD0|emSs!AG2@KO@qmkB&Mfa^WBuON+N;O3c(|} zJ+f6|DdNBcc_>OwrP?IeE+Eo$xYW6i76-~*dS_T&bq^|N>lk>>Z8ify#*MP*VT3K$ zULZG@q|cwpExi{24gi+1%Cje-Ej;;gVap{zF_Enw5T&Mh-=G6j>>&Mu-`!s6`86dKj=k5!X@u35!wg^J4ya6Hw)HNL z+{6Ra@P-cGR#^Q0#m0M7ILivV@Ij6bCy~P~BxoZdkq%|5)ZQmcfs|a$#U>73JX!`Q zt+ZABoql`ZXT@rEev<59$4X&-3=`>5Aa}L~^<&FC1|~8%@Q4e`KZ_DQ9}7MMTIjuJ ze;i{x1be*zmSzNY57iyUC#aPQvH|)v=O5h5Pu2DpSGAzoi<0!|d5<^~j3vpB>W`uJ z9L50n*kg8Dy-KUry?%-7;w&i{0Y2Q8?NGVYk57tYgs1MIuIyS0vLIfwfv1*ON%xk? zn&L)znhAD-Z+T3(`o*P zDJf;zuPC>oR|?2(aH7w+@QqJh{cXnh{scw6Ibzxroq0Em+T;PL<30}5J$0Ol)$)EO zy2ak`7~7t_hw+2;E`5*PBozT+-2u@y_Pbhk#F7+syz@5^EaThe$B;NHLzVo>EJi4 zUXr)42Ft&S4fppjFL;UJM5)mx$BkC$m^ZlmI&A0}oF!3|5^o?B?~Q1sN+HM$%DmM5 z7pO4`Tgfvh4w=$gr3~9Tjk~X3xP}h3F+640j}J^JnBA`7(opN6^%J!`M?4H#vJGnL zmFnkSk*wYsJ$=rpVT?ud@kT06_N&hb-v>G&G|Y6+46FWbBOjgWyVYH8CYY3YV^8B0 zc^C>Vi)#GjznY|@m~T6N+%Ynkz_MVXP0fbh^+^U0%guxmUbf_pK59mJt_s~){z_B;eb>9*&~F&X zJszSY`F(2w3TdP#CnYsO$m?wl-$Rt^!?58fp2h6V8~o7YqbNS5d2zsFGu~q zlI&L7D#oPT&WV|k+5BFh&ybE|4gDpTxv@f;*aW-zM5zqR(e^F0R#;EDNn}1>qy8f9 zH{Q4li4$-R`W+STDzuuQ?Ly2;b?Of7N?)t5bEn1AbedIn?wM!NW8tSrY6OmZGI^| zqRri9+V4Oy;#32aJCFFY5K{M zy!@Y@{cjHkZ};_$6|HGf($XS)pKe!Xz&h46&o6gtheQ#lAqAQ~k9Z~cX5uG`_zFci zeNTr*UzaB7DbWE3VJ)ZG08fq&1=vI!1KFPBc`G1HDBDi_^PNrRe3ZhR~;XZqZH zC3T3g#Z4R@M&dh6fnVjJ?=rs zNRtoS|eB|^Mz5lWxJ6C`TBy#GjQu%mG(X>C9&D9(G|2Md0uuockR zJ{<8nK(5ed@|JA=uzxIeM3XxT7<0|**YKVP(thX=_iSr z1WfuDUYffNIKH&l-;?qq5a~7PpU)T=O$S>Bu;zuZ*WU0#@JB4Sy#1x<~5w=@*HVjv)yQp4<4LI-vFy^T}#6x(n3We-uQ96 zw%u8*IF?R#B}qRT1uKoO!p)0ZxViq#8^Sb)+ykFu4{+xw7G> zq1catouMU}wF*mbaTe`b!@`AZv1tF1cW&13q0Hgae$Dw}L7kX_su+Wfs?LthKcv^iY1LN9&M-K-?+ zQ8btweNjk$O^mX^(e(Gmz0+WC43pD+7WnpGL+jsPPwT45C8F;?XB8<+6iga|9X>Q` z%#dCmk1Ej=A|fKrudjnEE17I;Y$7ww2&F~F7&vy2;(4+K@4L$1BU7Dpo0}ePIWtks zo1AoaMT1wKt#B2@deLdcr#N`JkjU7|%m))6Tt(Fm<=Aa^Lqahtz78&i+)vx67ptVA z)*)BGGC#&37RbWuGh+JFu<~#~rKcAW z$(3*Eo5-NjcPx;JPBley*T<0AoEh}|{Om2XpwV?Ro%KZ^D~<}ELwKk9L#1B0PDB=! z)5a`42GPtg`P(xp0e4yFP6nn@vl5{yn!AnZiZx7pl_M1+=tJJlRGm_r5sxnVlPr&I z5EcF`*W%vI&mBzxW0oHq&`fhfkG^0lf{ub&^v9dat4cC9Qmg|&*kjC!qDZ1?kxhRD zo7%>z^t1|(8%1K14`Tmq5ox7_GkXc8v8A0w5yBG7QTN^XRPqvFY7rfoOWtVwH}}u! zi++TdOvi%HxS0y`(fdD_0Ix3O+)IF^2pa2tdY}7Kg?X=1WNlC0b%{kH`WP9Jnb4Du z=c>Jd#(*8yba&MLwqmAs4{rE)n5&5@+jobmY~1oS`ElsfvCdZ#ytiVf!ja$%Q5>M4 zI$NrB#ukB6l0QD-8-sO?!!M)vv5B@(8eU$Ta65HV^XFS0vbtVa6%ei)4l*m0m1s^X z4aP_DP8QSknEVQMoweng{DB4%afNCQIt^!;1)A;W3Ix14VcKmc8+zi22TS=3+L7kh zaw{NE{kgwLZHP7{WkEf_1y!5tk*mun|8q91%Q4Hl)mXDz^Nbi3 zrDh;s4dUU$TtL>T?smOQ|3>Q@qj0*d412}b2^d5wSO0YDosFsG8bj|%1*|t99MzFf z+}t84{~4(+))Q%xF&CNk@D4(?%@0e*&9?jDQqbbytA@j=5izRs?1ssXq05;XwgRte z52oWN7jcv2a)VQx5x5>8=Ka}Uzwe}=f~pXmWf-_^NSS^5h#a_VcQkBoV$&HJzQUcR z^1)R{2x+bwwDe8S*7TLgn5ZhG!n_C@pU>7OnId<2A$ZW-_jKrxHRd!xEkEAxtHe6d_i zhD))d+y;X%5cvj&v%`y60SiZQxsPnV6QI0SFXEx*trvNXe&@|K7zhP{JcDsS?5HWB zxYiJ>?6V~y3PpDjOV(SkC(Fj&qEF)3ki^K z6N2Y{($Qz-ix+wZ(e}PN!#CGkIyOvw4fT~-9U-hUlgi6fz0!-WapgTNYbX#W&Bnrz zRKMtb*9_+4m62Y@xk76|3R|!KVXqv`x&BErH)=&jkL`opoau}NBGY|A1J;Jm1U#T? zYgv6atQ)WBt^w?$g1`+<=!BDBFNHSaS>OAOf9Gt*cv-DFN74-binqCaXq@ zQ*=JJEYSyOh;x^L?sA=mo}1y0P}6oY#$gmfaC(@*@r-%7-LJ$2PIC5CST=dERayUS z!5K)kMFVw%7+`+mV^Lq(Sz$6+lpb+Ab5~4nlYTZRR9I{o|iTpyBcyTRPq zz8HLbC|`{1S9k6tk#bf3pxoK;dD?xfW9a@ey;RFJG_a~)2&S`%gBgoRdE+-HyO_yR zZRAW)b=p`kb+oR`tH}d+ zXY9qLCIoEmD0@AF4nxDk-Mytv10#bB7{^}rg+mV2t)Xm^Zkq$y=mT|w{pEB;4o*j` z$BPM}@Hg3_>oqqQVz@wXSjz421yWbObFh|<+SnPL$K1{6?l;Gm=A9336)PKuxhv*3 z>6r0AcQ&+}Ct1nISETtGVP4saNg2K!^8EWa#Q!(OQ$cNAOMUMwCF zZrJHSoBqBtc9dl;c@m6sLn;Zk6;I2Yz66y&b*z<_wLKqR*v@}9gj|z9ndq2|+zOvF z!6*DO93~s%-Q0p;#gold+~8#sG+6wb;&`nExml$mPd`lKJYPZWh685aK)wSMlTme~ z32nF55+jpVJOoTB;|*-VT48CF@l|yj5`Rq2ns=8CLVO_oIgHDV*A9>RrW34(O}D-q zBXbVBPdBD?tg?ocHKAS`f;grT`^!4YeEMeEX#vYWqW)ZEag#PyGU{r0q;oLq>3g~c zv}vVPm3!|Svp2W_7lO#ISu2W@%dfOEA_;g4;aY73_;kscMl8U_Bv5f{nsckMZJKA_<(!6!Xu2{*U;*Ous|qIFFL^+xInORyj(+Sx%b z$AiuR8y)jr!w$EfD75HeL4?N{dBfx>dAH3H-OG7Xy-{o6Yg(HD$XflH?H4o#8L@Rj3(mM52A=_|ii1 zN&UJl(2^5qD=_XN0x&=!C9b8-L&`JU)6Hz93ampl%sIy$X|dB`VZRS7eu;uL@RFDI zk=BaX<&XE>degvY-cUC}9@;)dPsd}EV_j|-gdbPyWEFSlhph$5S(E@r3TQeFn`v-W zx4;`nyXjsgH4@}L-sv%;5o=IKY?j_6UwD_5exrCJ&97cTKW|=Qkt3Acx8YQtjdO2C zVwKo@YL7DDsUu=sXIFun7?R+)YroydByL0knVK9;PIF zVg$F5{=|tiRDF4k1~2wwUIeAL1fj3ZHBLm;<(CRn;jRi~?PV=_>VY!lwA}W;-=aJIbt6{AP68@+6Wk;iY~Fce&u<77TK{9o`pg-| zi1Vv&X5+`59uB^&@KKrFuMf8>n|^|bXE%T-=}T@S`k68Zc%8ZO{#fG_MJ%rG^(rR? zt4tfC8ZSxKr6+fnxL=v;6TPrp4b&?mQf^jl@5hiD}h7 zwWaT0%?uN}A345%bnRKwyjyGKFJF-VLT~+N(LxAzwZpIt6s2`FGBR>F_)XDrGpl1I zH8>z!DH%&30)|S=pk2LBu@RFvb#;vxh(`8}UmHS}NgkItgIaH|MCrCT?xxc?+`1c* zRJxrz8R%!5XPZUgNZ`!f?J777{qP5fCDh`~?D;u(eimNtbNuQG`T@(-Mmy@h#{3lq|eWiRk2Cr z0s>{`^{~3sqGa6CIPrXBro+SBWHhZK%{RrwBoQw$cM>5CH1A`KF@xsf{R`+vex#Y%$0PzPigJ??1fEa(U3F8-qSXB)aa`OU*mk6=o?D@ z46gG$V_9dveUu4jKY z%?)RAK%K!00-HNWcLrM@*>n|dNHpOUv$r1N4>b0VVWGw+h39sdk)1E^H}dtDG6v&Q zdHi`cw|02l94;)r?J^+>6URZ`zqUH)o^j!>UEfUPI41$XrN# z)21A#_mHgZCHcj`uKBv)5KI+pG@ruwCAF16slP_d_ZeKPBZT~%ksDc2i3x0%ftfQp zt^Pv5og5fV2Xcn%{MIJokhB((r&!6syVd>6Uf7aDuhrlIDo=}!h41m31qWD#)Fz6t z@>WFAcBQX6_Kbue=zQz`l(}(H+cV{Rl^bJnWsGFY;vD>$=+W=aoz$0pydEl3lKx4| z*K!!c@9zAe3bA4UuRqHPI{>KG8`X?{@f%c=0KvxMPq;<5gP>E*sLnN;kT-9(bGz?Z zpg2ggCH;diA)kO#SNKQsm z=8r1#o6~IoL zCv1+4-w4;}cJOFFV%^R@f3S%qm2vSrh{8TM>C~kc2PKCv0EZ{kq}^f`HwZ>Ua=ODl zkEO+Z|8b%ZlKV$VbN#Btj8b$1iH3!D{2~hah%S}$9pRK;acvxqihXcLcdm}M7jgB^ z*y7D}e_kqFebKhQ#tOT|lb>|JRKZ;xv1C-&H|gotYHGG7KR3ozi{E)Dp|`h8I9Gub zTRKZ~$RyWUl^Z{p5r!Lnl9U2o9Vm#d+HxW|E*CwoJLeJ}w|X&HMIES+_Ds}>s!vJP!v3+c)h_L@Zqe;^@S<5&k68(A$O4! zY+2BZ=l_Zi$Gr2s@~vIR{i>Uje>!}~aqzR*9~O*VH8Qt&3OMitQ``kkEA*NReFhWD z%geR@2#>3_{7oV>`MzHu23^m~H{8znZ^iD9^hIk27zG~<4zdqZq3Wz4WdfWva)iAC zIp?qK0=3%{M5@I{p`-IOnt6jPIrK2|SK$rg;r2B_e z{_kgyq#q77-gTFdC#uHdJ;yN{PzuhXmGA6Kwo}VnVZ`?Zx9(?0PjWUO-cJ>-aP(|F zO#ilH6`d8``YXt*&Q8&Qfu)u(<2UKyGt^kNJR=!w5;(O?d}{Hj{?zY%r){9Lqwvwz zC#;&#mZ0%HDxCJ5AsO*wA|>?&%o$=?S^R&|Z2xOJ>Dvp|o}g_C1{XzW{R+YP=fxk* z2~}7eR5l%GFhbjLgl6ml-bTDO)AU7a0y~KK80cS0XGr@F;S@ zxh@@c-T6kTQZG?}e%;s?YjZWS@~?~!*q3ctk2O$C6tF>y~B)em4Z zphnLt%HxxV5E$M?U@7A_w*1yOt8J-+q*mRzZ`ss^uUaEuu$8)_bw~rp1y{RRDXq$XE6Kiw;0eL z3ew+acJ%k7{=d&G^)UwAtM-XYerecpFRCf0eDS)Bh=e^a>HYTKSMYDU;B9``w>0fH z2r%^&ydxr5=1;v?SzJrdn@4hRK0W8{zU`z2^-Zn5JUm_Pcp44718a}$AG2~32D87s zcdS|dms%$H&inQZqC^k;?b!I!81FAJSr@AR?+vw)&k-C2cZyU*vm~v#p=5^AWbnIY za!Vfi=KxBmYPq)BUq0Eit6(Yw*p1#U*J)?yFPC1Wi*0PH!FO>~*&d(&`3l$pJMj(~ zlU7wxh6w5MjPdV=|G8q2yN%s)W9Ofyo+rYeAtMV43jTWC#qr^Oce>aVp9Uy_y8`&z zwEFV$u|LXZ1_!17IWXA$Dk)bT1_tJzk(-v5Hsl>9okUwq5f{p4KK38p#-DY>J`vb) z{nJ0K{y#S$`_$qa)c(J3W@MW70nl9#yjHg>m};;|dD zApXl{9!14Z(BTooj_FzSALZY__xxlAeu95L)HLw$^~zjH7leC|3j4#1uEzLlAjjAJ z-CfFD>&EG-Y$w5I|F06#J`n3_iZ9iBfFyDFK`Z*91zUHfH;nAoyygEe_MTx)c1s(m zBBBV0NbdqlFH)r=T@a)bT0lU02kDRqD7`7Y_fA3$z4wj*0!Rx*dha!GqVKo&xA%9> zkF$P|Cl^#Nygd>|1aX z4#0bAM73gv2kY60qm|Tu;AH3!A@fyFa{S5xRm{eiU3f*|VAB=qLL}clHP2`g)Q~cn z16XFrQSRObc5iR}m^*(`;UCfR9g-zRA_r+ptP#Lk|Aj|riaXlbP(zY~A<-&E8nX3+ zE&~ASYJKot^Ov_wz^j#(_WBR9Q_@wxU3_8|^dN(shc`n7*vBQKqSQ1?!|IqPLa&ne=011Z{$MU~v(tUKAv z1#LZ#8!}S@)??7N(;fmTv;6cF^R(JeXBeOfwR(#9fUy?5gDA1EHzLiU3N)`T%+wW< z>PL!1jBCZQrT2evqfdp!Nh6gI?D6}NTc>p^)4sx8<;2kjlKX|4=y=>KhanW;{fX*Y zME9;OlsH8gg03YXpsMB={d=R*#pG*|7-zkJX1pU-2#5)k<%z-ljwh!SVPkdPY2YkdLB- zOjJG^F;LyU+Pe7p@}5eOP5!ALq~V_0lsJ~3hxOZ%>y0?FacvM*v142A+@47I^H~q8 z+KRyEM2Ugo4U38ub6PtsFJ2(@W)^?)p@a%0i=a6ZFW?=gTxjPHcU&0x{VdU{8Szms zPuV>a2J$|3T_CtCM%~2?h^+>`BA;k@ia;+7T%D15y8ffBzrIr7 z^OwWENswCUw_71qMbn6_~Rb!R;|YyijPE(OK{E_GdVG|4ok&fsM1(a7uS~gDW`l! zV(e)=E4PmPCW%&SD@wWNV=9GjA^rv%>w~9L_sKk;r+3R9_stInq z7wnmsh3Q-Rsz$HEcAi#W-7+<8hIkBbQetVsLN8AkWA#ct|^M_8HIzN_RK@#nI(oyq;=i?HyFL;ZT; zQml3caBaF2_tp+4b(PuVEw;YC&R4Q?LRj=}Y#aBDWlnai6dZVrX+UEv9pEl*b>!w# z{G=1b9AQ86L)o0(GjMF~3Iz_3Ysr^oVvg=hp zrUhNlE%=@TOA5{xyzwPaCxkq_2oV`>bxzi=+D zj&HcZkNwO?)A`h}8@a`Ut~!bKF!%X%HRNdh6>;Z9Y(wMt*56;7=oekUM-d>L|3X=V(hBS*Jp~2A z#sT_>scJNJWUhwqL1!qsM&9{V{)x~x1qYPhrwYPRVf$=|+sDQ|hAn-wk3}MLu8%Y^ zq{e@)2N4g{umK|FY*MHbFIlgV-Xv;q3#MH6YP4%)xKwB$hnjj@=aukyi z{8$DX12O5aYUwT$e(?sBK+O03XcnVuVlNC{mW)+BFpStOIO#4@a9F~hKeLnQctT!Y z9A>EWE0UT5P;H+xsovBw_LA3bpx@tyDgGo$A5hp!woBqiz_`mky1T8=Rv4v6di!ON z<=3{`$FF-7uEgu^866lWNgv`s9QgpBFVZfDE~O3rj>h94P1+pa<`9JmCvw8V)_C^Uj)5c0qPH%Bl>W!MatM0fD@yZ_U zuOJj5K+3F=a)Z!lHu8(&@Bo&LlBBQpMh^U2y~*E17KLTKBMMHOx+6o3!b*x?^?t{_ zcV|c~Uzx#4b%|F)Lh<+7io{b#?XEpEp!}4%#1StL(SlwH!qhR+$g0pX*d# zRIMX~(EeD&@<^)2U$$CB-Xx(@_i5RJqCuIHk8^ET)FRx(3uG&%vdMd42~ILM2d=8T zaFUg-IHg4eZ@$-$Kl5|p(caY)uS6Qja7GcO*L<4ebk8-D)@MRj z%)+R8qBq#O{F5&|Me|XaKYO>yP17NJxz)F&Ho_H1iok3MF3-6QW=`9#cYpCALx{~S z$l*w3mh8efp1SP`)4WDY;@n3D>H0f+}*`L4E4z|p;0;td!Fu{^Fj%h_dm!>9`r;ZN|U z`UFp{{nm$R`7YD2#CeKFjI&nTwu!Krgio(kQ?2ITPbGAD zs%b9^oY96zTDa1tgY7%&swo-o7Ws{OAy}>kG$@f9)6vk~k>!=g6(a-EiskBP7jW6f z-Q@C8dZUcWlpxveS43@Rx3Eo&qg11(-*yohz2WgMCq4b3*#v?LJ3>9mR8xx>Q#NQ? zcR0jE3`h;uy_X@Iq6CFdoG@>ZxSu`4qBJb48?Spg89n9HW->0I93j1vteW*i`1MXJk?M7B6zy$ zQV?@6nM`~TJ3BZPKd@Lf_^oRDHjQOw{D8_m^f0z~e}CpSYga$*+${7=2eP9PS#Xyg zS2iyI`eZ*EMq5?W!}d7n}~C`AnFM$}gD`7>Y)MKVQ?YZEVwBjU@Z(xYrha zkK8QHI}n81Bt!YncS-!?ji%`p1t>MVe94|O{6&!`Y*j<18?qyK=qSX5A;>4{_lx&TCrl_hno+@%53+ zn1a}NVc(JX4t~yXpcV~tk!$5FzcFMfOLOv0F=%X33fE^nueh&)8|WcSx;fxHe z>y&@ww`8Z6t>Fp#`8=U4)H_COOVp}_glLuiN2Sc&=Sukpuw0!Hnu{ilH&jpTFj^I5 zEp)})_2yIn6xAsn=0sbA|7F4`+kZ(zz#;jvkTA>h8n$qa%VprqCVej7?3iguWA zsw2s!oLUk0g)Uw=%6$AGtdtLKc0Td2h=gI)y@{U(~*<<%WCn$SYt!QOU~IR{n@Wx?=+NC$nteZoh5;|!lo@Y*7$CKB?M?}>rGody9vI1XPC%X>{|uRs$r$fy0zZ(TAs`irB8p%aqEjP_x<^;`~ z$;dcJ-}NbPc)ljR56U)_T(ERp;k#{Q!Q!n%>`n-~z1HX*$&MUE2wzRw1SsH{1&TA_ z+KyvY`P$^L~#*jIw4!2hxZfKB8G+yPHso#xL(FGU(ep&{c0qwOWwc3 zUo10t{)A4E1e>3)KHTJY{B=3m+Q?eerSi~g{gvJubC;w+P+$fg?>Ry8pn-;*@eh`- zpOZL4W2Kxo?=C^3>!~9`Y3imagWH!LKA&4M_Rp^`LH01qRnd7%;mg(x{Nz>qFxmX~8Kc1l9W9V~gD23bC);>k(41JY1$j zEta`9y(K*5=hb7RejCpdzaD*1q^-}=U{R)3=D*s4bTY{%DRjfnUEv?#79-hB__cTR zPzNg9(t^SjvrzSYqmd=ORj-ShfJf#cM7>MnewOw6gl|*X2utuY-s)(5C-Kc z-IWO!rfG*Or4oVbRb8N1GT=UaH*AI`SVjq(GTfPT>N!fZ*~`ixSUl{$cgMs%2VcdE z4|Tc}oyjbw>tBjD;TNjmy$51JTvC=GXW@?j3!tzp$UQ34N+fH1EylPEfLp-dm8epV zci-qB@@eL1dsfEN9xYLpq4ce8N680Jg?Fi0)mbIZ^QA{*c?Pv1VwKro*@PJDiNg#R z6jg&gp>G`X9>1$SU+2#w_X@S@Ja--I^h@x?ZxC)2=&{Nvnyu45dw#InWrXR$MyF}J1j-If~T=CI3c+*-F<@cmJ zmp@!y|2dj3eutLaq4s+%EeQRLZk{x{01Zr`U*-qR&lHK zUM4W3+nIcV#Dx=Aqs+X-j3&-3(t6>kw`iKN`zevQs2x#LoHhlj(LEreW{5LA(NG#& z{rwo`zV5F~2iQ?L2|inFZTBo}cd67T2+auX^Za{ca+%liNeT_wI{o$n414C2>@vy} zo}8&ec(Pq+cW$~pjle-RAmoe^ye=j?$??8NQnSSC{A{MqpK_N$UJaKwn%O0qbuXQN zB9~#>x+p3%#Upe*A#$Z+*ed+`3Q_GUlXA4S>>DbSS`t!8HIUQf+`>wIPL=%8m(XeV z%03Y|^*oJ=N|o?%8VxXVj*Dn^%5EBn+}M1vaGcxQE+I@gOexS=%&3U8hBgn+-(RH- zZBhQ28b?DJ)cGr(Y^n!`&9#?5z=-M1XLbK2=(a2y>lkfEa~@#N1LiI(;bgG5Y72{s zFZ9jD{5mP^qISN*5(qc^Uf!(^%&2cKOJE9&Q|UcY&8g2X=vy&UyaG-)z&bfcy~y+$ zYb+fscC75f^Z}#GY-;Co$Gil(3&d>5XS;-^s8gGottWLj(ktIT?FY^;RPGIkdQ=4^ z-mM8b2`jz18)ZJ1N`5|FFeMKZHr1LRtIHGWdaIQDD!A+M^LyOnBQmtDe5XBk)D7|gX zJ6W3c{mFGU#ucg#isbD!h>~uAkd-}!T6-f_gx^T2gatiTs>>$<{B#L)mRJ+F$Tjgy z%*R7+jUx7FEKP~lbUc!DKu1IvRkqyoiyS^0&A72m0rnNt zMzricLh^??9lI3mjBEydV4{1kx{b@8m+MWhD{{LT^;hWM)m4=2gmTT<88hx>BoQRN z3wzqhw6s|`n~9w-l57+C-G#2Qn5||rDudaf!Pn_!cXv_A3%2ufrpq~G&GK#fi#>-2 zQQp))%E*bkq*wWK%Fg&Z6BlmAPOJJa^Ws9h-Dnyv%g(Zd?_v(#&t)W$E?=Hru&~RE zv0E~xTZA&N#jDqQ3<;7%jYUGY5^%$dFI4d+9V+y>rX~1+c%qTm65qa&6LS}Tdme3r zKf8T|^Dvam5;{%kqAQv()pIgZKdLq^;{DNib-B)wgJqv}`TsiO%TIJe@neZ~kA1$B z2=CZ_p;Q3(*?of-mjcS@v>Lr^-jUJU&Md9m-IDS)-6*j<_Q!|kew zrlLxjdLT9tN9$XDSuA+Xl%pl{z+&59@ffo@)K_dFHKL8G8Keq``}`%~xnmJlouL+h zcX&MSo8#(~XzgXUrhDBu~BKnW!~SIK4x z2?t)h6|tcjAS)t_-%w8=p@CwTtTWE|xbBFdr%4Fk$$`tiRqeGcgkr0*BAfJ>WpO}_ zitzf)wI$#nHOO>X)yx2CMEGi?!Jihn@5jAd(IU|$6v#Fqj+b0tfUQdXK;y92v)R8m zu6sWA*u-k&1gF&KR?~`uPqyp=GEQj}tC%?pWxT+@ZY2|)w z;q22At|LDtlqH7(U%xfCn&>70P$rsnnSySpe^381h0d9>bFVzL-AxN0A&vF=l)G3x z=fiFXRI1KE=T28&1-w`aHa?Bjk~-B9{Ag+S-JRp92y_#r4(KGO6=ZEs&|BNsTn+xH6 zDCC2diJI0bQ1tuja?1R{*6X;kZ9fg^g$~8pqP3FV~=1<$H_~nwmM}3SFGof zKO}!si0<0r&7{*%Mh)w}HL|eatPwA$IY$5KWa4SL0O;OHC!ZANogSO2f| z)KYG^wKms+-!?bV9vW9K(Ykse9QjfQ5q1+2wpar~_}on3XZVzpP&>hqZdMZmUwO^G z(4O?^j)!pK7UZz8zTAnsI^SAqsI*Re>JAC4!tI?3m1lFY@Lp6St?MZHRJY1uQ$hir z2{h7~#p@u86)2j}6Pn@LJ@?w9h0w0ZNdF|OhNC{bmsopssZ>)`OoNcmLxe^$dnlRH zgl2n6gJrzx5&e}%;pI0F)Mscq?hQp_U>Scq(V=MN%BL3%G*MmOilG-Z-+cG@pZ{3o z8rasIA|F1Tr5i}OF{l0N=1x4ClYA{AKZlf7o6<3@Zu9hKc+`%rXyM(-M@7Wdp%Xg{&x`DSmvzoM9a zTjvg$z-=MkmZmn|JZ{sx3Ra?5HgXn0(B#DN87F58Lzx;r)-1dXo=I&qDVl!6RVRFP zHie^tV)zhSoP`-YGD_%FiYLWS@O9%CzC-Kt(n%GU_(Eh;#zBxb7`HfYDtR&Dr@+!c za{aUq?BNwYG;Y?A|6WA{MVs~XBiQRYFpdGr3cBZWO2HGXS#J)ZLoE`tlBWbXf1<|V z)<3aw1=5Dt(dLbk7;ipnwz2LP7)qhW1lmHMTb7<=9o0>KWJl=NAFpRfNa3ix3yZ3j z?1LR`TEOL;np>spzZBPTnU_j`y%Ll_EX@~*tK&o31m=|sQqQ@RxK0N8R8-KCB0jq1 zhD=6Bb@}FEzeNz3PS;*>4_(u%MjDGBzcxA&Pd`E>H+L{t4!^8ls^GM zGwxFs+CEs-8(ei+pvP<&>5oL*dWb7QGrpnZbKBRdwd&UIzj{pR6ROwWAxYF|hFMoToLNKw$Mp1YI%YZ09)V*k|oP!JM$Sd|nP^Zw! z>{(4RUW(8xxI>jwQqKxi zOgg8W(#d3w(#@yW+Vu0FU?{_Yy0HTt9pO5(^q; z834%=r1SFZ6-&mBtm3Wvb!Zx9<(kne-B{{~QhG-~n}zr(2Q&`IVa@eNkv3M-EVZGD znAYq!%|TmFO8D8)-nrI=+jdmiq0_)L%kk95o!F04Bv5qF8_H`Xka!!IVtlZL3bHVSm8e44StOlteXfmA#7^hs*(W@U|OGDt(=(@bTpu zUANWTA|#sd)4GpJHdRR;{STl0zqS^$6BJxMRPMO2W-u2A@o&F@QSbA)%Ce5Z7HzLb zAkVi}NPRMCj$b|fh1=EIeSgb>Vy^e&$L7bSjA@MKDk&H z)(DD9B0{4}>=o}mm-X(Y-EXv=<3mb2*CaT|+Xu(htHt-L-*fAv8`|`}Y_f~@hK?dY zItMiyD~qO&$9%7L@cF;|%nB^JH>^i?vnvAwH6ScYRKDJ6b|O?uTIVqUtBM8U68C*c zm9@4Dj(fG>?#`#Wrs*0L8+IFz*sTE5J)9G57_o14IoEAs8IS-_MPE`A1ugwm2;C}z zMwjeOG44L8N*1VooD@XUAdV@1r8}X&7i%Jtik6)vZqQ`1urYwDKenjSWRP4^`dE9J%@TY+&u!SAq1e}a-03Cv$NmYlfmV<0>BI*C4(R`L(I%?}vPps(85*`XJ=`&spp zmzVH-9~lIL!G=6rl#=jVFU%tOigaTw0?nJ`bbn)S2NZ!arGUwqUOBR!a{cmf~pG06so zGF$M9|G3stBwscVIXtKa{kl{gFkss{hUt9(+LG`8jq3AT$84@!`VN`dpx&CIXHsDo zsPgO0?73gh3w(A7Ud)=3*3%-oTBy_}wbkNlnFp0(&H6TkD@S^E`7=v8SxAXJbntOB3Fd zbFz||og4KOehA=3azCZz!0D>IO7F8>{dj>hzxxjN;t=!c8_S@tZ)ldKo#veD2l@1U z;8Qr_#4CKgGwaQuPt#~R=li!gG)z3|qgk_S8huXten9)x?o+dQ+GA?c%F{s){9=4@nrrv2e6*Rh2ocvBfjuNFdG6 zJm5W#o!h*C_b4TC1?*k3B+V!7L2A*db+lK&a9~0u092OhgT0hty$>Nl$4C&;7O3%4 zQKjyqFCT~MQj4*wS=t>&1c>237pSH>vIz=pa%x7?DnOrkPc);nevjl}Tr*!`4(vrt zzyL^C@LNG@g^oMd&7ezu=ic|cXlfKg=kd3a$D-I7w$o9v+RD!snrWzxi*k6LMyv|{ zuJ6ea3`ZHg&@S2iy6Ktq!$o0dd``N4wx`!H46pN`t?F@Xd+#cQwFBZT3$HaP%^r5y zrrX|TS(~+YGTPXHnYLI4oq_oId!741#UG3JW?Z_-$m6U;N0M6H3L&3rM++sgLV+> z%g}6xOk|K8N-OqKYx**S)=cZSAHj$YTe^sMh@GA1!@J1MaMvS`m@Xd`unyJg`vE&@ zU8d$KNNK642z%ze{h-j8Ark}z;^G>i_+Uqlck>7v8k!-?_YZ9MJ}t-|130r zUyq0DsHS}p%449QHF}j1*}+wX+vJU&W{N+H)!vpY@6c$@Iz7y`IONIo+BqFYf`&=% z-zx)aWXfN>p_))Curvc=s;u`>vNR08|X@j)p1)O{} zc<8z57TG&k8%*5qKy`F83FuhS&HbpYu$WPs-M2?jKY^5&mTZfkEXlJ+As@s4?gSl7 z<(YIZ8O)Q%h>6J}PunBf4HGpvC|l*bKJGWui&|(_YqqL!@c;?eAp6N7mnC(cM!I-f zqs>8eEVRX+l7>^R@TXE|xFKeDBTi~5- z)uoNmGEt@BvVy+JEE;V$j|U~;V^d|Uc#z;M2jy3?a#)kJ%$^X*Yw62}yMP~nd>5oT8pRImfbU=S z8ul=9zx{>+ru|b(`yYQdWZUEPGF%1}A>`!bui18z+eXQZjEoGlCYM1{=xXIQd0OAE zTL?T-waHr4fL6H3bJp5mr9ohkE3eck4LBF-p-0L+pqRVie{rMDsRdw%-G8nO`I4Nl z=2Z{pQuyvwQW{!G;~Cp65P(pL^Qy~AhC87Pz`X%*BW@Tch+_Yno<*EjO_#%wXh57E z2fr*?gK6C|E5JIhwLchOvxFR`=;QEuE+iym&8i)aG?L;G0XkVBg|F%%IV(#I!dzY#?@Rd=al!EER+9-}~V1J5}PA<{1-{S9S-+0-#%0E-d-@ z-Z>D2TfOP&9q8(wUXZ!zr=X{a8q!>kRbquar^=>{Zz(35bn%B}lVW6&*mmX|n@Ymk zpCo^`c(4e^O1+>1Rjc$x<7!Wkw#$P$O&ZnRGr_bi1Jw-$h7Hwa$Pp3{E;*Pd-eIowReD z_`=w=Wk`GP7S7%p*|{u(!h zShr!AuwP_Q*^3%ELK(M0206nsQxoc&3wy#QmMFr2m;x|=_!aXR5i3<4=5%vl=E&(m z@|j-tXm3b;O}-T2S5Jhba`RF3arOav=dWhLjJpoV#O^kf7So!6{bk)DiEMUL*@v^( zl5tzGQX1?;?HMh#S(PD^q1zhxR_#2n0W>yrNB6y(yTS%=F|%p}7=}UVRVLq(tSJ#kI(kH+2N63SCUiMD8#{r8+p_1GY+@urGh`T^FE#fV11I% zdR-iqD|Ak=z{|=zDmd6O1L()Qr3Ri{DW3Q-=k)F;c~p5a`Dlo+jS8+8)iQ72$>^pW zZ=SbjBPGGkkgor*gPB}KyX z?v&-0pPZFP8^Y$h!e2c5wYcAVtAu*D1l6sZQdZ0999uVlLd4G5L<7p`mEW|O+<-_{ z5;*oU?3Zuh`gN~>)s1LGjwZp`vD zo&_q6BfYz)QS3b*+@qchOgFRiK!b$c2AW7*FIVsRIOwb#Lruivl-qu11a#TRP}_p4 zu!UKJL>0g6PrkURwQWDY;cy!D2=!hQBRoHU=>)zGyS|op0>2qw;Qi)7t!~Kc6+9Kr zj=JvKxYPxM$S1f)Z&*8SMtetl1x)%bg)byU-Or*u^O>itIQP`%Zw3-lRcgBocGx3{ zeY5DcKs)!aGQh#${&oK0ZB_Q-P~kmd*NJ)BH!`%S=Yg55%8qj30k<0I@ta=Ao+!Uo zlLZcu(v35Uyk__;zkoDvccsO&I6#DUE?`^&8r(}@o zwmcLVJv~m+8~b*c)%Wlx|APS1z4iu-08xGVi77m{E6IXy*?2t4-zBTtn%w!>T9RWu zA3l%;PH35)2I!4iL-F(M`xOr$#FN|p&dQiDb0YeScuB~~8}ivY@wI9z#@Y=9=6$@e z@o}~K%1TTc`1_YvJkBjiY;SHcqSPxqjP8kt_yz~^Z<$!`K4Eqh!A=3UhPTNRAA%tw zA6qCe$$~-#1Ii7AdONVB=TjGT&*-E^f>yxT_)D7$_Zuk&@=juT&Z*j%0AZcS2(Jx& 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

y)H$h&Oc2%jxz@~Tf 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 From cdee76384157ff34619c3205b268109711fe38ff Mon Sep 17 00:00:00 2001 From: Maxime Caron Date: Mon, 12 Feb 2024 12:00:09 -0800 Subject: [PATCH 25/36] Update RemoteOrchestrationServiceClient.cs (#1032) "Refactored Exception Handling in Retry Logic for RemoteOrchestrationServiceClient The DurableTask.AzureServiceFabric NuGet package was previously using HttpWebRequest (.NET 4) and has since been updated to use HttpClient. However, the associated exception handling in the retry logic was not updated accordingly. Originally, the catch block was designed to handle WebException, a legacy exception type associated with HttpWebRequest. HttpClient, however, throws HttpRequestException for request-related issues, not WebException. This oversight led to the retry logic failing to function as intended, as it was not catching the correct exception type. This is particularly critical for the RemoteOrchestrationServiceClient, which relies on this retry mechanism to detect changes in the SF partition leader. This commit updates the catch block to handle HttpRequestException, aligning with the HttpClient usage and restoring the intended functionality of the retry logic." --- .../Remote/RemoteOrchestrationServiceClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableTask.AzureServiceFabric/Remote/RemoteOrchestrationServiceClient.cs b/src/DurableTask.AzureServiceFabric/Remote/RemoteOrchestrationServiceClient.cs index 04f85e8e4..51db1edda 100644 --- a/src/DurableTask.AzureServiceFabric/Remote/RemoteOrchestrationServiceClient.cs +++ b/src/DurableTask.AzureServiceFabric/Remote/RemoteOrchestrationServiceClient.cs @@ -378,7 +378,7 @@ private async Task ExecuteRequestWithRetriesAsync(string in return response; } } - catch (Exception ex) when (ex is SocketException || ex is WebException) + catch (Exception ex) when (ex is SocketException || ex is WebException || ex is HttpRequestException) { exception = ex; } From edc53c8b66895544cc0fc6a3d745341edd7b4b0e Mon Sep 17 00:00:00 2001 From: Sebastian Burckhardt Date: Tue, 27 Feb 2024 22:17:07 -0800 Subject: [PATCH 26/36] Add checks for entity support to improve error messages (#1047) --- .../Entities/OrchestrationEntityContext.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs b/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs index c93d0ee4a..3e21f31a6 100644 --- a/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs +++ b/src/DurableTask.Core/Entities/OrchestrationEntityContext.cs @@ -73,6 +73,14 @@ public OrchestrationEntityContext( ///
public Guid? CurrentCriticalSectionId => this.criticalSectionId; + void CheckEntitySupport() + { + if (!this.EntitiesAreSupported) + { + throw new NotSupportedException("Durable entities are not supported by the current backend configuration."); + } + } + /// /// Enumerate all the entities that are available for calling from within a critical section. /// This set contains all the entities that were locked prior to entering the critical section, @@ -81,6 +89,8 @@ public OrchestrationEntityContext( /// An enumeration of all the currently available entities. public IEnumerable GetAvailableEntities() { + this.CheckEntitySupport(); + if (this.IsInsideCriticalSection) { foreach (var e in this.availableLocks!) @@ -227,6 +237,8 @@ public EntityMessageEvent EmitRequestMessage( (DateTime Original, DateTime Capped)? scheduledTimeUtc, string? input) { + this.CheckEntitySupport(); + var request = new RequestMessage() { ParentInstanceId = this.instanceId, @@ -251,6 +263,8 @@ public EntityMessageEvent EmitRequestMessage( /// The event to send. public EntityMessageEvent EmitAcquireMessage(Guid lockRequestId, EntityId[] entities) { + this.CheckEntitySupport(); + // All the entities in entity[] need to be locked, but to avoid deadlock, the locks have to be acquired // sequentially, in order. So, we send the lock request to the first entity; when the first lock // is granted by the first entity, the first entity will forward the lock request to the second entity, From 027e8aee809bec9c0043c66965f0881dd5c41e7e Mon Sep 17 00:00:00 2001 From: David Justo Date: Mon, 18 Mar 2024 16:16:17 -0700 Subject: [PATCH 27/36] Increase DTFx.Core and DTFx.AS versions (#1053) --- src/DurableTask.Core/DurableTask.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index bcf349346..94483e90c 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -18,7 +18,7 @@ 2 16 - 1 + 2 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 From 336c9578ec2116bf3bf013f885091e9108df3df4 Mon Sep 17 00:00:00 2001 From: Leonardo Quijano Date: Wed, 20 Mar 2024 18:13:23 -0600 Subject: [PATCH 28/36] Add TaskContext null check in AsyncTaskActivity error handling (#1055) Co-authored-by: Leonardo Quijano Vincenzi --- .../ExceptionHandlingIntegrationTests.cs | 24 +++++++++++++++++++ src/DurableTask.Core/TaskActivity.cs | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs b/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs index 9e8042254..83fa7f0d1 100644 --- a/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs +++ b/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs @@ -148,6 +148,22 @@ await this.worker } } + [TestMethod] + public void TaskFailureOnNullContextTaskActivity() + { + TaskActivity activity = new ThrowInvalidOperationExceptionAsync(); + string input = JsonConvert.SerializeObject(new string[] { "test" }); + + // Pass a null context to check that it doesn't affect error handling. + Task task = activity.RunAsync(null, input); + + Assert.IsTrue(task.IsFaulted); + Assert.IsNotNull(task.Exception); + Assert.IsNotNull(task.Exception?.InnerException); + Assert.IsInstanceOfType(task.Exception?.InnerException, typeof(TaskFailureException)); + Assert.AreEqual("This is a test exception", task.Exception?.InnerException?.Message); + } + class ExceptionHandlingOrchestration : TaskOrchestration { public override async Task RunTask(OrchestrationContext context, string input) @@ -222,5 +238,13 @@ protected override string Execute(TaskContext context, string input) throw new InvalidOperationException("This is a test exception"); } } + + class ThrowInvalidOperationExceptionAsync : AsyncTaskActivity + { + protected override Task ExecuteAsync(TaskContext context, string input) + { + throw new InvalidOperationException("This is a test exception"); + } + } } } diff --git a/src/DurableTask.Core/TaskActivity.cs b/src/DurableTask.Core/TaskActivity.cs index 5cf79c09d..b05f020eb 100644 --- a/src/DurableTask.Core/TaskActivity.cs +++ b/src/DurableTask.Core/TaskActivity.cs @@ -136,7 +136,7 @@ public override async Task RunAsync(TaskContext context, string input) { string details = null; FailureDetails failureDetails = null; - if (context.ErrorPropagationMode == ErrorPropagationMode.SerializeExceptions) + if (context != null && context.ErrorPropagationMode == ErrorPropagationMode.SerializeExceptions) { details = Utils.SerializeCause(e, DataConverter); } From 04583ad69a1cc76d189b51694a86959d8df53384 Mon Sep 17 00:00:00 2001 From: David Justo Date: Fri, 22 Mar 2024 15:43:23 -0700 Subject: [PATCH 29/36] Remove redundant Newtonsoft.JSON dependency across backends (#1026) --- .../DurableTask.AzureServiceFabric.csproj | 2 -- src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj | 1 - .../DurableTask.AzureServiceFabric.Integration.Tests.csproj | 1 - .../DurableTask.AzureServiceFabric.Tests.csproj | 1 - .../DurableTask.ServiceBus.Tests.csproj | 1 - 5 files changed, 6 deletions(-) diff --git a/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj b/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj index 6af41aa98..f283ca42d 100644 --- a/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj +++ b/src/DurableTask.AzureServiceFabric/DurableTask.AzureServiceFabric.csproj @@ -18,13 +18,11 @@ - - diff --git a/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj b/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj index 397981d95..a55f5fa8b 100644 --- a/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj +++ b/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj @@ -29,7 +29,6 @@ - diff --git a/test/DurableTask.AzureServiceFabric.Integration.Tests/DurableTask.AzureServiceFabric.Integration.Tests.csproj b/test/DurableTask.AzureServiceFabric.Integration.Tests/DurableTask.AzureServiceFabric.Integration.Tests.csproj index 36f4afdbb..f23978e45 100644 --- a/test/DurableTask.AzureServiceFabric.Integration.Tests/DurableTask.AzureServiceFabric.Integration.Tests.csproj +++ b/test/DurableTask.AzureServiceFabric.Integration.Tests/DurableTask.AzureServiceFabric.Integration.Tests.csproj @@ -11,7 +11,6 @@ - diff --git a/test/DurableTask.AzureServiceFabric.Tests/DurableTask.AzureServiceFabric.Tests.csproj b/test/DurableTask.AzureServiceFabric.Tests/DurableTask.AzureServiceFabric.Tests.csproj index 56c98730c..276f1d70a 100644 --- a/test/DurableTask.AzureServiceFabric.Tests/DurableTask.AzureServiceFabric.Tests.csproj +++ b/test/DurableTask.AzureServiceFabric.Tests/DurableTask.AzureServiceFabric.Tests.csproj @@ -10,7 +10,6 @@ - diff --git a/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj b/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj index 496621005..d386ddd38 100644 --- a/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj +++ b/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj @@ -22,7 +22,6 @@ - From 4ab56b6606eafada5961a36eb207e278fba038e8 Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Sat, 23 Mar 2024 13:22:52 -0700 Subject: [PATCH 30/36] Update history event descriptions in README.md file. Hide link to unmonitored Gitter in main README.md file. --- README.md | 2 ++ src/DurableTask.Core/History/README.md | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb989da5c..0451cdda2 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ Unit tests also require [Azure Storage Emulator](https://docs.microsoft.com/azur > Note: While it's possible to use in tests a real Azure Storage account it is not recommended to do so because many tests will fail with a 409 Conflict error. This is because tests delete and quickly recreate the same storage tables, and Azure Storage doesn't do well in these conditions. If you really want to change Azure Storage connection string you can do so via the **StorageConnectionString** app.config value in the test project, or by defining a **DurableTaskTestStorageConnectionString** environment variable. + diff --git a/src/DurableTask.Core/History/README.md b/src/DurableTask.Core/History/README.md index 17f5422e2..7f99fe5ec 100644 --- a/src/DurableTask.Core/History/README.md +++ b/src/DurableTask.Core/History/README.md @@ -11,10 +11,14 @@ The following are some common history events that make up an orchestration's sta | `TaskCompleted` | A scheduled task activity has completed successfully. The `TaskScheduledId` field will match the `EventId` field of the corresponding `TaskScheduled` event. | | `TaskFailed` | A scheduled task activity has completed with a failure. The `TaskScheduledId` field will match the `EventId` field of the corresponding `TaskScheduled` event. | | `SubOrchestrationInstanceCreated` | The orchestrator has scheduled a sub-orchestrator. This event contains the name, instance ID, input, and ordered event ID of the scheduled orchestrator, which can be used to correlate the `SubOrchestrationInstanceCreated` event with a subsequent `SubOrchestrationInstanceCompleted` or `SubOrchestrationInstanceFailed` history event. The timestamp refers to the time at which the sub-orchestrator was _scheduled_, which will be earlier than the time in which it starts executing. Note that there may be multiple `SubOrchestrationInstance***` events generated if an activity task is retried. | -| `SubOrchestrationInstanceCompleted` | A scheduled a sub-orchestrator has completed successfully. The `TaskScheduledId` field will match the `EventId` field of the corresponding `SubOrchestrationInstanceCreated` event. | -| `SubOrchestrationInstanceFailed` | A scheduled a sub-orchestrator has completed with a failure. The `TaskScheduledId` field will match the `EventId` field of the corresponding `SubOrchestrationInstanceCreated` event. | +| `SubOrchestrationInstanceCompleted` | A scheduled sub-orchestrator has completed successfully. The `TaskScheduledId` field will match the `EventId` field of the corresponding `SubOrchestrationInstanceCreated` event. | +| `SubOrchestrationInstanceFailed` | A scheduled sub-orchestrator has completed with a failure. The `TaskScheduledId` field will match the `EventId` field of the corresponding `SubOrchestrationInstanceCreated` event. | +| `TimerCreated` | The orchestrator scheduled a durable timer. The `FireAt` property contains the date at which the timer will fire. | +| `TimerFired` | A previously scheduled durable timer has fired. The `TimerId` field will match the `EventId` field of the corresponding `TimeCreated` event. | | `EventRaised` | An orchestration (or entity in the case of [Durable Entities](https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-entities)) has received an external event. This record contains the name of the event, the payload, and the timestamp for when the event was _sent_ (which should be around the same time or earlier than when this history event was actually persisted). | | `EventSent` | An orchestration (or entity) has sent a one-way message to another orchestration (or entity). | | `ExecutionCompleted` | The orchestration has completed. This event includes the output of the orchestration and doesn't distinguish between success or failure. | | `ExecutionTerminated` | The orchestration was forcefully terminated by an API call. The timestamp of this event represents the time at which termination was _scheduled_ and not necessarily the time at which it actually terminated. | | `OrchestratorCompleted` | The orchestrator function has awaited and committed any side effects. You will see many of these events in your history - one for each time that an orchestrator awaits. Note that this does _NOT_ mean that the orchestrator has completed (completion is represented by either `ExecutionCompleted` or `ExecutionTerminated`). | +| `GenericEvent` | A generic history event with a `Data` field, but has no specific meaning. This history event is not commonly used. In some cases, this event is used to trigger a fresh replay of an idle orchestration, such as after an orchestration is rewound. | +| `HistoryStateEvent` | A history event that contains a snapshot of the orchestration history. This event type is not used in most modern backend types. | From dbcabafc8c4c62e0b89cf0c60d8a47ba31f34580 Mon Sep 17 00:00:00 2001 From: David Justo Date: Wed, 27 Mar 2024 13:21:54 -0700 Subject: [PATCH 31/36] Add Automatic suffix generation for DTFx.Core and DTFx.AzureStorage (#1025) --- azure-pipelines-release.yml | 19 ++++++++++++++++++- .../DurableTask.AzureStorage.csproj | 9 +++++++-- src/DurableTask.Core/DurableTask.Core.csproj | 9 +++++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/azure-pipelines-release.yml b/azure-pipelines-release.yml index aa2f0cfec..f17bd9320 100644 --- a/azure-pipelines-release.yml +++ b/azure-pipelines-release.yml @@ -1,4 +1,6 @@ -trigger: none +trigger: +- main + pr: none pool: @@ -6,6 +8,21 @@ pool: demands: - ImageOverride -equals MMS2022TLS +variables: + + - name: VersionSuffix + # The `Build.Reason` env var gets populated with `IndividualCI` on an automatic run of the CI, + # such as when a commit is made to `main`. If the CI is manually run, it will get populated with + # "Manual". For more details on these `Build.X` vars, see: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services + ${{ if eq(variables['Build.Reason'], 'IndividualCI') }}: + # The `Build.BuildNumber` env var is an automatically-generated "build ID" + # for any given ADO run. It is usually the date format yyddmm. where + # `yyddmm` is a date formatter, and is a daily counter in case of multiple + # builds on the same date. + value: 'ci.$(Build.BuildNumber)' + ${{ else }}: + value: '' + steps: # Start by restoring all the dependencies. This needs to be its own task # from what I can tell. We specifically only target DurableTask.AzureStorage diff --git a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj index 7e281163d..be5b6e2bb 100644 --- a/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj +++ b/src/DurableTask.AzureStorage/DurableTask.AzureStorage.csproj @@ -22,16 +22,21 @@ 1 17 1 - $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 $(VersionPrefix).$(FileVersionRevision) $(MajorVersion).$(MinorVersion).0.0 - + + + + $(VersionPrefix) + + $(VersionPrefix)-$(VersionSuffix) + diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 94483e90c..536dfc22b 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -19,16 +19,21 @@ 2 16 2 - $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 $(VersionPrefix).$(FileVersionRevision) $(MajorVersion).$(MinorVersion).0.0 - + + + + $(VersionPrefix) + + $(VersionPrefix)-$(VersionSuffix) + From e0731b6e93b01e359a3b1d81f8d73710420dde13 Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Fri, 5 Apr 2024 13:06:43 -0700 Subject: [PATCH 32/36] Change AzureStorageOrchestrationService.CreateTaskOrchestrationAsync to throw OrchestrationAlreadyExistsException (#1060) --- .../AzureStorageOrchestrationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs b/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs index 9f5d15047..ebe7c219a 100644 --- a/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs +++ b/src/DurableTask.AzureStorage/AzureStorageOrchestrationService.cs @@ -1690,7 +1690,7 @@ public async Task CreateTaskOrchestrationAsync(TaskMessage creationMessage, Orch // An instance in this state already exists. if (this.settings.ThrowExceptionOnInvalidDedupeStatus) { - throw new InvalidOperationException($"An Orchestration instance with the status {existingInstance.State.OrchestrationStatus} already exists."); + throw new OrchestrationAlreadyExistsException($"An Orchestration instance with the status {existingInstance.State.OrchestrationStatus} already exists."); } return; From b06f7b569b6662e0cc45d30be81bf8ed36d4ffbf Mon Sep 17 00:00:00 2001 From: Nate Lehman Date: Fri, 19 Apr 2024 18:43:01 -0400 Subject: [PATCH 33/36] Migrate DurableTask.ServiceBus ServiceBus SDK from Microsoft.Azure.ServiceBus to Azure.Messaging.ServiceBus (#1014) Co-authored-by: Nate Lehman --- .../Abstraction/ServiceBusAbstraction.cs | 488 ++++++++++++------ .../Common/ServiceBusUtils.cs | 8 +- .../DurableTask.ServiceBus.csproj | 6 +- .../ServiceBusOrchestrationService.cs | 82 +-- .../Settings/ServiceBusConnectionSettings.cs | 23 +- .../DispatcherTests.cs | 6 + .../DurableTask.ServiceBus.Tests.csproj | 3 +- .../ErrorHandlingTests.cs | 3 + 8 files changed, 414 insertions(+), 205 deletions(-) diff --git a/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs b/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs index 0b18a4910..779f95c9d 100644 --- a/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs +++ b/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs @@ -8,6 +8,7 @@ namespace DurableTask.ServiceBus.Common.Abstraction using System.Runtime.Serialization; using System.Threading.Tasks; using System.Xml; + using DurableTask.ServiceBus.Tracking; #if !NETSTANDARD2_0 using Microsoft.ServiceBus.Messaging; @@ -119,50 +120,60 @@ public override void WriteStartObject(XmlDictionaryWriter writer, object graph) /// public class IMessageSession { - Microsoft.Azure.ServiceBus.IMessageSession session; + Azure.Messaging.ServiceBus.ServiceBusSessionReceiver sessionReceiver; - public IMessageSession(Microsoft.Azure.ServiceBus.IMessageSession session) + public IMessageSession(Azure.Messaging.ServiceBus.ServiceBusSessionReceiver sessionReceiver) { - this.session = session; + this.sessionReceiver = sessionReceiver; } - public string SessionId => this.session.SessionId; + public string SessionId => this.sessionReceiver.SessionId; - public DateTime LockedUntilUtc => this.session.LockedUntilUtc; + public DateTime LockedUntilUtc => this.sessionReceiver.SessionLockedUntil.UtcDateTime; public async Task GetStateAsync() { - return await this.session.GetStateAsync(); + return (await this.sessionReceiver.GetSessionStateAsync())?.ToArray(); } public async Task SetStateAsync(byte[] sessionState) { - await this.session.SetStateAsync(sessionState); + if (sessionState == null) + { + await this.sessionReceiver.SetSessionStateAsync(new BinaryData(new byte[] { })); + } + else + { + await this.sessionReceiver.SetSessionStateAsync(new BinaryData(sessionState)); + } } public async Task RenewSessionLockAsync() { - await this.session.RenewSessionLockAsync(); + await this.sessionReceiver.RenewSessionLockAsync(); } - public async Task AbandonAsync(string lockToken) + public async Task AbandonAsync(Message message) { - await this.session.AbandonAsync(lockToken); + await this.sessionReceiver.AbandonMessageAsync(message); } public async Task> ReceiveAsync(int maxMessageCount) { - return (await this.session.ReceiveAsync(maxMessageCount)).Select(x => (Message)x).ToList(); + return (await this.sessionReceiver.ReceiveMessagesAsync(maxMessageCount)).Select(x => (Message)x).ToList(); } - public async Task CompleteAsync(IEnumerable lockTokens) + public async Task CompleteAsync(IEnumerable messages) { - await this.session.CompleteAsync(lockTokens); + foreach (var message in messages) + { + await this.sessionReceiver.CompleteMessageAsync(message); + } } public async Task CloseAsync() { - await this.session.CloseAsync(); + await this.sessionReceiver.CloseAsync(); } #else public class IMessageSession @@ -213,9 +224,9 @@ public async Task RenewSessionLockAsync() await this.session.RenewLockAsync(); } - public async Task AbandonAsync(string lockToken) + public async Task AbandonAsync(Message message) { - await this.session.AbandonAsync(Guid.Parse(lockToken)); + await this.session.AbandonAsync(message.SystemProperties.LockToken); } public async Task> ReceiveAsync(int maxMessageCount) @@ -223,9 +234,9 @@ public async Task> ReceiveAsync(int maxMessageCount) return (await this.session.ReceiveBatchAsync(maxMessageCount)).Select(x => (Message)x).ToList(); } - public async Task CompleteAsync(IEnumerable lockTokens) + public async Task CompleteAsync(IEnumerable messages) { - await this.session.CompleteBatchAsync(lockTokens.Select(Guid.Parse)); + await this.session.CompleteBatchAsync(messages.Select(m => m.SystemProperties.LockToken).ToList()); } public async Task CloseAsync() @@ -237,59 +248,175 @@ public async Task CloseAsync() } #if NETSTANDARD2_0 + public abstract class Union + { + public abstract T Match(Func f, Func g); + + public abstract void Switch(Action f, Action g); + + private Union() { } + + public sealed class Case1 : Union + { + public readonly A Item; + public Case1(A item) : base() { this.Item = item; } + public override T Match(Func f, Func g) + { + return f(Item); + } + public override void Switch(Action f, Action g) + { + f(Item); + } + } + + public sealed class Case2 : Union + { + public readonly B Item; + public Case2(B item) { this.Item = item; } + public override T Match(Func f, Func g) + { + return g(Item); + } + public override void Switch(Action f, Action g) + { + g(Item); + } + } + } + /// public class Message { - Microsoft.Azure.ServiceBus.Message msg; + private readonly Union message; + + public Message(Azure.Messaging.ServiceBus.ServiceBusMessage msg) + { + this.message = new Union.Case1(msg); + this.SystemProperties = new SystemPropertiesCollection(message); + } - public Message(Microsoft.Azure.ServiceBus.Message msg) + public Message(Azure.Messaging.ServiceBus.ServiceBusReceivedMessage msg) { - this.msg = msg; + this.message = new Union.Case2(msg); + this.SystemProperties = new SystemPropertiesCollection(message); } - public static implicit operator Message(Microsoft.Azure.ServiceBus.Message m) + public static implicit operator Message(Azure.Messaging.ServiceBus.ServiceBusMessage m) { return m == null ? null : new Message(m); } - public static implicit operator Microsoft.Azure.ServiceBus.Message(Message m) + public static implicit operator Azure.Messaging.ServiceBus.ServiceBusMessage(Message m) { - return m.msg; + return m.message.Match( + m => m, + rm => new Azure.Messaging.ServiceBus.ServiceBusMessage(rm)); + } + + public static implicit operator Message(Azure.Messaging.ServiceBus.ServiceBusReceivedMessage m) + { + return m == null ? null : new Message(m); + } + + public static implicit operator Azure.Messaging.ServiceBus.ServiceBusReceivedMessage(Message m) + { + return m.message.Match( + m => throw NotReceivedMessagePropertyGetException(), + rm => rm); } public Message() { - this.msg = new Microsoft.Azure.ServiceBus.Message(); + this.message = new Union.Case1(new Azure.Messaging.ServiceBus.ServiceBusMessage()); + this.SystemProperties = new SystemPropertiesCollection(message); } public Message(byte[] serializableObject) { - this.msg = new Microsoft.Azure.ServiceBus.Message(serializableObject); + this.message = new Union.Case1(new Azure.Messaging.ServiceBus.ServiceBusMessage(new BinaryData(serializableObject))); + this.SystemProperties = new SystemPropertiesCollection(message); } public string MessageId { - get => this.msg?.MessageId; - set => this.msg.MessageId = value; + get => this.message?.Match( + m => m.MessageId, + rm => rm.MessageId); + set => this.message.Switch( + m => { m.MessageId = value; }, + rm => throw ReceivedMessagePropertySetException()); } public DateTime ScheduledEnqueueTimeUtc { - get => this.msg.ScheduledEnqueueTimeUtc; - set => this.msg.ScheduledEnqueueTimeUtc = value; + get => this.message.Match( + m => m.ScheduledEnqueueTime.UtcDateTime, + rm => rm.ScheduledEnqueueTime.UtcDateTime); + set => this.message.Switch( + m => { m.ScheduledEnqueueTime = new DateTimeOffset(value); }, + rm => throw ReceivedMessagePropertySetException()); } - public Microsoft.Azure.ServiceBus.Message.SystemPropertiesCollection SystemProperties => this.msg.SystemProperties; + public SystemPropertiesCollection SystemProperties { get; private set; } - public IDictionary UserProperties => this.msg.UserProperties; + public IDictionary UserProperties => this.message.Match( + m => m.ApplicationProperties, + rm => (IDictionary)rm.ApplicationProperties); - public byte[] Body => this.msg.Body; + public byte[] Body => this.message.Match( + m => m.Body.ToArray(), + rm => rm.Body.ToArray()); public string SessionId { - get => this.msg?.SessionId; - set => this.msg.SessionId = value; + get => this.message?.Match( + m => m.SessionId, + rm => rm.SessionId); + set => this.message.Switch( + m => { m.SessionId = value; }, + rm => throw ReceivedMessagePropertySetException()); + } + + private static Exception NotReceivedMessagePropertyGetException() + { + return new InvalidOperationException("The property cannot be accessed because the message is not received."); + } + + private static Exception ReceivedMessagePropertySetException() + { + return new InvalidOperationException("The property cannot be set because the message is received and the value is readonly."); + } + + public class SystemPropertiesCollection + { + private readonly Union msg; + + public SystemPropertiesCollection(Union msg) + { + this.msg = msg; + } + + public Guid LockToken => this.msg.Match( + _ => throw NotReceivedMessagePropertyGetException(), + rm => Guid.Parse(rm.LockToken)); + + public int DeliveryCount => this.msg.Match( + _ => throw NotReceivedMessagePropertyGetException(), + rm => rm.DeliveryCount); + + public DateTime LockedUntilUtc => this.msg.Match( + _ => throw NotReceivedMessagePropertyGetException(), + rm => rm.LockedUntil.UtcDateTime); + + public long SequenceNumber => this.msg.Match( + _ => throw NotReceivedMessagePropertyGetException(), + rm => rm.SequenceNumber); + + public DateTime EnqueuedTimeUtc => this.msg.Match( + _ => throw NotReceivedMessagePropertyGetException(), + rm => rm.EnqueuedTime.UtcDateTime); } #else @@ -426,7 +553,7 @@ public SystemPropertiesCollection(BrokeredMessage brokered) #if NETSTANDARD2_0 /// - public abstract class RetryPolicy : Microsoft.Azure.ServiceBus.RetryPolicy + public abstract class RetryPolicy : Azure.Messaging.ServiceBus.ServiceBusRetryPolicy { #else @@ -456,32 +583,48 @@ public static implicit operator Microsoft.ServiceBus.RetryPolicy(RetryPolicy rp) #if NETSTANDARD2_0 /// - public class ServiceBusConnection : Microsoft.Azure.ServiceBus.ServiceBusConnection + public class ServiceBusConnection { + private readonly Dictionary sendViaEntityScopedServiceBusClients; + private readonly Func serviceBusClientFactory; + public ServiceBusConnection(ServiceBusConnectionStringBuilder connectionStringBuilder) - : base(connectionStringBuilder) { - } + var options = new Azure.Messaging.ServiceBus.ServiceBusClientOptions + { + EnableCrossEntityTransactions = true, + }; - public ServiceBusConnection(string namespaceConnectionString) - : base(namespaceConnectionString) - { + sendViaEntityScopedServiceBusClients = new Dictionary(); + serviceBusClientFactory = () => new Azure.Messaging.ServiceBus.ServiceBusClient( + connectionStringBuilder.ConnectionString, + options); } - public ServiceBusConnection(string namespaceConnectionString, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(namespaceConnectionString, retryPolicy) + public ServiceBusConnection(string endpoint, Azure.Messaging.ServiceBus.ServiceBusTransportType transportType, Azure.Core.TokenCredential tokenCredential, RetryPolicy retryPolicy = null) { - } + var options = new Azure.Messaging.ServiceBus.ServiceBusClientOptions + { + EnableCrossEntityTransactions = true, + }; - [Obsolete] - public ServiceBusConnection(string namespaceConnectionString, TimeSpan operationTimeout, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(namespaceConnectionString, operationTimeout, retryPolicy) - { + sendViaEntityScopedServiceBusClients = new Dictionary(); + serviceBusClientFactory = () => new Azure.Messaging.ServiceBus.ServiceBusClient( + endpoint, + tokenCredential, + options); } - public ServiceBusConnection(string endpoint, Microsoft.Azure.ServiceBus.TransportType transportType, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(endpoint, transportType, retryPolicy) + public Azure.Messaging.ServiceBus.ServiceBusClient GetSendViaEntityScopedClient(string sendViaEntity) { + if (sendViaEntityScopedServiceBusClients.TryGetValue(sendViaEntity, out var client)) + { + return client; + } + + var newClient = serviceBusClientFactory(); + sendViaEntityScopedServiceBusClients.Add(sendViaEntity, newClient); + return newClient; } #else public class ServiceBusConnection @@ -500,12 +643,21 @@ public ServiceBusConnection(ServiceBusConnectionStringBuilder connectionStringBu #if NETSTANDARD2_0 /// - public class ServiceBusConnectionStringBuilder : Microsoft.Azure.ServiceBus.ServiceBusConnectionStringBuilder + public class ServiceBusConnectionStringBuilder { + public string ConnectionString { get; set; } + + public Azure.Messaging.ServiceBus.ServiceBusConnectionStringProperties ConnectionStringProperties { get; set; } + public ServiceBusConnectionStringBuilder(string connectionString) - : base(connectionString) { + ConnectionString = connectionString; + ConnectionStringProperties = Azure.Messaging.ServiceBus.ServiceBusConnectionStringProperties.Parse(ConnectionString); } + + public string SasKeyName => ConnectionStringProperties.SharedAccessKeyName; + + public string SasKey => ConnectionStringProperties.SharedAccessKey; #else public class ServiceBusConnectionStringBuilder : Microsoft.ServiceBus.ServiceBusConnectionStringBuilder { @@ -522,30 +674,6 @@ public ServiceBusConnectionStringBuilder(string connectionString) } #if NETSTANDARD2_0 - /// - public class TokenProvider : Microsoft.Azure.ServiceBus.Primitives.ITokenProvider - { - private readonly Microsoft.Azure.ServiceBus.Primitives.TokenProvider tokenProvider; - - public TokenProvider(Microsoft.Azure.ServiceBus.Primitives.TokenProvider t) - { - this.tokenProvider = t; - } - - public static implicit operator TokenProvider(Microsoft.Azure.ServiceBus.Primitives.TokenProvider t) - { - return new TokenProvider(t); - } - - public async Task GetTokenAsync(string appliesTo, TimeSpan timeout) - { - return await this.tokenProvider.GetTokenAsync(appliesTo, timeout); - } - - public static TokenProvider CreateSharedAccessSignatureTokenProvider(string keyName, string sharedAccessKey, TimeSpan tokenTimeToLive) - { - return Microsoft.Azure.ServiceBus.Primitives.TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, sharedAccessKey, tokenTimeToLive); - } #else public class TokenProvider { @@ -570,46 +698,44 @@ public static TokenProvider CreateSharedAccessSignatureTokenProvider(string keyN { return Microsoft.ServiceBus.TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, sharedAccessKey, tokenTimeToLive); } -#endif } +#endif #if NETSTANDARD2_0 /// - public class MessageSender : Microsoft.Azure.ServiceBus.Core.MessageSender + public class MessageSender { - public MessageSender(ServiceBusConnectionStringBuilder connectionStringBuilder, RetryPolicy retryPolicy = null) - : base(connectionStringBuilder, retryPolicy) - { - } - - public MessageSender(string connectionString, string entityPath, RetryPolicy retryPolicy = null) - : base(connectionString, entityPath, retryPolicy) - { - } - - public MessageSender(string endpoint, string entityPath, Microsoft.Azure.ServiceBus.Primitives.ITokenProvider tokenProvider, Microsoft.Azure.ServiceBus.TransportType transportType = Microsoft.Azure.ServiceBus.TransportType.Amqp, RetryPolicy retryPolicy = null) - : base(endpoint, entityPath, tokenProvider, transportType, retryPolicy) - { - } + private readonly Azure.Messaging.ServiceBus.ServiceBusSender sender; public MessageSender(ServiceBusConnection serviceBusConnection, string entityPath, RetryPolicy retryPolicy = null) - : base(serviceBusConnection, entityPath, retryPolicy) { + sender = serviceBusConnection.GetSendViaEntityScopedClient(entityPath).CreateSender(entityPath); } public MessageSender(ServiceBusConnection serviceBusConnection, string entityPath, string viaEntityPath, RetryPolicy retryPolicy = null) - : base(serviceBusConnection, entityPath, viaEntityPath, retryPolicy) { + sender = serviceBusConnection.GetSendViaEntityScopedClient(viaEntityPath).CreateSender(entityPath); } public async Task SendAsync(Message message) { - await base.SendAsync(message); + await sender.SendMessageAsync(message); } public async Task SendAsync(IEnumerable messageList) { - await base.SendAsync(messageList.Select(x => (Microsoft.Azure.ServiceBus.Message)x).ToList()); + var batch = await sender.CreateMessageBatchAsync(); + foreach (var message in messageList) + { + batch.TryAddMessage(message); + } + + await sender.SendMessagesAsync(batch); + } + + public async Task CloseAsync() + { + await sender.CloseAsync(); } @@ -676,26 +802,43 @@ public async Task CloseAsync() #if NETSTANDARD2_0 /// - public class MessageReceiver : Microsoft.Azure.ServiceBus.Core.MessageReceiver + public class MessageReceiver { - public MessageReceiver(Microsoft.Azure.ServiceBus.ServiceBusConnectionStringBuilder connectionStringBuilder, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null, int prefetchCount = 0) - : base(connectionStringBuilder, receiveMode, retryPolicy, prefetchCount) + private readonly Azure.Messaging.ServiceBus.ServiceBusReceiver receiver; + + public MessageReceiver(ServiceBusConnection serviceBusConnection, string entityPath, Azure.Messaging.ServiceBus.ServiceBusReceiveMode receiveMode = Azure.Messaging.ServiceBus.ServiceBusReceiveMode.PeekLock, RetryPolicy retryPolicy = null, int prefetchCount = 0) { + var options = new Azure.Messaging.ServiceBus.ServiceBusReceiverOptions + { + ReceiveMode = receiveMode, + PrefetchCount = prefetchCount + }; + this.receiver = serviceBusConnection.GetSendViaEntityScopedClient(entityPath).CreateReceiver(entityPath, options); } - public MessageReceiver(string connectionString, string entityPath, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null, int prefetchCount = 0) - : base(connectionString, entityPath, receiveMode, retryPolicy, prefetchCount) + public async Task ReceiveAsync(TimeSpan serverWaitTime) { + return await this.receiver.ReceiveMessageAsync(serverWaitTime); } - public MessageReceiver(string endpoint, string entityPath, Microsoft.Azure.ServiceBus.Primitives.ITokenProvider tokenProvider, Microsoft.Azure.ServiceBus.TransportType transportType = Microsoft.Azure.ServiceBus.TransportType.Amqp, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null, int prefetchCount = 0) - : base(endpoint, entityPath, tokenProvider, transportType, receiveMode, retryPolicy, prefetchCount) + public async Task RenewLockAsync(Message message) { + await this.receiver.RenewMessageLockAsync(message); } - public MessageReceiver(Microsoft.Azure.ServiceBus.ServiceBusConnection serviceBusConnection, string entityPath, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null, int prefetchCount = 0) - : base(serviceBusConnection, entityPath, receiveMode, retryPolicy, prefetchCount) + public async Task CompleteAsync(Message message) + { + await this.receiver.CompleteMessageAsync(message); + } + + public async Task CloseAsync() { + await this.receiver.CloseAsync(); + } + + public async Task AbandonAsync(Message message) + { + await this.receiver.AbandonMessageAsync(message); } #else @@ -736,9 +879,9 @@ public static implicit operator MessageReceiver(Microsoft.ServiceBus.Messaging.M return new MessageReceiver(mr); } - public async Task AbandonAsync(Guid lockToken) + public async Task AbandonAsync(Message message) { - await this.msgReceiver.AbandonAsync(lockToken); + await this.msgReceiver.AbandonAsync(message.SystemProperties.LockToken); } public async Task CloseAsync() @@ -746,9 +889,9 @@ public async Task CloseAsync() await this.msgReceiver.CloseAsync(); } - public async Task CompleteAsync(Guid lockToken) + public async Task CompleteAsync(Message message) { - await this.msgReceiver.CompleteAsync(lockToken); + await this.msgReceiver.CompleteAsync(message.SystemProperties.LockToken); } public async Task ReceiveAsync(TimeSpan serverWaitTime) @@ -766,31 +909,23 @@ public async Task RenewLockAsync(Message message) #if NETSTANDARD2_0 /// - public class QueueClient : Microsoft.Azure.ServiceBus.QueueClient + public class QueueClient { - public QueueClient(Microsoft.Azure.ServiceBus.ServiceBusConnectionStringBuilder connectionStringBuilder, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(connectionStringBuilder, receiveMode, retryPolicy) - { - } + private readonly Azure.Messaging.ServiceBus.ServiceBusSender sender; - public QueueClient(string connectionString, string entityPath, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(connectionString, entityPath, receiveMode, retryPolicy) + public QueueClient(ServiceBusConnection serviceBusConnection, string entityPath) { + sender = serviceBusConnection.GetSendViaEntityScopedClient(entityPath).CreateSender(entityPath); } - public QueueClient(string endpoint, string entityPath, Microsoft.Azure.ServiceBus.Primitives.ITokenProvider tokenProvider, Microsoft.Azure.ServiceBus.TransportType transportType = Microsoft.Azure.ServiceBus.TransportType.Amqp, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode = Microsoft.Azure.ServiceBus.ReceiveMode.PeekLock, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy = null) - : base(endpoint, entityPath, tokenProvider, transportType, receiveMode, retryPolicy) - { - } - - public QueueClient(Microsoft.Azure.ServiceBus.ServiceBusConnection serviceBusConnection, string entityPath, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode, Microsoft.Azure.ServiceBus.RetryPolicy retryPolicy) - : base(serviceBusConnection, entityPath, receiveMode, retryPolicy) + public async Task SendAsync(List messageList) { + await sender.SendMessagesAsync(messageList.Select(m => (Azure.Messaging.ServiceBus.ServiceBusMessage)m).ToList()); } - public async Task SendAsync(List messageList) + public async Task SendAsync(Message message) { - await SendAsync(messageList.Select(x => (Microsoft.Azure.ServiceBus.Message)x).ToList()); + await sender.SendMessageAsync((Azure.Messaging.ServiceBus.ServiceBusMessage)message); } #else @@ -857,22 +992,75 @@ public async Task AcceptMessageSessionAsync(TimeSpan operationT } #if NETSTANDARD2_0 + public class QueueDescription + { + private readonly Union propertiesUnion; + + public QueueDescription(Azure.Messaging.ServiceBus.Administration.QueueProperties queueProperties) + { + this.propertiesUnion = new Union.Case1(queueProperties); + } + + public QueueDescription(Azure.Messaging.ServiceBus.Administration.QueueRuntimeProperties queueRuntimeProperties) + { + this.propertiesUnion = new Union.Case2(queueRuntimeProperties); + } + + public long MessageCount => this.propertiesUnion.Match( + _ => throw NotRuntimePropertiesGetException(), + runtimeProps => runtimeProps.TotalMessageCount); + + public string Path => this.propertiesUnion.Match( + props => props.Name, + runtimeProps => runtimeProps.Name); + + public int MaxDeliveryCount => this.propertiesUnion.Match( + props => props.MaxDeliveryCount, + _ => throw RuntimePropertiesGetException()); + + public long SizeInBytes => this.propertiesUnion.Match( + _ => throw NotRuntimePropertiesGetException(), + runtimeProps => runtimeProps.SizeInBytes); + + private static Exception RuntimePropertiesGetException() + { + return new InvalidOperationException($"The property cannot be accessed because the underlying object is {nameof(Azure.Messaging.ServiceBus.Administration.QueueRuntimeProperties)}"); + } + + private static Exception NotRuntimePropertiesGetException() + { + return new InvalidOperationException($"The property cannot be accessed because the underlying object is {nameof(Azure.Messaging.ServiceBus.Administration.QueueProperties)}"); + } + } + /// - public class ManagementClient : Microsoft.Azure.ServiceBus.Management.ManagementClient + public class ManagementClient : Azure.Messaging.ServiceBus.Administration.ServiceBusAdministrationClient { public ManagementClient(string connectionString) : base(connectionString) { } - public ManagementClient(string endpoint, Microsoft.Azure.ServiceBus.Primitives.ITokenProvider tokenProvider) - : base(endpoint, tokenProvider) + public ManagementClient(string endpoint, Azure.Core.TokenCredential tokenCredential) + : base(endpoint, tokenCredential) { } - public ManagementClient(Microsoft.Azure.ServiceBus.ServiceBusConnectionStringBuilder connectionStringBuilder, Microsoft.Azure.ServiceBus.Primitives.ITokenProvider tokenProvider = null) - : base(connectionStringBuilder, tokenProvider) + public async Task GetQueueRuntimeInfoAsync(string name) { + var response = await this.GetQueueRuntimePropertiesAsync(name); + return new QueueDescription(response.Value); + } + + public async Task> GetQueuesAsync() + { + List queueDescriptions = new List(); + await foreach (var queueProperties in base.GetQueuesAsync()) + { + queueDescriptions.Add(new QueueDescription(queueProperties)); + } + + return queueDescriptions; } #else public class ManagementClient @@ -919,40 +1107,38 @@ public async Task> GetQueuesAsync() #if NETSTANDARD2_0 public class SessionClient { - Microsoft.Azure.ServiceBus.SessionClient sessionClient; + private readonly Azure.Messaging.ServiceBus.ServiceBusClient serviceBusClient; + private readonly string entityPath; + private readonly Azure.Messaging.ServiceBus.ServiceBusReceiveMode receiveMode; - public SessionClient(ServiceBusConnection serviceBusConnection, string entityPath, Microsoft.Azure.ServiceBus.ReceiveMode receiveMode) + public SessionClient(ServiceBusConnection serviceBusConnection, string entityPath, Azure.Messaging.ServiceBus.ServiceBusReceiveMode receiveMode) { - this.sessionClient = new Microsoft.Azure.ServiceBus.SessionClient(serviceBusConnection, entityPath, receiveMode); - } - - public SessionClient(Microsoft.Azure.ServiceBus.SessionClient sessionClient) - { - this.sessionClient = sessionClient; - } - - public static implicit operator SessionClient(Microsoft.Azure.ServiceBus.SessionClient sc) - { - return new SessionClient(sc); - } - - public async Task CloseAsync() - { - await this.sessionClient.CloseAsync(); + this.entityPath = entityPath; + this.receiveMode = receiveMode; + this.serviceBusClient = serviceBusConnection.GetSendViaEntityScopedClient(entityPath); } public async Task AcceptMessageSessionAsync(TimeSpan operationTimeout) { try { - return new IMessageSession(await this.sessionClient.AcceptMessageSessionAsync(operationTimeout)); + var options = new Azure.Messaging.ServiceBus.ServiceBusSessionReceiverOptions + { + ReceiveMode = receiveMode, + }; + return new IMessageSession(await this.serviceBusClient.AcceptNextSessionAsync(entityPath, options)); } - catch (Microsoft.Azure.ServiceBus.ServiceBusTimeoutException) + catch (Azure.Messaging.ServiceBus.ServiceBusException e) when (e.Reason.Equals(Azure.Messaging.ServiceBus.ServiceBusFailureReason.ServiceTimeout)) { return null; } } + public Task CloseAsync() + { + return Task.CompletedTask; + } + #else public class SessionClient : QueueClient { diff --git a/src/DurableTask.ServiceBus/Common/ServiceBusUtils.cs b/src/DurableTask.ServiceBus/Common/ServiceBusUtils.cs index aa0b540e8..cc9472a1a 100644 --- a/src/DurableTask.ServiceBus/Common/ServiceBusUtils.cs +++ b/src/DurableTask.ServiceBus/Common/ServiceBusUtils.cs @@ -28,9 +28,6 @@ namespace DurableTask.ServiceBus.Common.Abstraction using DurableTask.Core.Tracking; using DurableTask.ServiceBus.Settings; using Newtonsoft.Json; -#if NETSTANDARD2_0 - using Microsoft.Azure.ServiceBus.InteropExtensions; -#endif internal static class ServiceBusUtils { @@ -60,7 +57,7 @@ public static async Task GetBrokeredMessageFromObjectAsync( #if NETSTANDARD2_0 using (var ms = new MemoryStream()) { - var serialiser = (XmlObjectSerializer)typeof(DataContractBinarySerializer<>) + var serialiser = (XmlObjectSerializer)typeof(DataContractSerializer) .MakeGenericType(serializableObject.GetType()) .GetField("Instance") ?.GetValue(null); @@ -216,8 +213,9 @@ public static async Task GetObjectFromBrokeredMessageAsync(Message message { // no compression, legacy style #if NETSTANDARD2_0 + var dataContractSerializer = new DataContractSerializer(typeof(T)); using (var ms = new MemoryStream(message.Body)) - deserializedObject = (T)DataContractBinarySerializer.Instance.ReadObject(ms); + deserializedObject = (T)dataContractSerializer.ReadObject(ms); #else deserializedObject = message.GetBody(); #endif diff --git a/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj b/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj index a55f5fa8b..93096f69f 100644 --- a/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj +++ b/src/DurableTask.ServiceBus/DurableTask.ServiceBus.csproj @@ -8,8 +8,8 @@ - 2 - 7 + 3 + 0 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) @@ -36,7 +36,7 @@ - + diff --git a/src/DurableTask.ServiceBus/ServiceBusOrchestrationService.cs b/src/DurableTask.ServiceBus/ServiceBusOrchestrationService.cs index 907054c60..3d49bb749 100644 --- a/src/DurableTask.ServiceBus/ServiceBusOrchestrationService.cs +++ b/src/DurableTask.ServiceBus/ServiceBusOrchestrationService.cs @@ -35,21 +35,19 @@ namespace DurableTask.ServiceBus using DurableTask.ServiceBus.Tracking; using Message = DurableTask.ServiceBus.Common.Abstraction.Message; using IMessageSession = DurableTask.ServiceBus.Common.Abstraction.IMessageSession; - using RetryPolicy = DurableTask.ServiceBus.Common.Abstraction.RetryPolicy; using MessageSender = DurableTask.ServiceBus.Common.Abstraction.MessageSender; using MessageReceiver = DurableTask.ServiceBus.Common.Abstraction.MessageReceiver; using QueueClient = DurableTask.ServiceBus.Common.Abstraction.QueueClient; using SessionClient = DurableTask.ServiceBus.Common.Abstraction.SessionClient; using ServiceBusConnection = DurableTask.ServiceBus.Common.Abstraction.ServiceBusConnection; - using TokenProvider = DurableTask.ServiceBus.Common.Abstraction.TokenProvider; using ManagementClient = DurableTask.ServiceBus.Common.Abstraction.ManagementClient; using ServiceBusConnectionStringBuilder = DurableTask.ServiceBus.Common.Abstraction.ServiceBusConnectionStringBuilder; #if NETSTANDARD2_0 - using Microsoft.Azure.ServiceBus; - using Microsoft.Azure.ServiceBus.Management; - using Microsoft.Azure.ServiceBus.Primitives; + using Azure.Core; + using ReceiveMode = Azure.Messaging.ServiceBus.ServiceBusReceiveMode; #else using Microsoft.ServiceBus.Messaging; + using RetryPolicy = DurableTask.ServiceBus.Common.Abstraction.RetryPolicy; #endif /// @@ -92,7 +90,7 @@ public class ServiceBusOrchestrationService : IOrchestrationService, IOrchestrat readonly string hubName; MessageSender orchestratorSender; - readonly MessageSender orchestrationBatchMessageSender; + readonly MessageSender orchestratorBatchMessageSender; QueueClient orchestratorQueueClient; MessageSender workerSender; MessageSender trackingSender; @@ -117,20 +115,20 @@ public class ServiceBusOrchestrationService : IOrchestrationService, IOrchestrat /// Create a new ServiceBusOrchestrationService to the given service bus namespace and hub name /// /// Service Bus namespace host name - /// Service Bus authentication token provider + /// Service Bus authentication token credential /// Hub name to use with the Service Bus namespace /// Instance store Provider, where state and history messages will be stored /// Blob store Provider, where oversized messages and sessions will be stored /// Settings object for service and client public ServiceBusOrchestrationService( string namespaceHostName, - ITokenProvider tokenProvider, + TokenCredential tokenCredential, string hubName, IOrchestrationServiceInstanceStore instanceStore, IOrchestrationServiceBlobStore blobStore, ServiceBusOrchestrationServiceSettings settings) : this( - ServiceBusConnectionSettings.Create(namespaceHostName, tokenProvider), + ServiceBusConnectionSettings.Create(namespaceHostName, tokenCredential), hubName, instanceStore, blobStore, @@ -189,19 +187,21 @@ public ServiceBusOrchestrationService( if (!string.IsNullOrEmpty(connectionSettings.ConnectionString)) { var sbConnectionStringBuilder = new ServiceBusConnectionStringBuilder(connectionSettings.ConnectionString); +#if NETSTANDARD2_0 + this.serviceBusConnection = new ServiceBusConnection(sbConnectionStringBuilder); +#else this.serviceBusConnection = new ServiceBusConnection(sbConnectionStringBuilder) { TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sbConnectionStringBuilder.SasKeyName, - sbConnectionStringBuilder.SasKey, ServiceBusUtils.TokenTimeToLive) + sbConnectionStringBuilder.SasKey, ServiceBusUtils.TokenTimeToLive), }; +#endif } #if NETSTANDARD2_0 - else if (connectionSettings.Endpoint != null && connectionSettings.TokenProvider != null) + else if (connectionSettings.Endpoint != null && connectionSettings.TokenCredential != null) { - this.serviceBusConnection = new ServiceBusConnection(connectionSettings.Endpoint.ToString(), connectionSettings.TransportType) - { - TokenProvider = connectionSettings.TokenProvider - }; + + this.serviceBusConnection = new ServiceBusConnection(connectionSettings.Endpoint.Host, connectionSettings.TransportType, connectionSettings.TokenCredential); } #endif else @@ -210,7 +210,7 @@ public ServiceBusOrchestrationService( } this.Settings = settings ?? new ServiceBusOrchestrationServiceSettings(); - this.orchestrationBatchMessageSender = new MessageSender(this.serviceBusConnection, this.orchestratorEntityName); + this.orchestratorBatchMessageSender = new MessageSender(this.serviceBusConnection, this.orchestratorEntityName); this.BlobStore = blobStore; @@ -248,7 +248,11 @@ public async Task StartAsync() this.orchestratorSender = new MessageSender(this.serviceBusConnection, this.orchestratorEntityName, this.workerEntityName); this.workerSender = new MessageSender(this.serviceBusConnection, this.workerEntityName, this.orchestratorEntityName); this.trackingSender = new MessageSender(this.serviceBusConnection, this.trackingEntityName, this.orchestratorEntityName); +#if !NETSTANDARD2_0 this.orchestratorQueueClient = new QueueClient(this.serviceBusConnection, this.orchestratorEntityName, ReceiveMode.PeekLock, RetryPolicy.Default); +#else + this.orchestratorQueueClient = new QueueClient(this.serviceBusConnection, this.orchestratorEntityName); +#endif this.workerReceiver = new MessageReceiver(serviceBusConnection, this.workerEntityName); this.orchestratorSessionClient = new SessionClient(serviceBusConnection, this.orchestratorEntityName, ReceiveMode.PeekLock); this.trackingClient = new SessionClient(serviceBusConnection, this.trackingEntityName, ReceiveMode.PeekLock); @@ -288,7 +292,7 @@ public async Task StopAsync(bool isForced) await Task.WhenAll( this.workerSender.CloseAsync(), this.orchestratorSender.CloseAsync(), - this.orchestrationBatchMessageSender?.CloseAsync(), + this.orchestratorBatchMessageSender?.CloseAsync(), this.trackingSender.CloseAsync(), this.orchestratorSessionClient.CloseAsync(), this.trackingClient.CloseAsync(), @@ -396,7 +400,7 @@ public async Task HubExistsAsync() { ManagementClient managementClient = this.CreateManagementClient(); - IEnumerable queueDescriptions = (await managementClient.GetQueuesAsync()).Where(x => x.Path.StartsWith(this.hubName)).ToList(); + var queueDescriptions = (await managementClient.GetQueuesAsync()).Where(x => x.Path.StartsWith(this.hubName)).ToList(); return queueDescriptions.Any(q => string.Equals(q.Path, this.orchestratorEntityName)) && queueDescriptions.Any(q => string.Equals(q.Path, this.workerEntityName)) @@ -448,7 +452,7 @@ internal async Task> GetHubQueueMaxDeliveryCountsAsync() var result = new Dictionary(3); - IEnumerable queues = + var queues = (await managementClient.GetQueuesAsync()).Where(x => x.Path.StartsWith(this.hubName)).ToList(); result.Add("TaskOrchestration", queues.Single(q => string.Equals(q.Path, this.orchestratorEntityName))?.MaxDeliveryCount ?? -1); @@ -851,7 +855,7 @@ public async Task CompleteTaskOrchestrationWorkItemAsync( return $"Completing orchestration messages sequence and lock tokens: {allIds}"; }); - await session.CompleteAsync(sessionState.LockTokens.Keys); + await session.CompleteAsync(sessionState.LockTokens.Values); this.ServiceStats.OrchestrationDispatcherStats.SessionBatchesCompleted.Increment(); ts.Complete(); } @@ -891,9 +895,9 @@ public async Task AbandonTaskOrchestrationWorkItemAsync(TaskOrchestrationWorkIte } TraceHelper.TraceSession(TraceEventType.Error, "ServiceBusOrchestrationService-AbandonTaskOrchestrationWorkItem", workItem.InstanceId, "Abandoning {0} messages due to work item abort", sessionState.LockTokens.Keys.Count()); - foreach (string lockToken in sessionState.LockTokens.Keys) + foreach (var message in sessionState.LockTokens.Values) { - await sessionState.Session.AbandonAsync(lockToken); + await sessionState.Session.AbandonAsync(message); } try @@ -1039,7 +1043,7 @@ public async Task CompleteTaskActivityWorkItemAsync(TaskActivityWorkItem workIte Transaction.Current.TransactionInformation.LocalIdentifier } - message sequence and lock token: [SEQ: {originalMessage.SystemProperties.SequenceNumber} LT: {originalMessage.SystemProperties.LockToken}]"); - await this.workerReceiver.CompleteAsync(originalMessage.SystemProperties.LockToken); + await this.workerReceiver.CompleteAsync(originalMessage); await this.orchestratorSender.SendAsync(brokeredResponseMessage); ts.Complete(); this.ServiceStats.ActivityDispatcherStats.SessionBatchesCompleted.Increment(); @@ -1059,7 +1063,7 @@ public Task AbandonTaskActivityWorkItemAsync(TaskActivityWorkItem workItem) return message == null ? Task.FromResult(null) - : this.workerReceiver.AbandonAsync(message.SystemProperties.LockToken); + : this.workerReceiver.AbandonAsync(message); } /// @@ -1171,7 +1175,7 @@ public async Task SendTaskOrchestrationMessageBatchAsync(params TaskMessage[] me } Message[] brokeredMessages = await Task.WhenAll(tasks); - await this.orchestrationBatchMessageSender.SendAsync(brokeredMessages).ConfigureAwait(false); + await this.orchestratorBatchMessageSender.SendAsync(brokeredMessages).ConfigureAwait(false); } async Task GetBrokeredMessageAsync(TaskMessage message) @@ -1330,7 +1334,7 @@ static bool IsTransientException(Exception exception) { // TODO : Once we change the exception model, check for inner exception #if NETSTANDARD2_0 - return (exception as ServiceBusException)?.IsTransient ?? false; + return (exception as Azure.Messaging.ServiceBus.ServiceBusException)?.IsTransient ?? false; #else return (exception as MessagingException)?.IsTransient ?? false; #endif @@ -1511,7 +1515,7 @@ async Task ProcessTrackingWorkItemAsync(TrackingWorkItem workItem) } // Cleanup our session - await sessionState.Session.CompleteAsync(sessionState.LockTokens.Keys); + await sessionState.Session.CompleteAsync(sessionState.LockTokens.Values); await sessionState.Session.CloseAsync(); } @@ -1681,11 +1685,19 @@ await Utils.ExecuteWithRetries(async () => { await managementClient.DeleteQueueAsync(path); } +#if !NETSTANDARD2_0 catch (MessagingEntityAlreadyExistsException) +#else + catch (Azure.Messaging.ServiceBus.ServiceBusException e) when (e.Reason.Equals(Azure.Messaging.ServiceBus.ServiceBusFailureReason.MessagingEntityAlreadyExists)) +#endif { await Task.FromResult(0); } +#if !NETSTANDARD2_0 catch (MessagingEntityNotFoundException) +#else + catch (Azure.Messaging.ServiceBus.ServiceBusException e) when (e.Reason.Equals(Azure.Messaging.ServiceBus.ServiceBusFailureReason.MessagingEntityNotFound)) +#endif { await Task.FromResult(0); } @@ -1706,7 +1718,11 @@ await Utils.ExecuteWithRetries(async () => { await CreateQueueAsync(managementClient, path, requiresSessions, requiresDuplicateDetection, maxDeliveryCount, maxSizeInMegabytes); } +#if !NETSTANDARD2_0 catch (MessagingEntityAlreadyExistsException) +#else + catch (Azure.Messaging.ServiceBus.ServiceBusException e) when (e.Reason.Equals(Azure.Messaging.ServiceBus.ServiceBusFailureReason.MessagingEntityAlreadyExists)) +#endif { await Task.FromResult(0); } @@ -1740,17 +1756,17 @@ async Task CreateQueueAsync( throw new ArgumentException($"The specified value {maxSizeInMegabytes} is invalid for the maximum queue size in megabytes.\r\nIt must be one of the following values:\r\n{string.Join(";", ValidQueueSizes)}", nameof(maxSizeInMegabytes)); } +#if NETSTANDARD2_0 + var description = new Azure.Messaging.ServiceBus.Administration.CreateQueueOptions(path) +#else var description = new QueueDescription(path) +#endif { RequiresSession = requiresSessions, MaxDeliveryCount = maxDeliveryCount, RequiresDuplicateDetection = requiresDuplicateDetection, DuplicateDetectionHistoryTimeWindow = TimeSpan.FromHours(DuplicateDetectionWindowInHours), -#if NETSTANDARD2_0 - MaxSizeInMB = maxSizeInMegabytes -#else MaxSizeInMegabytes = maxSizeInMegabytes -#endif }; await managementClient.CreateQueueAsync(description); @@ -1790,9 +1806,9 @@ ManagementClient CreateManagementClient() return new ManagementClient(this.connectionSettings.ConnectionString); } #if NETSTANDARD2_0 - else if (connectionSettings.Endpoint != null && connectionSettings.TokenProvider != null) + else if (connectionSettings.Endpoint != null && connectionSettings.TokenCredential != null) { - return new ManagementClient(connectionSettings.Endpoint.ToString(), connectionSettings.TokenProvider); + return new ManagementClient(connectionSettings.Endpoint.Host, connectionSettings.TokenCredential); } #endif else diff --git a/src/DurableTask.ServiceBus/Settings/ServiceBusConnectionSettings.cs b/src/DurableTask.ServiceBus/Settings/ServiceBusConnectionSettings.cs index c87007656..075207532 100644 --- a/src/DurableTask.ServiceBus/Settings/ServiceBusConnectionSettings.cs +++ b/src/DurableTask.ServiceBus/Settings/ServiceBusConnectionSettings.cs @@ -14,8 +14,7 @@ namespace DurableTask.ServiceBus.Settings { #if NETSTANDARD2_0 - using Microsoft.Azure.ServiceBus; - using Microsoft.Azure.ServiceBus.Primitives; + using Azure.Core; #endif using System; @@ -43,15 +42,15 @@ public static ServiceBusConnectionSettings Create(string connectionString) /// Creates an instance of /// /// Service Bus namespace host name - /// Service Bus authentication token provider + /// Service Bus authentication token credential /// Service Bus messaging protocol /// - public static ServiceBusConnectionSettings Create(string namespaceHostName, ITokenProvider tokenProvider, TransportType transportType = TransportType.Amqp) + public static ServiceBusConnectionSettings Create(string namespaceHostName, TokenCredential tokenCredential, Azure.Messaging.ServiceBus.ServiceBusTransportType transportType = Azure.Messaging.ServiceBus.ServiceBusTransportType.AmqpTcp) { return new ServiceBusConnectionSettings { Endpoint = new Uri($"sb://{namespaceHostName}/"), - TokenProvider = tokenProvider, + TokenCredential = tokenCredential, TransportType = transportType }; } @@ -60,15 +59,15 @@ public static ServiceBusConnectionSettings Create(string namespaceHostName, ITok /// Creates an instance of /// /// Service Bus endpoint - /// Service Bus authentication token provider + /// Service Bus authentication token credential /// Service Bus messaging protocol /// - public static ServiceBusConnectionSettings Create(Uri serviceBusEndpoint, ITokenProvider tokenProvider, TransportType transportType = TransportType.Amqp) + public static ServiceBusConnectionSettings Create(Uri serviceBusEndpoint, TokenCredential tokenCredential, Azure.Messaging.ServiceBus.ServiceBusTransportType transportType = Azure.Messaging.ServiceBus.ServiceBusTransportType.AmqpTcp) { return new ServiceBusConnectionSettings { Endpoint = serviceBusEndpoint, - TokenProvider = tokenProvider, + TokenCredential = tokenCredential, TransportType = transportType }; } @@ -92,14 +91,14 @@ private ServiceBusConnectionSettings() public Uri Endpoint { get; private set; } /// - /// Service Bus authentication token provider + /// Service Bus messaging protocol /// - public ITokenProvider TokenProvider { get; private set; } + public Azure.Messaging.ServiceBus.ServiceBusTransportType TransportType { get; private set; } /// - /// Service Bus messaging protocol + /// Azure.Identity TokenCredential used to authenticate with the service bus /// - public TransportType TransportType { get; private set; } + public TokenCredential TokenCredential { get; private set; } #endif } diff --git a/test/DurableTask.ServiceBus.Tests/DispatcherTests.cs b/test/DurableTask.ServiceBus.Tests/DispatcherTests.cs index 2bd870dea..fe9ad6e36 100644 --- a/test/DurableTask.ServiceBus.Tests/DispatcherTests.cs +++ b/test/DurableTask.ServiceBus.Tests/DispatcherTests.cs @@ -95,6 +95,9 @@ await this.taskHub.AddTaskOrchestrations(typeof (CompressionCompatTest)) Assert.AreEqual(OrchestrationStatus.Completed, state.OrchestrationStatus, TestHelpers.GetInstanceNotCompletedMessage(this.client, id, 60)); } +#if NETCOREAPP + [TestCategory("DisabledInCI")] +#endif [TestMethod] public async Task MessageCompressionToNoCompressionTest() { @@ -844,6 +847,9 @@ protected override string Execute(TaskContext context, string input) #region Compression Tests +#if NETCOREAPP + [TestCategory("DisabledInCI")] +#endif [TestMethod] public async Task CompressionToNoCompressionCompatTest() { diff --git a/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj b/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj index d386ddd38..a834f1308 100644 --- a/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj +++ b/test/DurableTask.ServiceBus.Tests/DurableTask.ServiceBus.Tests.csproj @@ -29,10 +29,11 @@ - + + diff --git a/test/DurableTask.ServiceBus.Tests/ErrorHandlingTests.cs b/test/DurableTask.ServiceBus.Tests/ErrorHandlingTests.cs index 76385ca5d..c74beeeae 100644 --- a/test/DurableTask.ServiceBus.Tests/ErrorHandlingTests.cs +++ b/test/DurableTask.ServiceBus.Tests/ErrorHandlingTests.cs @@ -426,6 +426,9 @@ await this.taskHub.AddTaskOrchestrations(new TestObjectCreator Date: Thu, 25 Apr 2024 09:06:32 +0800 Subject: [PATCH 34/36] Add Version property to OrchestrationContext (#1071) Signed-off-by: Sky Ao --- src/DurableTask.Core/OrchestrationContext.cs | 5 +++++ src/DurableTask.Core/TaskOrchestrationExecutor.cs | 1 + 2 files changed, 6 insertions(+) diff --git a/src/DurableTask.Core/OrchestrationContext.cs b/src/DurableTask.Core/OrchestrationContext.cs index 5a48eb93f..4b2d8c7fe 100644 --- a/src/DurableTask.Core/OrchestrationContext.cs +++ b/src/DurableTask.Core/OrchestrationContext.cs @@ -53,6 +53,11 @@ public abstract class OrchestrationContext /// public OrchestrationInstance OrchestrationInstance { get; internal protected set; } + /// + /// Version of the currently executing orchestration + /// + public string Version { get; internal protected set; } + /// /// Replay-safe current UTC datetime /// diff --git a/src/DurableTask.Core/TaskOrchestrationExecutor.cs b/src/DurableTask.Core/TaskOrchestrationExecutor.cs index af8b850bf..81ea37778 100644 --- a/src/DurableTask.Core/TaskOrchestrationExecutor.cs +++ b/src/DurableTask.Core/TaskOrchestrationExecutor.cs @@ -208,6 +208,7 @@ void ProcessEvent(HistoryEvent historyEvent) { case EventType.ExecutionStarted: var executionStartedEvent = (ExecutionStartedEvent)historyEvent; + this.context.Version = executionStartedEvent.Version; this.result = this.taskOrchestration.Execute(this.context, executionStartedEvent.Input); break; case EventType.ExecutionTerminated: From b2a8a56ace3233895070135a2a36601c5eb3443d Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Wed, 24 Apr 2024 18:15:52 -0700 Subject: [PATCH 35/36] New APIs and updates related to failure details propagation (#1067) Also bumped DurableTask.Core package version to 2.17.0 --- .../ExceptionHandlingIntegrationTests.cs | 26 ++++++++++-- src/DurableTask.Core/DurableTask.Core.csproj | 4 +- .../Exceptions/OrchestrationException.cs | 4 +- src/DurableTask.Core/FailureDetails.cs | 42 +++++++++++++++++++ .../TaskOrchestrationContext.cs | 6 +++ 5 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs b/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs index 83fa7f0d1..ed41ea931 100644 --- a/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs +++ b/Test/DurableTask.Core.Tests/ExceptionHandlingIntegrationTests.cs @@ -15,6 +15,7 @@ namespace DurableTask.Core.Tests { using System; using System.Diagnostics; + using System.Runtime.Serialization; using System.Threading.Tasks; using DurableTask.Core.Exceptions; using DurableTask.Emulator; @@ -203,7 +204,10 @@ await context.ScheduleWithRetry( tfe.FailureDetails.ErrorMessage == "This is a test exception" && tfe.FailureDetails.StackTrace!.Contains(typeof(ThrowInvalidOperationException).Name) && tfe.FailureDetails.IsCausedBy() && - tfe.FailureDetails.IsCausedBy()) // check that base types work too + tfe.FailureDetails.IsCausedBy() && + tfe.FailureDetails.InnerFailure != null && + tfe.FailureDetails.InnerFailure.IsCausedBy() && + tfe.FailureDetails.InnerFailure.ErrorMessage == "And this is its custom inner exception") { // Stop retrying return false; @@ -235,7 +239,8 @@ class ThrowInvalidOperationException : TaskActivity { protected override string Execute(TaskContext context, string input) { - throw new InvalidOperationException("This is a test exception"); + throw new InvalidOperationException("This is a test exception", + new CustomException("And this is its custom inner exception")); } } @@ -243,7 +248,22 @@ class ThrowInvalidOperationExceptionAsync : AsyncTaskActivity { protected override Task ExecuteAsync(TaskContext context, string input) { - throw new InvalidOperationException("This is a test exception"); + throw new InvalidOperationException("This is a test exception", + new CustomException("And this is its custom inner exception")); + } + } + + [Serializable] + class CustomException : Exception + { + public CustomException(string message) + : base(message) + { + } + + protected CustomException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } } } diff --git a/src/DurableTask.Core/DurableTask.Core.csproj b/src/DurableTask.Core/DurableTask.Core.csproj index 536dfc22b..f413cfab4 100644 --- a/src/DurableTask.Core/DurableTask.Core.csproj +++ b/src/DurableTask.Core/DurableTask.Core.csproj @@ -17,8 +17,8 @@ 2 - 16 - 2 + 17 + 0 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(VersionPrefix).0 diff --git a/src/DurableTask.Core/Exceptions/OrchestrationException.cs b/src/DurableTask.Core/Exceptions/OrchestrationException.cs index 07e2ff9e1..8c8a144af 100644 --- a/src/DurableTask.Core/Exceptions/OrchestrationException.cs +++ b/src/DurableTask.Core/Exceptions/OrchestrationException.cs @@ -88,8 +88,8 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont public int EventId { get; set; } /// - /// Gets additional details about the failure. May be null if the failure details collection is not enabled. + /// Gets or sets additional details about the failure. May be null if the failure details collection is not enabled. /// - public FailureDetails? FailureDetails { get; internal set; } + public FailureDetails? FailureDetails { get; set; } } } \ No newline at end of file diff --git a/src/DurableTask.Core/FailureDetails.cs b/src/DurableTask.Core/FailureDetails.cs index ddf1f1a33..5dfd02ab9 100644 --- a/src/DurableTask.Core/FailureDetails.cs +++ b/src/DurableTask.Core/FailureDetails.cs @@ -14,10 +14,16 @@ namespace DurableTask.Core { using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; using System.Runtime.Serialization; using DurableTask.Core.Exceptions; using Newtonsoft.Json; + // NOTE: This class is very similar to https://github.com/microsoft/durabletask-dotnet/blob/main/src/Abstractions/TaskFailureDetails.cs. + // Any functional changes to this class should be mirrored in that class and vice versa. + /// /// Details of an activity, orchestration, or entity operation failure. /// @@ -42,6 +48,16 @@ public FailureDetails(string errorType, string errorMessage, string? stackTrace, this.IsNonRetriable = isNonRetriable; } + /// + /// Initializes a new instance of the class from an exception object. + /// + /// The exception used to generate the failure details. + /// The inner cause of the failure. + public FailureDetails(Exception e, FailureDetails innerFailure) + : this(e.GetType().FullName, GetErrorMessage(e), e.StackTrace, innerFailure, false) + { + } + /// /// Initializes a new instance of the class from an exception object. /// @@ -116,7 +132,33 @@ public override string ToString() /// Returns true if the value matches ; false otherwise. public bool IsCausedBy() where T : Exception { + // This check works for .NET exception types defined in System.Core.PrivateLib (aka mscorelib.dll) Type? exceptionType = Type.GetType(this.ErrorType, throwOnError: false); + + // For exception types defined in the same assembly as the target exception type. + exceptionType ??= typeof(T).Assembly.GetType(this.ErrorType, throwOnError: false); + + // For custom exception types defined in the app's assembly. + exceptionType ??= Assembly.GetCallingAssembly().GetType(this.ErrorType, throwOnError: false); + + if (exceptionType == null) + { + // This last check works for exception types defined in any loaded assembly (e.g. NuGet packages, etc.). + // This is a fallback that should rarely be needed except in obscure cases. + List matchingExceptionTypes = AppDomain.CurrentDomain.GetAssemblies() + .Select(a => a.GetType(this.ErrorType, throwOnError: false)) + .Where(t => t is not null) + .ToList(); + if (matchingExceptionTypes.Count == 1) + { + exceptionType = matchingExceptionTypes[0]; + } + else if (matchingExceptionTypes.Count > 1) + { + throw new AmbiguousMatchException($"Multiple exception types with the name '{this.ErrorType}' were found."); + } + } + return exceptionType != null && typeof(T).IsAssignableFrom(exceptionType); } diff --git a/src/DurableTask.Core/TaskOrchestrationContext.cs b/src/DurableTask.Core/TaskOrchestrationContext.cs index eb5b41760..3b2d5a797 100644 --- a/src/DurableTask.Core/TaskOrchestrationContext.cs +++ b/src/DurableTask.Core/TaskOrchestrationContext.cs @@ -638,6 +638,12 @@ public void FailOrchestration(Exception failure) details = orchestrationFailureException.Details; } } + else if (failure is TaskFailedException taskFailedException && + this.ErrorPropagationMode == ErrorPropagationMode.UseFailureDetails) + { + // Propagate the original FailureDetails + failureDetails = taskFailedException.FailureDetails; + } else { if (this.ErrorPropagationMode == ErrorPropagationMode.UseFailureDetails) From bdea4c3c73376e370b9b488b6abdc9a8965e4fdf Mon Sep 17 00:00:00 2001 From: Naiyuan Tian <110135109+nytian@users.noreply.github.com> Date: Tue, 7 May 2024 14:19:32 -0400 Subject: [PATCH 36/36] update with ASTrack2 methods (#1081) --- .../EntityTrackingStoreQueries.cs | 17 ++++++++++++----- ...OrchestrationInstanceStatusQueryCondition.cs | 5 +---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs index 3ba243908..1bf9bfadb 100644 --- a/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs +++ b/src/DurableTask.AzureStorage/EntityTrackingStoreQueries.cs @@ -21,6 +21,7 @@ namespace DurableTask.AzureStorage using System.Text; using System.Threading; using System.Threading.Tasks; + using Azure; using DurableTask.AzureStorage.Tracking; using DurableTask.Core; using DurableTask.Core.Entities; @@ -56,7 +57,7 @@ public EntityTrackingStoreQueries( CancellationToken cancellation = default(CancellationToken)) { await this.ensureTaskHub(); - OrchestrationState? state = (await this.trackingStore.GetStateAsync(id.ToString(), allExecutions: false, fetchInput: includeState)).FirstOrDefault(); + OrchestrationState? state = await this.trackingStore.GetStateAsync(id.ToString(), allExecutions: false, fetchInput: includeState).FirstOrDefaultAsync(); return await this.GetEntityMetadataAsync(state, includeStateless, includeState); } @@ -87,7 +88,10 @@ public async override Task QueryEntitiesAsync(EntityQuery fil do { - DurableStatusQueryResult result = await this.trackingStore.GetStateAsync(condition, filter.PageSize ?? 100, continuationToken, cancellation); + Page? page = await this.trackingStore.GetStateAsync(condition, cancellation).AsPages(continuationToken, filter.PageSize ?? 100).FirstOrDefaultAsync(); + DurableStatusQueryResult result = page != null + ? new DurableStatusQueryResult { ContinuationToken = page.ContinuationToken, OrchestrationState = page.Values } + : new DurableStatusQueryResult { OrchestrationState = Array.Empty() }; entityResult = await ConvertResultsAsync(result.OrchestrationState); continuationToken = result.ContinuationToken; } @@ -139,7 +143,10 @@ async ValueTask> ConvertResultsAsync(IEnumerable? states = await this.trackingStore.GetStateAsync(condition, cancellation).AsPages(continuationToken, 100).FirstOrDefaultAsync(); + DurableStatusQueryResult page = states != null + ? new DurableStatusQueryResult { ContinuationToken = states.ContinuationToken, OrchestrationState = states.Values } + : new DurableStatusQueryResult { OrchestrationState = Array.Empty() }; continuationToken = page.ContinuationToken; var tasks = new List(); @@ -174,8 +181,8 @@ async Task DeleteIdleOrchestrationEntity(OrchestrationState state) async Task CheckForOrphanedLockAndFixIt(OrchestrationState state, string lockOwner) { - OrchestrationState? ownerState - = (await this.trackingStore.GetStateAsync(lockOwner, allExecutions: false, fetchInput: false)).FirstOrDefault(); + OrchestrationState? ownerState + = await this.trackingStore.GetStateAsync(lockOwner, allExecutions: false, fetchInput: false).FirstOrDefaultAsync(); bool OrchestrationIsRunning(OrchestrationStatus? status) => status != null && (status == OrchestrationStatus.Running || status == OrchestrationStatus.Suspended); diff --git a/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs b/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs index 9ef2c20ca..0f47a3979 100644 --- a/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs +++ b/src/DurableTask.AzureStorage/Tracking/OrchestrationInstanceStatusQueryCondition.cs @@ -145,10 +145,7 @@ internal ODataCondition ToOData() } else if (this.ExcludeEntities) { - conditions.Add(TableQuery.CombineFilters( - TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThan, "@"), - TableOperators.Or, - TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, "A"))); + conditions.Add($"{nameof(OrchestrationInstanceStatus.PartitionKey)} lt '@' or {nameof(OrchestrationInstanceStatus.PartitionKey)} ge 'A'"); } if (this.InstanceId != null)