From 56e3350a663621f36b616d966dc52ae807010572 Mon Sep 17 00:00:00 2001 From: Naiyuan Tian Date: Mon, 19 May 2025 16:29:42 -0400 Subject: [PATCH 1/6] initial commit --- .../RemoteOrchestratorContext.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index 3243574d1..a66a1fff6 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -3,6 +3,7 @@ #nullable enable using System; using System.Collections.Generic; +using System.Text; using DurableTask.Core; using DurableTask.Core.Command; using DurableTask.Core.Entities; @@ -73,6 +74,19 @@ internal bool TryGetOrchestrationErrorDetails(out Exception? failure) internal void SetResult(IEnumerable actions, string customStatus) { + // Azure Table Storage enforces a 32 KB limit if a property value is a UTF016 encoded string. + // We apply a 16 KB limit here to align with the in-process model. + const int maxCustomStatusSizeInKB = 16; + int customStatusSizeInKB = (int)(Encoding.Unicode.GetByteCount(customStatus) / 1024.0); + + // If the provided custom status value exceeds 16KB in size, fail the orchestration. + if (customStatus != null && customStatusSizeInKB > maxCustomStatusSizeInKB) + { + string message = $"Custom Status exceeds the maximum allowed size of {maxCustomStatusSizeInKB} KB. Actual size: {customStatusSizeInKB} KB."; + this.failure = new OrchestrationFailureException(message); + return; + } + var result = new OrchestratorExecutionResult { CustomStatus = customStatus, From 4127540c76dc39658a85b94ea0a9a5e70de9b13e Mon Sep 17 00:00:00 2001 From: Naiyuan Tian Date: Mon, 19 May 2025 17:15:45 -0400 Subject: [PATCH 2/6] update exception --- .../ContextImplementations/RemoteOrchestratorContext.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index a66a1fff6..36e84033f 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -77,14 +77,13 @@ internal void SetResult(IEnumerable actions, string customSt // Azure Table Storage enforces a 32 KB limit if a property value is a UTF016 encoded string. // We apply a 16 KB limit here to align with the in-process model. const int maxCustomStatusSizeInKB = 16; - int customStatusSizeInKB = (int)(Encoding.Unicode.GetByteCount(customStatus) / 1024.0); + int? customStatusSizeInKB = customStatus != null ? + (int)(Encoding.Unicode.GetByteCount(customStatus) / 1024.0) : null; // If the provided custom status value exceeds 16KB in size, fail the orchestration. - if (customStatus != null && customStatusSizeInKB > maxCustomStatusSizeInKB) + if (customStatusSizeInKB.HasValue && customStatusSizeInKB > maxCustomStatusSizeInKB) { - string message = $"Custom Status exceeds the maximum allowed size of {maxCustomStatusSizeInKB} KB. Actual size: {customStatusSizeInKB} KB."; - this.failure = new OrchestrationFailureException(message); - return; + throw new ArgumentException($"CustomStatus too large: limit = {maxCustomStatusSizeInKB} KB (UTF-16), actual = {customStatusSizeInKB} KB."); } var result = new OrchestratorExecutionResult From 2e0d381367155c5c8494a8cb7aafd6134429de1c Mon Sep 17 00:00:00 2001 From: Naiyuan Tian Date: Mon, 19 May 2025 17:21:14 -0400 Subject: [PATCH 3/6] fix typo --- .../ContextImplementations/RemoteOrchestratorContext.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index 36e84033f..46c17400d 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -74,8 +74,8 @@ internal bool TryGetOrchestrationErrorDetails(out Exception? failure) internal void SetResult(IEnumerable actions, string customStatus) { - // Azure Table Storage enforces a 32 KB limit if a property value is a UTF016 encoded string. - // We apply a 16 KB limit here to align with the in-process model. + // Azure Table Storage enforces a 32 KB limit if a property value is a UTF-16 encoded string. + // We apply a 16 KB limit here to align with our in-process model. const int maxCustomStatusSizeInKB = 16; int? customStatusSizeInKB = customStatus != null ? (int)(Encoding.Unicode.GetByteCount(customStatus) / 1024.0) : null; From 19498d1efb7898707a3df2c8d4835abdd84cce42 Mon Sep 17 00:00:00 2001 From: "naiyuantian@microsoft.com" Date: Thu, 22 May 2025 10:25:13 -0700 Subject: [PATCH 4/6] udpate with reviews --- .../RemoteOrchestratorContext.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index 46c17400d..07b6a8ac6 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -74,17 +74,7 @@ internal bool TryGetOrchestrationErrorDetails(out Exception? failure) internal void SetResult(IEnumerable actions, string customStatus) { - // Azure Table Storage enforces a 32 KB limit if a property value is a UTF-16 encoded string. - // We apply a 16 KB limit here to align with our in-process model. - const int maxCustomStatusSizeInKB = 16; - int? customStatusSizeInKB = customStatus != null ? - (int)(Encoding.Unicode.GetByteCount(customStatus) / 1024.0) : null; - - // If the provided custom status value exceeds 16KB in size, fail the orchestration. - if (customStatusSizeInKB.HasValue && customStatusSizeInKB > maxCustomStatusSizeInKB) - { - throw new ArgumentException($"CustomStatus too large: limit = {maxCustomStatusSizeInKB} KB (UTF-16), actual = {customStatusSizeInKB} KB."); - } + this.ValidateCustomStatusSize(customStatus); var result = new OrchestratorExecutionResult { @@ -195,5 +185,20 @@ private void SetResultInternal(OrchestratorExecutionResult result) this.executionResult = result; } + + private void ValidateCustomStatusSize(string customStatus) + { + // Azure Table Storage enforces a 32 KB limit if a property value is a UTF-16 encoded string. + // We apply a 16 KB limit here to align with our in-process model. + const int MaxCustomStatusSizeInKB = 16; + double customStatusSizeInKB = customStatus != null ? Encoding.Unicode.GetByteCount(customStatus) / 1024.0 : 0; + + // If the provided custom status value exceeds 16KB in size, fail the orchestration. + if (customStatusSizeInKB > MaxCustomStatusSizeInKB) + { + throw new ArgumentException( + $"CustomStatus is too large: limit = {MaxCustomStatusSizeInKB} KB (UTF-16), actual = {customStatusSizeInKB:N2} KB."); + } + } } } From 4bd34549b231b1c5f555b781504e7786f014cccc Mon Sep 17 00:00:00 2001 From: "naiyuantian@microsoft.com" Date: Tue, 27 May 2025 08:36:41 -0700 Subject: [PATCH 5/6] make help method static --- .../ContextImplementations/RemoteOrchestratorContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index 07b6a8ac6..d32e055cd 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -186,7 +186,7 @@ private void SetResultInternal(OrchestratorExecutionResult result) this.executionResult = result; } - private void ValidateCustomStatusSize(string customStatus) + private static void ValidateCustomStatusSize(string customStatus) { // Azure Table Storage enforces a 32 KB limit if a property value is a UTF-16 encoded string. // We apply a 16 KB limit here to align with our in-process model. From ad8138cb4b58287d0e0581c0b13ab2348ee805b1 Mon Sep 17 00:00:00 2001 From: "naiyuantian@microsoft.com" Date: Tue, 27 May 2025 08:59:12 -0700 Subject: [PATCH 6/6] update calling method --- .../ContextImplementations/RemoteOrchestratorContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs index d32e055cd..48fb3d5da 100644 --- a/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs +++ b/src/WebJobs.Extensions.DurableTask/ContextImplementations/RemoteOrchestratorContext.cs @@ -74,7 +74,7 @@ internal bool TryGetOrchestrationErrorDetails(out Exception? failure) internal void SetResult(IEnumerable actions, string customStatus) { - this.ValidateCustomStatusSize(customStatus); + ValidateCustomStatusSize(customStatus); var result = new OrchestratorExecutionResult {