From 5577d89281615d12c4a59c42b3f1ed268cd22e09 Mon Sep 17 00:00:00 2001 From: sebastianburckhardt Date: Wed, 6 Sep 2023 15:09:40 -0700 Subject: [PATCH 1/2] update scheduler state and entity status format and helpers --- .../Entities/ClientEntityHelpers.cs | 34 ++++++++++++++----- .../Entities/StateFormat/EntityStatus.cs | 17 +++++++++- .../Entities/StateFormat/SchedulerState.cs | 7 ++-- src/DurableTask.Core/TaskEntityDispatcher.cs | 1 - 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/DurableTask.Core/Entities/ClientEntityHelpers.cs b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs index 18832f44d..054624c1c 100644 --- a/src/DurableTask.Core/Entities/ClientEntityHelpers.cs +++ b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs @@ -69,22 +69,38 @@ public static EventToSend EmitUnlockForOrphanedLock(OrchestrationInstance target Id = "fix-orphaned-lock", // we don't know the original id but it does not matter }; - var jmessage = JToken.FromObject(message, Serializer.InternalSerializer); + return new EventToSend(EntityMessageEventNames.ReleaseMessageEventName, jmessage, 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; + } return new EventToSend(EntityMessageEventNames.ReleaseMessageEventName, jmessage, targetInstance); } + var schedulerState = JsonConvert.DeserializeObject(serializedSchedulerState, Serializer.InternalSerializerSettings)!; + return schedulerState.EntityState; + } + /// - /// Extracts the user-defined entity state (as a serialized string) from the scheduler state (also a serialized string). + /// Gets the entity status from the serialized custom status of the orchestration. + /// or null if the entity has no state. /// - /// The state of the scheduler, as a serialized string. - /// The entity state - /// True if the entity exists, or false otherwise - public static bool TryGetEntityStateFromSerializedSchedulerState(string serializedSchedulerState, out string? entityState) + public static EntityStatus? GetEntityStatus(string? orchestrationCustomStatus) { - var schedulerState = JsonConvert.DeserializeObject(serializedSchedulerState, Serializer.InternalSerializerSettings); - entityState = schedulerState!.EntityState; - return schedulerState.EntityExists; + if (orchestrationCustomStatus == null) + { + return null; + } + + return JsonConvert.DeserializeObject(orchestrationCustomStatus, Serializer.InternalSerializerSettings)!; } } } \ No newline at end of file diff --git a/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs b/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs index 50c98c7d6..47eb051d0 100644 --- a/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs +++ b/src/DurableTask.Core/Entities/StateFormat/EntityStatus.cs @@ -22,10 +22,25 @@ namespace DurableTask.Core.Entities [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 exists or not. /// - [DataMember(Name = "entityExists", EmitDefaultValue = false)] + [DataMember(Name = EntityExistsProperyName, EmitDefaultValue = false)] public bool EntityExists { get; set; } /// diff --git a/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs b/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs index 8ece4ee73..aa5abe5f7 100644 --- a/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs +++ b/src/DurableTask.Core/Entities/StateFormat/SchedulerState.cs @@ -24,11 +24,8 @@ namespace DurableTask.Core.Entities [DataContract] internal class SchedulerState { - /// - /// Whether this entity exists or not. - /// - [DataMember(Name = "exists", EmitDefaultValue = false)] - public bool EntityExists { get; set; } + [IgnoreDataMember] + public bool EntityExists => this.EntityState != null; /// /// The last serialized entity state. diff --git a/src/DurableTask.Core/TaskEntityDispatcher.cs b/src/DurableTask.Core/TaskEntityDispatcher.cs index 0e9f0990f..a274983ac 100644 --- a/src/DurableTask.Core/TaskEntityDispatcher.cs +++ b/src/DurableTask.Core/TaskEntityDispatcher.cs @@ -268,7 +268,6 @@ protected async Task OnProcessWorkItemAsync(TaskOrchestrationWorkItem work // update the entity state based on the result schedulerState.EntityState = result.EntityState; - schedulerState.EntityExists = result.EntityState != null; // perform the actions foreach (var action in result.Actions!) From 15d182b35310a1f6b08cd3f2de7caeccd8a142d7 Mon Sep 17 00:00:00 2001 From: sebastianburckhardt Date: Wed, 6 Sep 2023 15:43:27 -0700 Subject: [PATCH 2/2] fix mess-up caused by merge conflict --- src/DurableTask.Core/Entities/ClientEntityHelpers.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/DurableTask.Core/Entities/ClientEntityHelpers.cs b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs index 054624c1c..c6c0783e7 100644 --- a/src/DurableTask.Core/Entities/ClientEntityHelpers.cs +++ b/src/DurableTask.Core/Entities/ClientEntityHelpers.cs @@ -69,6 +69,7 @@ public static EventToSend EmitUnlockForOrphanedLock(OrchestrationInstance target Id = "fix-orphaned-lock", // we don't know the original id but it does not matter }; + var jmessage = JToken.FromObject(message, Serializer.InternalSerializer); return new EventToSend(EntityMessageEventNames.ReleaseMessageEventName, jmessage, targetInstance); } @@ -78,13 +79,11 @@ public static EventToSend EmitUnlockForOrphanedLock(OrchestrationInstance target /// public static string? GetEntityState(string? serializedSchedulerState) { - if (serializedSchedulerState == null) - { + if (serializedSchedulerState == null) + { return null; - } - return new EventToSend(EntityMessageEventNames.ReleaseMessageEventName, jmessage, targetInstance); - } - + } + var schedulerState = JsonConvert.DeserializeObject(serializedSchedulerState, Serializer.InternalSerializerSettings)!; return schedulerState.EntityState; }