From 37da732335b9c8db2696b61dc5d2fae79a8045ca Mon Sep 17 00:00:00 2001 From: aditya-786 <42476079+aditya-786@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:12:55 +0530 Subject: [PATCH] Propagate memo on continue-as-new in the test server The in-memory test server carried over search attributes and header on continue-as-new but dropped the memo, so a workflow that sets a memo on continue-as-new could not read it back on the new run under the test environment even though it works against a real server. Set the memo on the ContinuedAsNew event attributes and on the new run start request, mirroring the existing search attribute handling, and extend ContinueAsNewTest to assert the memo is visible after continue-as-new. Closes #2863 --- .../test/java/io/temporal/workflow/ContinueAsNewTest.java | 7 +++++++ .../io/temporal/internal/testservice/StateMachines.java | 3 +++ .../temporal/internal/testservice/TestWorkflowService.java | 3 +++ 3 files changed, 13 insertions(+) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java index defc616ea1..83bf8838d1 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java @@ -77,6 +77,13 @@ public int execute(int count, String continueAsNewTaskQueue) { assertEquals(5, Workflow.getInfo().getRetryOptions().getMaximumAttempts()); assertEquals("foo1", Workflow.getTypedSearchAttributes().get(CUSTOM_KEYWORD_SA)); } + // The memo is set on every continue-as-new below, so every run after the + // first one should observe it once the test server propagates it. + if (count <= INITIAL_COUNT - 2) { + assertEquals("MyValue", Workflow.getMemo("myKey", String.class)); + } else { + Assert.assertNull(Workflow.getMemo("myKey", String.class)); + } if (count == 0) { assertEquals(continueAsNewTaskQueue, taskQueue); return 111; diff --git a/temporal-test-server/src/main/java/io/temporal/internal/testservice/StateMachines.java b/temporal-test-server/src/main/java/io/temporal/internal/testservice/StateMachines.java index c62d6f84a7..fce9d3ae01 100644 --- a/temporal-test-server/src/main/java/io/temporal/internal/testservice/StateMachines.java +++ b/temporal-test-server/src/main/java/io/temporal/internal/testservice/StateMachines.java @@ -1467,6 +1467,9 @@ private static void continueAsNewWorkflow( if (d.hasSearchAttributes()) { a.setSearchAttributes(d.getSearchAttributes()); } + if (d.hasMemo()) { + a.setMemo(d.getMemo()); + } a.setNewExecutionRunId(UUID.randomUUID().toString()); HistoryEvent event = HistoryEvent.newBuilder() diff --git a/temporal-test-server/src/main/java/io/temporal/internal/testservice/TestWorkflowService.java b/temporal-test-server/src/main/java/io/temporal/internal/testservice/TestWorkflowService.java index d852201775..b62f021a3c 100644 --- a/temporal-test-server/src/main/java/io/temporal/internal/testservice/TestWorkflowService.java +++ b/temporal-test-server/src/main/java/io/temporal/internal/testservice/TestWorkflowService.java @@ -1757,6 +1757,9 @@ public String continueAsNew( if (ea.hasSearchAttributes()) { startRequestBuilder.setSearchAttributes(ea.getSearchAttributes()); } + if (ea.hasMemo()) { + startRequestBuilder.setMemo(ea.getMemo()); + } StartWorkflowExecutionRequest startRequest = startRequestBuilder.build(); lock.lock(); Optional lastFail =