From e272a9e01e31ef51c1d7e24385b447c65980021f Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Tue, 25 Mar 2025 17:03:38 -0700 Subject: [PATCH 1/5] upsert SA log update tests fixes fix test fix up clean up Add more docs typo Test when a users upserts TemporalChangeVersion Fix error in test --- .../internal/history/VersionMarkerUtils.java | 49 +- .../replay/ReplayWorkflowContextImpl.java | 17 + .../replay/ReplayWorkflowRunTaskHandler.java | 7 +- .../statemachines/VersionStateMachine.java | 65 +- .../statemachines/WorkflowStateMachines.java | 83 +- .../internal/sync/SyncWorkflowContext.java | 4 - .../worker/WorkflowImplementationOptions.java | 46 +- .../versionTests/BaseVersionTest.java | 14 +- ...ltVersionNotSupportedDuringReplayTest.java | 3 +- .../GetVersionAddNewBeforeTest.java | 3 +- ...eCancellationInMainWorkflowMethodTest.java | 4 +- .../GetVersionAfterScopeCancellationTest.java | 2 +- .../versionTests/GetVersionAndTimerTest.java | 3 +- .../GetVersionDefaultInSignalTest.java | 5 +- .../GetVersionInSignalOnReplayTest.java | 2 +- .../versionTests/GetVersionInSignalTest.java | 13 +- .../GetVersionMultipleCallsDefaultTest.java | 3 +- .../GetVersionMultipleCallsInSignalTest.java | 130 +++ .../GetVersionMultipleCallsTest.java | 3 +- .../GetVersionMultithreadingRemoveTest.java | 3 +- .../GetVersionMultithreadingTest.java | 3 +- .../GetVersionOutOfOrderFailTest.java | 6 +- .../GetVersionRemovalBeforeMarkerTest.java | 3 +- .../GetVersionRemovedBeforeTest.java | 3 +- .../GetVersionRemovedInReplayTest.java | 3 +- .../GetVersionSameIdOnReplayTest.java | 3 +- .../versionTests/GetVersionSameIdTest.java | 2 +- .../workflow/versionTests/GetVersionTest.java | 25 +- .../versionTests/GetVersionUpsertSATest.java | 140 +++ .../GetVersionWithoutCommandEventTest.java | 15 +- .../GetVersionWorkflowRemoveTest.java | 30 +- ...tVersionWorkflowReplaceCompletelyTest.java | 21 +- ...ersionWorkflowReplaceGetVersionIdTest.java | 21 +- ...tedWithConflictingRangesExecutionTest.java | 4 +- .../testGetVersionHistoryUpsertSA.json | 677 +++++++++++ ...ltipleLargeGetVersionInSignalsHistory.json | 824 ++++++++++++++ ...rgeGetVersionInSignalsUpsertSAHistory.json | 1008 +++++++++++++++++ 37 files changed, 3194 insertions(+), 53 deletions(-) create mode 100644 temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java create mode 100644 temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java create mode 100644 temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json create mode 100644 temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json create mode 100644 temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json diff --git a/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java b/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java index c31b5492ea..8dad397cfc 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java @@ -1,13 +1,19 @@ package io.temporal.internal.history; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import io.temporal.api.command.v1.Command; import io.temporal.api.command.v1.RecordMarkerCommandAttributes; import io.temporal.api.common.v1.Payloads; +import io.temporal.api.common.v1.SearchAttributes; import io.temporal.api.history.v1.HistoryEvent; import io.temporal.api.history.v1.MarkerRecordedEventAttributes; +import io.temporal.common.SearchAttributeKey; import io.temporal.common.converter.DefaultDataConverter; +import io.temporal.internal.common.SearchAttributesUtil; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -15,6 +21,18 @@ public class VersionMarkerUtils { public static final String MARKER_NAME = "Version"; public static final String MARKER_CHANGE_ID_KEY = "changeId"; public static final String MARKER_VERSION_KEY = "version"; + public static final String UPSERT_VERSION_SA_KEY = "upsertSA"; + + // TemporalChangeVersion is used as search attributes key to find workflows with specific change + // version. + @VisibleForTesting + public static final SearchAttributeKey> TEMPORAL_CHANGE_VERSION = + SearchAttributeKey.forKeywordList("TemporalChangeVersion"); + + // Limit the size of the change version search attribute to avoid exceeding the server limits. + // Exceeding the limit + // will result in the search attribute not being added. + public static final int CHANGE_VERSION_SEARCH_ATTRIBUTE_SIZE_LIMIT = 2048; /** * @param event {@code HistoryEvent} to parse @@ -55,17 +73,46 @@ public static Integer getVersion(MarkerRecordedEventAttributes markerAttributes) return MarkerUtils.getValueFromMarker(markerAttributes, MARKER_VERSION_KEY, Integer.class); } + @Nullable + public static boolean getUpsertVersionSA(MarkerRecordedEventAttributes markerAttributes) { + Boolean upsertSA = + MarkerUtils.getValueFromMarker(markerAttributes, UPSERT_VERSION_SA_KEY, Boolean.class); + return upsertSA != null && upsertSA; + } + public static RecordMarkerCommandAttributes createMarkerAttributes( - String changeId, Integer version) { + String changeId, Integer version, Boolean upsertVersionSA) { Preconditions.checkNotNull(version, "version"); Map details = new HashMap<>(); details.put( MARKER_CHANGE_ID_KEY, DefaultDataConverter.STANDARD_INSTANCE.toPayloads(changeId).get()); details.put( MARKER_VERSION_KEY, DefaultDataConverter.STANDARD_INSTANCE.toPayloads(version).get()); + details.put( + UPSERT_VERSION_SA_KEY, + DefaultDataConverter.STANDARD_INSTANCE.toPayloads(upsertVersionSA).get()); return RecordMarkerCommandAttributes.newBuilder() .setMarkerName(MARKER_NAME) .putAllDetails(details) .build(); } + + public static String createChangeId(String changeId, Integer version) { + return changeId + "-" + version; + } + + public static SearchAttributes createVersionMarkerSearchAttributes( + String newChangeId, Integer newVersion, Map existingVersions) { + List changeVersions = new ArrayList<>(existingVersions.size() + 1); + existingVersions.entrySet().stream() + .map(entry -> createChangeId(entry.getKey(), entry.getValue())) + .forEach(changeVersions::add); + changeVersions.add(createChangeId(newChangeId, newVersion)); + SearchAttributes sa = + SearchAttributesUtil.encodeTyped( + io.temporal.common.SearchAttributes.newBuilder() + .set(TEMPORAL_CHANGE_VERSION, changeVersions) + .build()); + return sa; + } } diff --git a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java index 469976ee80..fe829f92cc 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java @@ -1,5 +1,7 @@ package io.temporal.internal.replay; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; + import com.uber.m3.tally.Scope; import io.temporal.api.command.v1.*; import io.temporal.api.common.v1.*; @@ -20,12 +22,15 @@ import java.util.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * TODO callbacks usage is non consistent. It accepts Optional and Exception which can be null. * Switch both to nullable. */ final class ReplayWorkflowContextImpl implements ReplayWorkflowContext { + private static final Logger log = LoggerFactory.getLogger(ReplayWorkflowContextImpl.class); private final BasicWorkflowContext basicWorkflowContext; private final WorkflowStateMachines workflowStateMachines; private final WorkflowMutableState mutableState; @@ -336,6 +341,18 @@ public long currentTimeMillis() { @Override public void upsertSearchAttributes(@Nonnull SearchAttributes searchAttributes) { + /* + * Temporal Change Version is a reserved field and should ideally not be set by the user. + * It is set by the SDK when getVersion is called. We know that users have been setting + * this field in the past, and we want to avoid breaking their workflows. + * */ + if (searchAttributes.containsIndexedFields(TEMPORAL_CHANGE_VERSION.getName())) { + // When we enabled upserting of the search attribute by default, we should consider raising a + // warning here. + log.debug( + "{} is a reserved field. This can be set automatically by the SDK by calling `setEnableUpsertVersionSearchAttributes` on you `WorkflowImplementationOptions`", + TEMPORAL_CHANGE_VERSION.getName()); + } workflowStateMachines.upsertSearchAttributes(searchAttributes); mutableState.upsertSearchAttributes(searchAttributes); } diff --git a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandler.java b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandler.java index 9d1e4ca62f..d081f0f38d 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandler.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandler.java @@ -94,7 +94,12 @@ class ReplayWorkflowRunTaskHandler implements WorkflowRunTaskHandler { this.workflow = workflow; this.workflowStateMachines = - new WorkflowStateMachines(new StatesMachinesCallbackImpl(), capabilities); + new WorkflowStateMachines( + new StatesMachinesCallbackImpl(), + capabilities, + workflow.getWorkflowContext() == null + ? WorkflowImplementationOptions.newBuilder().build() + : workflow.getWorkflowContext().getWorkflowImplementationOptions()); String fullReplayDirectQueryType = workflowTask.hasQuery() ? workflowTask.getQuery().getQueryType() : null; this.context = diff --git a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/VersionStateMachine.java b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/VersionStateMachine.java index ad0d7585d5..a541d7e81a 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/VersionStateMachine.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/VersionStateMachine.java @@ -6,7 +6,9 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import io.temporal.api.command.v1.Command; import io.temporal.api.command.v1.RecordMarkerCommandAttributes; +import io.temporal.api.common.v1.SearchAttributes; import io.temporal.api.enums.v1.CommandType; import io.temporal.api.enums.v1.EventType; import io.temporal.api.history.v1.HistoryEvent; @@ -27,6 +29,16 @@ final class VersionStateMachine { @Nullable private Integer version; + /** This flag is used to determine if the search attribute for the version change was written. */ + @Nullable private Boolean writeVersionChangeSA = false; + + /** + * This flag is used to determine if the search attribute for the version change has been written + * by this state machine. This is used to prevent writing the search attribute multiple times if + * getVersion is called repeatedly. + */ + private boolean hasWrittenVersionChangeSA = false; + /** * This variable is used for replay only. When we replay, we look one workflow task ahead and * preload all version markers to be able to return from Workflow.getVersion called in the event @@ -121,14 +133,18 @@ class InvocationStateMachine private final int minSupported; private final int maxSupported; - + private final Functions.Func1 upsertSearchAttributeCallback; private final Functions.Proc2 resultCallback; InvocationStateMachine( - int minSupported, int maxSupported, Functions.Proc2 callback) { + int minSupported, + int maxSupported, + Functions.Func1 upsertSearchAttributeCallback, + Functions.Proc2 callback) { super(STATE_MACHINE_DEFINITION, VersionStateMachine.this.commandSink, stateMachineSink); this.minSupported = minSupported; this.maxSupported = maxSupported; + this.upsertSearchAttributeCallback = upsertSearchAttributeCallback; this.resultCallback = Objects.requireNonNull(callback); } @@ -220,9 +236,16 @@ State createMarkerExecuting() { return State.SKIPPED; } else { version = maxSupported; + SearchAttributes sa = upsertSearchAttributeCallback.apply(version); + writeVersionChangeSA = sa != null; RecordMarkerCommandAttributes markerAttributes = - VersionMarkerUtils.createMarkerAttributes(changeId, version); - addCommand(StateMachineCommandUtils.createRecordMarker(markerAttributes)); + VersionMarkerUtils.createMarkerAttributes(changeId, version, writeVersionChangeSA); + Command markerCommand = StateMachineCommandUtils.createRecordMarker(markerAttributes); + addCommand(markerCommand); + if (writeVersionChangeSA) { + hasWrittenVersionChangeSA = true; + UpsertSearchAttributesStateMachine.newInstance(sa, commandSink, stateMachineSink); + } return State.MARKER_COMMAND_CREATED; } } @@ -255,6 +278,13 @@ void notifyMarkerCreatedReplaying() { State createMarkerReplaying() { createFakeCommand(); if (preloadedVersion != null) { + if (writeVersionChangeSA && !hasWrittenVersionChangeSA) { + hasWrittenVersionChangeSA = true; + if (writeVersionChangeSA) { + UpsertSearchAttributesStateMachine.newInstance( + SearchAttributes.newBuilder().build(), commandSink, stateMachineSink); + } + } return State.MARKER_COMMAND_CREATED_REPLAYING; } else { return State.SKIPPED_REPLAYING; @@ -311,7 +341,7 @@ private void updateVersionFromEvent(HistoryEvent event) { version = getVersionFromEvent(event); } - private void preloadVersionFromEvent(HistoryEvent event) { + private Integer preloadVersionFromEvent(HistoryEvent event) { if (version != null) { throw new NonDeterministicException( "Version is already set to " + version + ". " + RETROACTIVE_ADDITION_ERROR_STRING); @@ -324,6 +354,7 @@ private void preloadVersionFromEvent(HistoryEvent event) { preloadedVersion); preloadedVersion = getVersionFromEvent(event); + return preloadedVersion; } void flushPreloadedVersionAndUpdateFromEvent(HistoryEvent event) { @@ -360,8 +391,13 @@ private VersionStateMachine( * @return True if the identifier is not present in history */ public Integer getVersion( - int minSupported, int maxSupported, Functions.Proc2 callback) { - InvocationStateMachine ism = new InvocationStateMachine(minSupported, maxSupported, callback); + int minSupported, + int maxSupported, + Functions.Func1 upsertSearchAttributeCallback, + Functions.Proc2 callback) { + InvocationStateMachine ism = + new InvocationStateMachine( + minSupported, maxSupported, upsertSearchAttributeCallback, callback); ism.explicitEvent(ExplicitEvent.CHECK_EXECUTION_STATE); ism.explicitEvent(ExplicitEvent.SCHEDULE); // If the state is SKIPPED_REPLAYING that means we: @@ -373,12 +409,16 @@ public Integer getVersion( return version == null ? preloadedVersion : version; } + public boolean isWriteVersionChangeSA() { + return writeVersionChangeSA; + } + public void handleNonMatchingEvent(HistoryEvent event) { flushPreloadedVersionAndUpdateFromEvent(event); } - public void handleMarkersPreload(HistoryEvent event) { - preloadVersionFromEvent(event); + public Integer handleMarkersPreload(HistoryEvent event) { + return preloadVersionFromEvent(event); } private int getVersionFromEvent(HistoryEvent event) { @@ -398,6 +438,13 @@ private int getVersionFromEvent(HistoryEvent event) { Integer version = VersionMarkerUtils.getVersion(event.getMarkerRecordedEventAttributes()); Preconditions.checkArgument(version != null, "Marker details missing required version key"); + writeVersionChangeSA = + VersionMarkerUtils.getUpsertVersionSA(event.getMarkerRecordedEventAttributes()); + // Old SDKs didn't write the version change search attribute. So, if it is not present then + // default to false. + if (writeVersionChangeSA == null) { + writeVersionChangeSA = false; + } return version; } } diff --git a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/WorkflowStateMachines.java b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/WorkflowStateMachines.java index d75b49d351..b617333378 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/WorkflowStateMachines.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/WorkflowStateMachines.java @@ -3,6 +3,7 @@ import static io.temporal.api.enums.v1.CommandType.COMMAND_TYPE_PROTOCOL_MESSAGE; import static io.temporal.internal.common.WorkflowExecutionUtils.getEventTypeForCommand; import static io.temporal.internal.common.WorkflowExecutionUtils.isCommandEvent; +import static io.temporal.internal.history.VersionMarkerUtils.*; import static io.temporal.serviceclient.CheckedExceptionWrapper.unwrap; import com.google.common.annotations.VisibleForTesting; @@ -25,12 +26,15 @@ import io.temporal.internal.worker.LocalActivityResult; import io.temporal.serviceclient.Version; import io.temporal.worker.NonDeterministicException; +import io.temporal.worker.WorkflowImplementationOptions; import io.temporal.workflow.ChildWorkflowCancellationType; import io.temporal.workflow.Functions; import java.nio.charset.StandardCharsets; import java.util.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class WorkflowStateMachines { @@ -39,11 +43,20 @@ enum HandleEventStatus { NON_MATCHING_EVENT } + private static final Logger log = LoggerFactory.getLogger(WorkflowStateMachines.class); + /** Initial set of SDK flags that will be set on all new workflow executions. */ @VisibleForTesting public static List initialFlags = Collections.unmodifiableList(Arrays.asList(SdkFlag.SKIP_YIELD_ON_DEFAULT_VERSION)); + /** + * Keep track of the change versions that have been seen by the SDK. This is used to generate the + * {@link VersionMarkerUtils#TEMPORAL_CHANGE_VERSION} search attribute. We use a LinkedHashMap to + * ensure that the order of the change versions are preserved. + */ + private final Map changeVersions = new LinkedHashMap<>(); + /** * EventId of the WorkflowTaskStarted event of the Workflow Task that was picked up by a worker * and triggered a current replay or execution. It's expected to be the last event in the history @@ -161,24 +174,36 @@ enum HandleEventStatus { private final Set acceptedUpdates = new HashSet<>(); private final SdkFlags flags; + private final WorkflowImplementationOptions workflowImplOptions; @Nonnull private String lastSeenSdkName = ""; @Nonnull private String lastSeenSdkVersion = ""; + /** + * Track if the last event handled was a version marker for a getVersion call that was removed and + * that event was excepted to be followed by an upsert search attribute for the + * TemporalChangeVersion search attribute. + */ + private boolean shouldSkipUpsertVersionSA = false; + public WorkflowStateMachines( - StatesMachinesCallback callbacks, GetSystemInfoResponse.Capabilities capabilities) { - this(callbacks, (stateMachine) -> {}, capabilities); + StatesMachinesCallback callbacks, + GetSystemInfoResponse.Capabilities capabilities, + WorkflowImplementationOptions workflowImplOptions) { + this(callbacks, (stateMachine) -> {}, capabilities, workflowImplOptions); } @VisibleForTesting public WorkflowStateMachines( StatesMachinesCallback callbacks, Functions.Proc1 stateMachineSink, - GetSystemInfoResponse.Capabilities capabilities) { + GetSystemInfoResponse.Capabilities capabilities, + WorkflowImplementationOptions workflowImplOptions) { this.callbacks = Objects.requireNonNull(callbacks); this.commandSink = cancellableCommands::add; this.stateMachineSink = stateMachineSink; this.localActivityRequestSink = (request) -> localActivityRequests.add(request); this.flags = new SdkFlags(capabilities.getSdkMetadata(), this::isReplaying); + this.workflowImplOptions = workflowImplOptions; } @VisibleForTesting @@ -189,6 +214,7 @@ public WorkflowStateMachines( this.stateMachineSink = stateMachineSink; this.localActivityRequestSink = (request) -> localActivityRequests.add(request); this.flags = new SdkFlags(false, this::isReplaying); + this.workflowImplOptions = WorkflowImplementationOptions.newBuilder().build(); } // TODO revisit and potentially remove workflowTaskStartedEventId at all from the state machines. @@ -489,6 +515,14 @@ private void handleCommandEvent(HistoryEvent event) { if (handleLocalActivityMarker(event)) { return; } + if (shouldSkipUpsertVersionSA) { + if (handleNonMatchingUpsertSearchAttribute(event)) { + shouldSkipUpsertVersionSA = false; + return; + } else { + throw new NonDeterministicException("No command scheduled that corresponds to " + event); + } + } // Match event to the next command in the stateMachine queue. // After matching the command is notified about the event and is removed from the @@ -504,6 +538,8 @@ private void handleCommandEvent(HistoryEvent event) { // this event is a version marker for removed getVersion call. // Handle the version marker as unmatched and return even if there is no commands to match // it against. + shouldSkipUpsertVersionSA = + VersionMarkerUtils.getUpsertVersionSA(event.getMarkerRecordedEventAttributes()); return; } else { throw new NonDeterministicException("No command scheduled that corresponds to " + event); @@ -524,6 +560,8 @@ private void handleCommandEvent(HistoryEvent event) { // this event is a version marker for removed getVersion call. // Handle the version marker as unmatched and return even if there is no commands to match // it against. + shouldSkipUpsertVersionSA = + VersionMarkerUtils.getUpsertVersionSA(event.getMarkerRecordedEventAttributes()); return; } else { throw new NonDeterministicException( @@ -558,6 +596,8 @@ private void handleCommandEvent(HistoryEvent event) { if (handleNonMatchingVersionMarker(event)) { // this event is a version marker for removed getVersion call. // Handle the version marker as unmatched and return without consuming the command + shouldSkipUpsertVersionSA = + VersionMarkerUtils.getUpsertVersionSA(event.getMarkerRecordedEventAttributes()); return; } else { throw new NonDeterministicException( @@ -601,7 +641,10 @@ private void preloadVersionMarker(HistoryEvent event) { (idKey) -> VersionStateMachine.newInstance( changeId, this::isReplaying, commandSink, stateMachineSink)); - versionStateMachine.handleMarkersPreload(event); + Integer version = versionStateMachine.handleMarkersPreload(event); + if (versionStateMachine.isWriteVersionChangeSA()) { + changeVersions.put(changeId, version); + } } } @@ -618,6 +661,17 @@ private boolean handleNonMatchingVersionMarker(HistoryEvent event) { return true; } + private boolean handleNonMatchingUpsertSearchAttribute(HistoryEvent event) { + if (event.hasUpsertWorkflowSearchAttributesEventAttributes() + && event + .getUpsertWorkflowSearchAttributesEventAttributes() + .getSearchAttributes() + .containsIndexedFields(TEMPORAL_CHANGE_VERSION.getName())) { + return true; + } + return false; + } + public List takeCommands() { List result = new ArrayList<>(commands.size()); for (CancellableCommand command : commands) { @@ -1112,6 +1166,27 @@ public Integer getVersion( return stateMachine.getVersion( minSupported, maxSupported, + (version) -> { + if (!workflowImplOptions.isEnableUpsertVersionSearchAttributes()) { + return null; + } + if (version == null) { + throw new IllegalStateException("Version is null"); + } + SearchAttributes sa = + VersionMarkerUtils.createVersionMarkerSearchAttributes( + changeId, version, changeVersions); + changeVersions.put(changeId, version); + if (sa.getIndexedFieldsMap().get(TEMPORAL_CHANGE_VERSION.getName()).getSerializedSize() + >= CHANGE_VERSION_SEARCH_ATTRIBUTE_SIZE_LIMIT) { + log.warn( + "Serialized size of {} search attribute update would exceed the maximum value size. Skipping this upsert. Be aware that your visibility records will not include the following patch: {}", + TEMPORAL_CHANGE_VERSION, + VersionMarkerUtils.createChangeId(changeId, version)); + return null; + } + return sa; + }, (v, e) -> { callback.apply(v, e); // without this getVersion call will trigger the end of WFT, diff --git a/temporal-sdk/src/main/java/io/temporal/internal/sync/SyncWorkflowContext.java b/temporal-sdk/src/main/java/io/temporal/internal/sync/SyncWorkflowContext.java index b7042a3e4e..0e56d3674e 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/sync/SyncWorkflowContext.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/sync/SyncWorkflowContext.java @@ -102,10 +102,6 @@ final class SyncWorkflowContext implements WorkflowContext, WorkflowOutboundCall private Map nexusServiceOptionsMap; private boolean readOnly = false; private final WorkflowThreadLocal currentUpdateInfo = new WorkflowThreadLocal<>(); - // Map of all running update handlers. Key is the update ID of the update request. - private Map runningUpdateHandlers = new HashMap<>(); - // Map of all running signal handlers. Key is the event ID of the signal event. - private Map runningSignalHandlers = new HashMap<>(); @Nullable private String currentDetails; public SyncWorkflowContext( diff --git a/temporal-sdk/src/main/java/io/temporal/worker/WorkflowImplementationOptions.java b/temporal-sdk/src/main/java/io/temporal/worker/WorkflowImplementationOptions.java index a5b1c98a9c..c2d0aa033c 100644 --- a/temporal-sdk/src/main/java/io/temporal/worker/WorkflowImplementationOptions.java +++ b/temporal-sdk/src/main/java/io/temporal/worker/WorkflowImplementationOptions.java @@ -2,7 +2,9 @@ import io.temporal.activity.ActivityOptions; import io.temporal.activity.LocalActivityOptions; +import io.temporal.common.Experimental; import io.temporal.workflow.NexusServiceOptions; +import io.temporal.workflow.Workflow; import java.util.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -40,6 +42,7 @@ public static final class Builder { private LocalActivityOptions defaultLocalActivityOptions; private Map nexusServiceOptions; private NexusServiceOptions defaultNexusServiceOptions; + private boolean enableUpsertVersionSearchAttributes; private Builder() {} @@ -54,6 +57,7 @@ private Builder(WorkflowImplementationOptions options) { this.defaultLocalActivityOptions = options.getDefaultLocalActivityOptions(); this.nexusServiceOptions = options.getNexusServiceOptions(); this.defaultNexusServiceOptions = options.getDefaultNexusServiceOptions(); + this.enableUpsertVersionSearchAttributes = options.isEnableUpsertVersionSearchAttributes(); } /** @@ -154,6 +158,26 @@ public Builder setDefaultNexusServiceOptions(NexusServiceOptions defaultNexusSer return this; } + /** + * Enable upserting version search attributes on {@link Workflow#getVersion}. This will cause + * the SDK to automatically add the TemporalChangeVersion search attributes to the + * workflow when getVersion is called. This search attribute is a keyword list of all the + * getVersion calls made in the workflow. The format of each entry is "-". + * This allows for easy discovery of what versions are being used in your namespace. + * + *

Note: This change is backwards compatible, so it is safe to enable or disable this options + * with running workflows. However, if this options is enabled, it is not safe to rollback to a + * previous version of the SDK that does not support this option. + * + *

The default value is false. This may change in future releases. + */ + @Experimental + public Builder setEnableUpsertVersionSearchAttributes( + boolean enableUpsertVersionSearchAttributes) { + this.enableUpsertVersionSearchAttributes = enableUpsertVersionSearchAttributes; + return this; + } + public WorkflowImplementationOptions build() { return new WorkflowImplementationOptions( failWorkflowExceptionTypes == null ? new Class[0] : failWorkflowExceptionTypes, @@ -162,7 +186,8 @@ public WorkflowImplementationOptions build() { localActivityOptions == null ? null : localActivityOptions, defaultLocalActivityOptions, nexusServiceOptions == null ? null : nexusServiceOptions, - defaultNexusServiceOptions); + defaultNexusServiceOptions, + enableUpsertVersionSearchAttributes); } } @@ -173,6 +198,7 @@ public WorkflowImplementationOptions build() { private final LocalActivityOptions defaultLocalActivityOptions; private final @Nullable Map nexusServiceOptions; private final NexusServiceOptions defaultNexusServiceOptions; + private final boolean enableUpsertVersionSearchAttributes; public WorkflowImplementationOptions( Class[] failWorkflowExceptionTypes, @@ -181,7 +207,8 @@ public WorkflowImplementationOptions( @Nullable Map localActivityOptions, LocalActivityOptions defaultLocalActivityOptions, @Nullable Map nexusServiceOptions, - NexusServiceOptions defaultNexusServiceOptions) { + NexusServiceOptions defaultNexusServiceOptions, + boolean enableUpsertVersionSearchAttributes) { this.failWorkflowExceptionTypes = failWorkflowExceptionTypes; this.activityOptions = activityOptions; this.defaultActivityOptions = defaultActivityOptions; @@ -189,6 +216,7 @@ public WorkflowImplementationOptions( this.defaultLocalActivityOptions = defaultLocalActivityOptions; this.nexusServiceOptions = nexusServiceOptions; this.defaultNexusServiceOptions = defaultNexusServiceOptions; + this.enableUpsertVersionSearchAttributes = enableUpsertVersionSearchAttributes; } public Class[] getFailWorkflowExceptionTypes() { @@ -225,6 +253,11 @@ public NexusServiceOptions getDefaultNexusServiceOptions() { return defaultNexusServiceOptions; } + @Experimental + public boolean isEnableUpsertVersionSearchAttributes() { + return enableUpsertVersionSearchAttributes; + } + @Override public String toString() { return "WorkflowImplementationOptions{" @@ -242,6 +275,8 @@ public String toString() { + nexusServiceOptions + ", defaultNexusServiceOptions=" + defaultNexusServiceOptions + + ", enableUpsertVersionSearchAttributes=" + + enableUpsertVersionSearchAttributes + '}'; } @@ -256,7 +291,9 @@ public boolean equals(Object o) { && Objects.equals(localActivityOptions, that.localActivityOptions) && Objects.equals(defaultLocalActivityOptions, that.defaultLocalActivityOptions) && Objects.equals(nexusServiceOptions, that.nexusServiceOptions) - && Objects.equals(defaultNexusServiceOptions, that.defaultNexusServiceOptions); + && Objects.equals(defaultNexusServiceOptions, that.defaultNexusServiceOptions) + && Objects.equals( + enableUpsertVersionSearchAttributes, that.enableUpsertVersionSearchAttributes); } @Override @@ -268,7 +305,8 @@ public int hashCode() { localActivityOptions, defaultLocalActivityOptions, nexusServiceOptions, - defaultNexusServiceOptions); + defaultNexusServiceOptions, + enableUpsertVersionSearchAttributes); result = 31 * result + Arrays.hashCode(failWorkflowExceptionTypes); return result; } diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java index cc2480bfaa..b4fcc692e0 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java @@ -2,6 +2,7 @@ import io.temporal.internal.common.SdkFlag; import io.temporal.internal.statemachines.WorkflowStateMachines; +import io.temporal.worker.WorkflowImplementationOptions; import java.util.Arrays; import java.util.Collections; import org.junit.Before; @@ -11,13 +12,24 @@ @RunWith(Parameterized.class) public abstract class BaseVersionTest { - @Parameterized.Parameter public static boolean setVersioningFlag; + @Parameterized.Parameter(0) + public static boolean setVersioningFlag; + + public static boolean upsertVersioningSA = false; @Parameterized.Parameters() public static Object[] data() { return new Object[][] {{true}, {false}}; } + public WorkflowImplementationOptions options; + + public WorkflowImplementationOptions getDefaultWorkflowImplementationOptions() { + return WorkflowImplementationOptions.newBuilder() + .setEnableUpsertVersionSearchAttributes(upsertVersioningSA) + .build(); + } + @Before public void setup() { if (setVersioningFlag) { diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java index 0e15beaca3..39d8451f27 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java @@ -24,7 +24,8 @@ public class DefaultVersionNotSupportedDuringReplayTest extends BaseVersionTest @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestVersionNotSupportedWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestVersionNotSupportedWorkflowImpl.class) .build(); @Test diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java index bda1bcd837..ab54cdefe3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java @@ -23,7 +23,8 @@ public class GetVersionAddNewBeforeTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowAddNewBefore.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowAddNewBefore.class) .setWorkerOptions( WorkerOptions.newBuilder() .setStickyQueueScheduleToStartTimeout(Duration.ZERO) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java index 8f4d264600..f8809d13d6 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java @@ -19,7 +19,9 @@ public class GetVersionAfterScopeCancellationInMainWorkflowMethodTest extends Ba @Rule public SDKTestWorkflowRule testWorkflowRule = - SDKTestWorkflowRule.newBuilder().setWorkflowTypes(WorkflowImpl.class).build(); + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), WorkflowImpl.class) + .build(); public static final class WorkflowImpl implements TestWorkflows.NoArgsWorkflow { diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java index c5bbb825bf..626901136f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java @@ -27,7 +27,7 @@ public class GetVersionAfterScopeCancellationTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(ReminderWorkflowImpl.class) + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), ReminderWorkflowImpl.class) .setWorkerOptions(WorkerOptions.newBuilder().build()) .build(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java index 79f8008d08..dfd5e23a41 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java @@ -18,7 +18,8 @@ public class GetVersionAndTimerTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRuleWithoutVersion = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TimedWorkflowWithoutVersionImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TimedWorkflowWithoutVersionImpl.class) .build(); @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java index ab628ff228..7cfae1adf3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java @@ -20,7 +20,8 @@ public class GetVersionDefaultInSignalTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( @@ -30,7 +31,7 @@ public class GetVersionDefaultInSignalTest extends BaseVersionTest { .build(); @Test - public void testGetVersionDefaultInSignal() throws InterruptedException { + public void testGetVersionDefaultInSignal() { TestWorkflows.TestSignaledWorkflow workflow = testWorkflowRule.newWorkflowStubTimeoutOptions(TestWorkflows.TestSignaledWorkflow.class); WorkflowClient.start(workflow::execute); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java index 21ed75d59c..e6b4dd2f84 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java @@ -24,7 +24,7 @@ public class GetVersionInSignalOnReplayTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionInSignal.class) + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionInSignal.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java index 5a592efef7..e5604c5b68 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java @@ -1,5 +1,6 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; import static org.junit.Assert.assertEquals; import io.temporal.client.WorkflowClient; @@ -16,7 +17,9 @@ public class GetVersionInSignalTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = - SDKTestWorkflowRule.newBuilder().setWorkflowTypes(TestGetVersionInSignal.class).build(); + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionInSignal.class) + .build(); @Test public void testGetVersionInSignal() { @@ -29,6 +32,14 @@ public void testGetVersionInSignal() { workflow.signal("done"); String result = workflowStub.getResult(String.class); assertEquals("[done]", result); + List versions = + workflowStub.describe().getTypedSearchAttributes().get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + assertEquals(1, versions.size()); + assertEquals("some-id-2", versions.get(0)); + } else { + assertEquals(null, versions); + } } /** The following test covers the scenario where getVersion call is performed inside a signal */ diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java index 089fac1927..45568991d7 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java @@ -19,7 +19,8 @@ public class GetVersionMultipleCallsDefaultTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java new file mode 100644 index 0000000000..22829e3706 --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2022 Temporal Technologies, Inc. All Rights Reserved. + * + * Copyright (C) 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this material 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. + */ + +package io.temporal.workflow.versionTests; + +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; + +import io.temporal.client.WorkflowClient; +import io.temporal.client.WorkflowStub; +import io.temporal.testing.WorkflowReplayer; +import io.temporal.testing.internal.SDKTestWorkflowRule; +import io.temporal.workflow.SignalMethod; +import io.temporal.workflow.Workflow; +import io.temporal.workflow.WorkflowInterface; +import io.temporal.workflow.WorkflowMethod; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Rule; +import org.junit.Test; + +public class GetVersionMultipleCallsInSignalTest extends BaseVersionTest { + + @Rule + public SDKTestWorkflowRule testWorkflowRule = + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionInSignal.class) + .build(); + + @Test + public void testMultipleLargeGetVersionInSignals() { + TestSignaledWorkflow workflow = + testWorkflowRule.newWorkflowStubTimeoutOptions(TestSignaledWorkflow.class); + WorkflowClient.start(workflow::execute); + + char[] chars = new char[256]; + Arrays.fill(chars, 'a'); + String largeChangeIdPrefix = new String(chars); + // Signal 10 times, each time with a different large change id + for (int i = 0; i < 10; i++) { + workflow.signal(largeChangeIdPrefix + "-" + i); + } + workflow.close(); + + WorkflowStub workflowStub = WorkflowStub.fromTyped(workflow); + List result = workflowStub.getResult(List.class); + assertEquals(10, result.size()); + for (int i = 0; i < 10; i++) { + assertEquals(largeChangeIdPrefix + "-" + i, result.get(i)); + } + // Verify that the search attribute is set correctly + List versions = + workflowStub.describe().getTypedSearchAttributes().get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + assertEquals(7, versions.size()); + for (int i = 0; i < 7; i++) { + assertEquals(largeChangeIdPrefix + "-" + i + "-2", versions.get(i)); + } + } else { + assertEquals(null, versions); + } + } + + @Test + public void testMultipleLargeGetVersionInSignalsUpsertSAHistory() throws Exception { + WorkflowReplayer.replayWorkflowExecutionFromResource( + "testMultipleLargeGetVersionInSignalsUpsertSAHistory.json", TestGetVersionInSignal.class); + } + + @Test + public void testMultipleLargeGetVersionInSignalsHistory() throws Exception { + WorkflowReplayer.replayWorkflowExecutionFromResource( + "testMultipleLargeGetVersionInSignalsHistory.json", TestGetVersionInSignal.class); + } + + @WorkflowInterface + public interface TestSignaledWorkflow { + + @WorkflowMethod + List execute(); + + @SignalMethod(name = "testSignal") + void signal(String arg); + + @SignalMethod + void close(); + } + + /** The following test covers the scenario where getVersion call is performed inside a signal */ + public static class TestGetVersionInSignal implements TestSignaledWorkflow { + + private final List signalled = new ArrayList<>(); + private boolean closed = false; + + @Override + public List execute() { + Workflow.await(() -> closed); + return signalled; + } + + @Override + public void signal(String arg) { + Workflow.getVersion(arg, 1, 2); + signalled.add(arg); + } + + @Override + public void close() { + closed = true; + } + } +} diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java index 180825562c..a38402c406 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java @@ -18,7 +18,8 @@ public class GetVersionMultipleCallsTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java index c2e9f53cb7..097a04f4cc 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java @@ -25,7 +25,8 @@ public class GetVersionMultithreadingRemoveTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivities.TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java index 2092108823..58f0d6dfa0 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java @@ -24,7 +24,8 @@ public class GetVersionMultithreadingTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java index 5f996ab468..501833dfeb 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java @@ -24,14 +24,14 @@ import org.junit.Rule; import org.junit.Test; -public class GetVersionOutOfOrderFailTest { +public class GetVersionOutOfOrderFailTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() // Make the workflow fail on any exception to catch NonDeterministicException .setWorkflowTypes( - WorkflowImplementationOptions.newBuilder() + WorkflowImplementationOptions.newBuilder(getDefaultWorkflowImplementationOptions()) .setFailWorkflowExceptionTypes(Throwable.class) .build(), TestGetVersionWorkflowImpl.class) @@ -61,7 +61,7 @@ public void testGetVersionOutOfOrderFail() { } @Test - public void testGetVersionOutOfOrderFailReplay() throws Exception { + public void testGetVersionOutOfOrderFailReplay() { assertThrows( RuntimeException.class, () -> diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java index d73e7b8559..5370271871 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java @@ -20,7 +20,8 @@ public class GetVersionRemovalBeforeMarkerTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionRemovalWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionRemovalWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java index 45b4ff7fdf..dc4a5adbbc 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java @@ -23,7 +23,8 @@ public class GetVersionRemovedBeforeTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionRemovedBefore.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionRemovedBefore.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java index 386fb12e60..7796e0c356 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java @@ -24,7 +24,8 @@ public class GetVersionRemovedInReplayTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionRemovedInReplay.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionRemovedInReplay.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java index 94fab1cc81..4b41d5d31a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java @@ -23,7 +23,8 @@ public class GetVersionSameIdOnReplayTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionSameIdOnReplay.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionSameIdOnReplay.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java index 9ee3c21a6b..61c157cbf7 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java @@ -20,7 +20,7 @@ public class GetVersionSameIdTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionSameId.class) + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionSameId.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java index 999ca14957..da47d7b80c 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java @@ -1,8 +1,10 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import io.temporal.client.WorkflowStub; import io.temporal.testing.WorkflowReplayer; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; @@ -14,6 +16,7 @@ import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; import io.temporal.workflow.unsafe.WorkflowUnsafe; import java.time.Duration; +import java.util.List; import org.junit.Rule; import org.junit.Test; @@ -24,7 +27,8 @@ public class GetVersionTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( @@ -57,6 +61,19 @@ public void testGetVersion() { "getVersion", "executeActivity customActivity1", "activity customActivity1"); + // If upsertVersioningSA is true, then the search attributes should be set. + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + // Only one getVersion call while not replaying. + assertEquals(1, versions.size()); + assertEquals("test_change-1", versions.get(0)); + } else { + assertEquals(null, versions); + } } @Test @@ -65,6 +82,12 @@ public void testGetVersionReplay() throws Exception { "testGetVersionHistory.json", TestGetVersionWorkflowImpl.class); } + @Test + public void testGetVersionReplayUpsertSA() throws Exception { + WorkflowReplayer.replayWorkflowExecutionFromResource( + "testGetVersionHistoryUpsertSA.json", TestGetVersionWorkflowImpl.class); + } + public static class TestGetVersionWorkflowImpl implements TestWorkflow1 { @Override diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java new file mode 100644 index 0000000000..b61b54bd49 --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2022 Temporal Technologies, Inc. All Rights Reserved. + * + * Copyright (C) 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this material 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. + */ + +package io.temporal.workflow.versionTests; + +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import io.temporal.client.WorkflowStub; +import io.temporal.testing.internal.SDKTestOptions; +import io.temporal.testing.internal.SDKTestWorkflowRule; +import io.temporal.testing.internal.TracingWorkerInterceptor; +import io.temporal.worker.WorkerOptions; +import io.temporal.workflow.Workflow; +import io.temporal.workflow.shared.TestActivities.TestActivitiesImpl; +import io.temporal.workflow.shared.TestActivities.VariousTestActivities; +import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; +import io.temporal.workflow.unsafe.WorkflowUnsafe; +import java.time.Duration; +import java.util.Collections; +import java.util.List; +import org.junit.Rule; +import org.junit.Test; + +public class GetVersionUpsertSATest extends BaseVersionTest { + + private static boolean hasReplayed; + + @Rule + public SDKTestWorkflowRule testWorkflowRule = + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowImpl.class) + .setActivityImplementations(new TestActivitiesImpl()) + // Forcing a replay. Full history arrived from a normal queue causing a replay. + .setWorkerOptions( + WorkerOptions.newBuilder() + .setStickyQueueScheduleToStartTimeout(Duration.ZERO) + .build()) + .build(); + + @Test + public void testGetVersion() { + TestWorkflow1 workflowStub = + testWorkflowRule.newWorkflowStubTimeoutOptions(TestWorkflow1.class); + String result = workflowStub.execute(testWorkflowRule.getTaskQueue()); + assertTrue(hasReplayed); + assertEquals("activity22activity1activity1activity1", result); + testWorkflowRule + .getInterceptor(TracingWorkerInterceptor.class) + .setExpected( + "interceptExecuteWorkflow " + SDKTestWorkflowRule.UUID_REGEXP, + "newThread workflow-method", + "getVersion", + "upsertTypedSearchAttributes", + "executeActivity Activity2", + "activity Activity2", + "getVersion", + "upsertTypedSearchAttributes", + "executeActivity customActivity1", + "activity customActivity1", + "executeActivity customActivity1", + "activity customActivity1", + "sleep PT1S", + "getVersion", + "executeActivity customActivity1", + "activity customActivity1"); + // Check that the TemporalChangeVersion search attribute is set to the users value, since that + // was the last call made + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + assertEquals(1, versions.size()); + assertEquals("test_change-2", versions.get(0)); + } + + public static class TestGetVersionWorkflowImpl implements TestWorkflow1 { + + @Override + public String execute(String taskQueue) { + VariousTestActivities testActivities = + Workflow.newActivityStub( + VariousTestActivities.class, + SDKTestOptions.newActivityOptionsForTaskQueue(taskQueue)); + + // Test adding a version check in non-replay code. + int version = Workflow.getVersion("test_change", Workflow.DEFAULT_VERSION, 1); + assertEquals(version, 1); + // Test a user manually setting the TemporalChangeVersion search attributes. + Workflow.upsertTypedSearchAttributes( + TEMPORAL_CHANGE_VERSION.valueSet(Collections.singletonList("test_change-1"))); + String result = testActivities.activity2("activity2", 2); + + // Test version change in non-replay code. + version = Workflow.getVersion("test_change", 1, 2); + assertEquals(version, 1); + // Test a user manually setting the TemporalChangeVersion search attributes even when the SDK + // normally wouldn't. + // Intentionally use a value that the SDK would normally not set. + Workflow.upsertTypedSearchAttributes( + TEMPORAL_CHANGE_VERSION.valueSet(Collections.singletonList("test_change-2"))); + result += "activity" + testActivities.activity1(1); + + // Test adding a version check in replay code. + if (WorkflowUnsafe.isReplaying()) { + hasReplayed = true; + int version2 = Workflow.getVersion("test_change_2", Workflow.DEFAULT_VERSION, 1); + assertEquals(version2, Workflow.DEFAULT_VERSION); + } + result += "activity" + testActivities.activity1(1); // This is executed in non-replay mode. + + // Test get version in replay mode. + Workflow.sleep(1000); + version = Workflow.getVersion("test_change", 1, 2); + assertEquals(version, 1); + result += "activity" + testActivities.activity1(1); + return result; + } + } +} diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java index c75fedbce4..f13d97067e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java @@ -1,5 +1,8 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; + import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowStub; import io.temporal.testing.internal.SDKTestWorkflowRule; @@ -9,6 +12,7 @@ import io.temporal.workflow.shared.TestWorkflows.TestSignaledWorkflow; import io.temporal.workflow.unsafe.WorkflowUnsafe; import java.time.Duration; +import java.util.List; import java.util.concurrent.CompletableFuture; import org.junit.Assert; import org.junit.Rule; @@ -21,7 +25,9 @@ public class GetVersionWithoutCommandEventTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWithoutCommandEventWorkflowImpl.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), + TestGetVersionWithoutCommandEventWorkflowImpl.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() @@ -39,6 +45,13 @@ public void testGetVersionWithoutCommandEvent() throws Exception { workflowStub.signal("test signal"); String result = WorkflowStub.fromTyped(workflowStub).getResult(String.class); Assert.assertEquals("result 1", result); + + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + assertEquals(null, versions); } public static class TestGetVersionWithoutCommandEventWorkflowImpl diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java index c18a2bb47f..c3355bc600 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java @@ -1,9 +1,11 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; +import io.temporal.client.WorkflowStub; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; @@ -13,6 +15,7 @@ import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; import io.temporal.workflow.unsafe.WorkflowUnsafe; import java.time.Duration; +import java.util.List; import org.junit.Rule; import org.junit.Test; @@ -23,7 +26,8 @@ public class GetVersionWorkflowRemoveTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowRemove.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), TestGetVersionWorkflowRemove.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( @@ -37,8 +41,21 @@ public void testGetVersionWorkflowRemove() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); TestWorkflow1 workflowStub = testWorkflowRule.newWorkflowStubTimeoutOptions(TestWorkflow1.class); - assertEquals("foo10", workflowStub.execute(testWorkflowRule.getTaskQueue())); + assertEquals("bar10", workflowStub.execute(testWorkflowRule.getTaskQueue())); assertTrue(hasReplayed); + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + // Test that even though getVersion is removed, the versioning SA still contains the version. + assertEquals(2, versions.size()); + assertEquals("changeFoo-1", versions.get(0)); + assertEquals("changeBar-2", versions.get(1)); + } else { + assertEquals(null, versions); + } } public static class TestGetVersionWorkflowRemove implements TestWorkflow1 { @@ -61,7 +78,14 @@ public String execute(String taskQueue) { // No getVersionCall hasReplayed = true; } - result = activities.activity2("foo", 10); + activities.activity2("foo", 10); + Workflow.sleep(1000); // forces new workflow task + + int changeBar = Workflow.getVersion("changeBar", Workflow.DEFAULT_VERSION, 2); + if (changeBar != 2) { + throw new IllegalStateException("Unexpected version: " + 1); + } + result = activities.activity2("bar", 10); Workflow.sleep(1000); // forces new workflow task return result; } diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java index 4be7550fc2..c9f228a448 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java @@ -1,14 +1,18 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; +import io.temporal.client.WorkflowStub; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestWorkflows.NoArgsWorkflow; import io.temporal.workflow.unsafe.WorkflowUnsafe; import java.time.Duration; +import java.util.List; import org.junit.Rule; import org.junit.Test; import org.slf4j.Logger; @@ -23,7 +27,9 @@ public class GetVersionWorkflowReplaceCompletelyTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowReplaceCompletely.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), + TestGetVersionWorkflowReplaceCompletely.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() @@ -38,6 +44,19 @@ public void testGetVersionWorkflowReplaceCompletely() { testWorkflowRule.newWorkflowStubTimeoutOptions(NoArgsWorkflow.class); workflowStub.execute(); assertTrue(hasReplayed); + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + assertEquals(3, versions.size()); + assertEquals("changeFoo0-2", versions.get(0)); + assertEquals("changeFoo1-111", versions.get(1)); + assertEquals("changeFoo2-101", versions.get(2)); + } else { + assertEquals(null, versions); + } } public static class TestGetVersionWorkflowReplaceCompletely implements NoArgsWorkflow { diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java index 249d1b54e7..9368b6c0b9 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java @@ -1,14 +1,18 @@ package io.temporal.workflow.versionTests; +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; +import io.temporal.client.WorkflowStub; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestWorkflows.NoArgsWorkflow; import io.temporal.workflow.unsafe.WorkflowUnsafe; import java.time.Duration; +import java.util.List; import org.junit.Rule; import org.junit.Test; import org.slf4j.Logger; @@ -23,7 +27,9 @@ public class GetVersionWorkflowReplaceGetVersionIdTest extends BaseVersionTest { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(TestGetVersionWorkflowReplaceGetVersionId.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), + TestGetVersionWorkflowReplaceGetVersionId.class) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( WorkerOptions.newBuilder() @@ -38,6 +44,19 @@ public void testGetVersionWorkflowReplaceGetVersionId() { testWorkflowRule.newWorkflowStubTimeoutOptions(NoArgsWorkflow.class); workflowStub.execute(); assertTrue(hasReplayed); + List versions = + WorkflowStub.fromTyped(workflowStub) + .describe() + .getTypedSearchAttributes() + .get(TEMPORAL_CHANGE_VERSION); + if (upsertVersioningSA) { + // Only one getVersion call while not replaying. + assertEquals(2, versions.size()); + assertEquals("changeFoo0-2", versions.get(0)); + assertEquals("changeFoo1-111", versions.get(1)); + } else { + assertEquals(null, versions); + } } public static class TestGetVersionWorkflowReplaceGetVersionId implements NoArgsWorkflow { diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java index a41f26c887..cce7784d4a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java @@ -29,7 +29,9 @@ public class VersionNotSupportedWithConflictingRangesExecutionTest extends BaseV @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() - .setWorkflowTypes(WorkflowWithIncompatibleRangesForTheSameChangeId.class) + .setWorkflowTypes( + getDefaultWorkflowImplementationOptions(), + WorkflowWithIncompatibleRangesForTheSameChangeId.class) .setActivityImplementations(new TestActivitiesImpl()) // Forcing a replay. Full history arrived from a normal queue causing a replay. .setWorkerOptions( diff --git a/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json b/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json new file mode 100644 index 0000000000..d0f20d5025 --- /dev/null +++ b/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json @@ -0,0 +1,677 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-03-31T16:27:28.758965Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1048999", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "TestWorkflow1" + }, + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IldvcmtmbG93VGVzdC10ZXN0R2V0VmVyc2lvblsxXS1mZjAwZTg4Yy1kZDY0LTQ2ZjItYTUxMS04MmIwOWM4NDY5NTQi" + } + ] + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "200s", + "workflowTaskTimeout": "5s", + "originalExecutionRunId": "0195ed07-8876-7eb9-b722-ef99fadefce6", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "firstExecutionRunId": "0195ed07-8876-7eb9-b722-ef99fadefce6", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {}, + "workflowId": "ff28c127-56ff-416f-8630-53fa4f4cf79a" + } + }, + { + "eventId": "2", + "eventTime": "2025-03-31T16:27:28.759023Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049000", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2025-03-31T16:27:28.761289Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049006", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "47254548-d91e-4d4b-91ee-718e7cf6d189", + "historySizeBytes": "498" + } + }, + { + "eventId": "4", + "eventTime": "2025-03-31T16:27:28.773587Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049010", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "langUsedFlags": [ + 1, + 2 + ], + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2025-03-31T16:27:28.773613Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049011", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InRlc3RfY2hhbmdlIg==" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + } + }, + "workflowTaskCompletedEventId": "4" + } + }, + { + "eventId": "6", + "eventTime": "2025-03-31T16:27:28.773637Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1049012", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "4", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJ0ZXN0X2NoYW5nZS0xIl0=" + } + } + } + } + }, + { + "eventId": "7", + "eventTime": "2025-03-31T16:27:28.773656Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1049013", + "activityTaskScheduledEventAttributes": { + "activityId": "0a1b109f-912a-3597-984c-57bf7ccf090f", + "activityType": { + "name": "Activity2" + }, + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFjdGl2aXR5MiI=" + }, + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + }, + "scheduleToCloseTimeout": "5s", + "scheduleToStartTimeout": "5s", + "startToCloseTimeout": "5s", + "heartbeatTimeout": "5s", + "workflowTaskCompletedEventId": "4", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "8", + "eventTime": "2025-03-31T16:27:28.774449Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1049020", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "752a3776-7a9d-4327-beeb-111c1810544c", + "attempt": 1, + "workerVersion": {} + } + }, + { + "eventId": "9", + "eventTime": "2025-03-31T16:27:28.777017Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1049021", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFjdGl2aXR5MjIi" + } + ] + }, + "scheduledEventId": "7", + "startedEventId": "8", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "10", + "eventTime": "2025-03-31T16:27:28.777021Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049022", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "11", + "eventTime": "2025-03-31T16:27:28.777973Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049025", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "10", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "536207d6-3ddd-425c-9ed8-391ee8afc974", + "historySizeBytes": "1607" + } + }, + { + "eventId": "12", + "eventTime": "2025-03-31T16:27:28.785751Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049029", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "10", + "startedEventId": "11", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "13", + "eventTime": "2025-03-31T16:27:28.785784Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1049030", + "activityTaskScheduledEventAttributes": { + "activityId": "87727cf9-f100-3263-9545-8facfac980c8", + "activityType": { + "name": "customActivity1" + }, + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduleToCloseTimeout": "5s", + "scheduleToStartTimeout": "5s", + "startToCloseTimeout": "5s", + "heartbeatTimeout": "5s", + "workflowTaskCompletedEventId": "12", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "14", + "eventTime": "2025-03-31T16:27:28.786934Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1049037", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "f1288b55-3d33-454c-ae7c-e80315b4fa5f", + "attempt": 1, + "workerVersion": {} + } + }, + { + "eventId": "15", + "eventTime": "2025-03-31T16:27:28.789131Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1049038", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduledEventId": "13", + "startedEventId": "14", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "16", + "eventTime": "2025-03-31T16:27:28.789135Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049039", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "17", + "eventTime": "2025-03-31T16:27:28.789971Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049042", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "16", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "ced70588-787f-4325-9362-3f7e2cb67187", + "historySizeBytes": "2338" + } + }, + { + "eventId": "18", + "eventTime": "2025-03-31T16:27:28.799306Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049046", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "16", + "startedEventId": "17", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "19", + "eventTime": "2025-03-31T16:27:28.799331Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1049047", + "activityTaskScheduledEventAttributes": { + "activityId": "d841c025-5685-38c3-9cc4-fca5393b4701", + "activityType": { + "name": "customActivity1" + }, + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduleToCloseTimeout": "5s", + "scheduleToStartTimeout": "5s", + "startToCloseTimeout": "5s", + "heartbeatTimeout": "5s", + "workflowTaskCompletedEventId": "18", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "20", + "eventTime": "2025-03-31T16:27:28.800314Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1049053", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "19", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "86b6656c-3377-4f53-af31-8f6596dfa40b", + "attempt": 1, + "workerVersion": {} + } + }, + { + "eventId": "21", + "eventTime": "2025-03-31T16:27:28.802330Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1049054", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduledEventId": "19", + "startedEventId": "20", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "22", + "eventTime": "2025-03-31T16:27:28.802335Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049055", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "23", + "eventTime": "2025-03-31T16:27:28.803050Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049058", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "22", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "e0e3640b-ff87-451d-8e32-befa89d2b09a", + "historySizeBytes": "3069" + } + }, + { + "eventId": "24", + "eventTime": "2025-03-31T16:27:28.810866Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049062", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "22", + "startedEventId": "23", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "25", + "eventTime": "2025-03-31T16:27:28.810884Z", + "eventType": "EVENT_TYPE_TIMER_STARTED", + "taskId": "1049063", + "timerStartedEventAttributes": { + "timerId": "9fd53ec4-1cb4-335d-92cf-c2417aa92f2c", + "startToFireTimeout": "1s", + "workflowTaskCompletedEventId": "24" + } + }, + { + "eventId": "26", + "eventTime": "2025-03-31T16:27:29.812838Z", + "eventType": "EVENT_TYPE_TIMER_FIRED", + "taskId": "1049066", + "timerFiredEventAttributes": { + "timerId": "9fd53ec4-1cb4-335d-92cf-c2417aa92f2c", + "startedEventId": "25" + } + }, + { + "eventId": "27", + "eventTime": "2025-03-31T16:27:29.812904Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049067", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "28", + "eventTime": "2025-03-31T16:27:29.816207Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049070", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "27", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "52cce0f0-2bfd-4705-b962-44bf6a791fbe", + "historySizeBytes": "3495" + } + }, + { + "eventId": "29", + "eventTime": "2025-03-31T16:27:29.832601Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049074", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "27", + "startedEventId": "28", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "30", + "eventTime": "2025-03-31T16:27:29.832663Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1049075", + "activityTaskScheduledEventAttributes": { + "activityId": "89fc0281-9372-3d9f-8597-3b12c67435df", + "activityType": { + "name": "customActivity1" + }, + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduleToCloseTimeout": "5s", + "scheduleToStartTimeout": "5s", + "startToCloseTimeout": "5s", + "heartbeatTimeout": "5s", + "workflowTaskCompletedEventId": "29", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "31", + "eventTime": "2025-03-31T16:27:29.834519Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1049081", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "30", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "4bf8765c-4f1f-4df1-8f65-705eec7fe640", + "attempt": 1, + "workerVersion": {} + } + }, + { + "eventId": "32", + "eventTime": "2025-03-31T16:27:29.838360Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1049082", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MQ==" + } + ] + }, + "scheduledEventId": "30", + "startedEventId": "31", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "33", + "eventTime": "2025-03-31T16:27:29.838369Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049083", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testGetVersion[1]-ff00e88c-dd64-46f2-a511-82b09c846954", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "34", + "eventTime": "2025-03-31T16:27:29.842239Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049086", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "33", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "requestId": "11a3f30f-b1e5-400f-9f3b-285803bf3f40", + "historySizeBytes": "4226" + } + }, + { + "eventId": "35", + "eventTime": "2025-03-31T16:27:29.852361Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049090", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "33", + "startedEventId": "34", + "identity": "22133@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "36", + "eventTime": "2025-03-31T16:27:29.852460Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1049091", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFjdGl2aXR5MjJhY3Rpdml0eTFhY3Rpdml0eTFhY3Rpdml0eTEi" + } + ] + }, + "workflowTaskCompletedEventId": "35" + } + } + ] +} \ No newline at end of file diff --git a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json new file mode 100644 index 0000000000..c82f39425e --- /dev/null +++ b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json @@ -0,0 +1,824 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-03-31T23:16:13.563431Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1050585", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "TestSignaledWorkflow" + }, + "taskQueue": { + "name": "WorkflowTest-testMultipleLargeGetVersionInSignals[1]-1fa242e1-32ba-4964-92c4-1888a304287d", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "200s", + "workflowTaskTimeout": "5s", + "originalExecutionRunId": "0195ee7d-c07b-768f-b310-e5a99446783b", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "firstExecutionRunId": "0195ee7d-c07b-768f-b310-e5a99446783b", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {}, + "workflowId": "76222c62-0b80-4945-9992-b3fc7bec4a3b" + } + }, + { + "eventId": "2", + "eventTime": "2025-03-31T23:16:13.563510Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050586", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testMultipleLargeGetVersionInSignals[1]-1fa242e1-32ba-4964-92c4-1888a304287d", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2025-03-31T23:16:13.568195Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050592", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMCI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "4", + "eventTime": "2025-03-31T23:16:13.569013Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050594", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "requestId": "9fa1b4e6-0513-4174-b62a-37573b364d81", + "historySizeBytes": "826" + } + }, + { + "eventId": "5", + "eventTime": "2025-03-31T23:16:13.573761Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050598", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "4", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "langUsedFlags": [ + 1, + 2 + ], + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "6", + "eventTime": "2025-03-31T23:16:13.573788Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050599", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "7", + "eventTime": "2025-03-31T23:16:13.570345Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050600", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMSI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "8", + "eventTime": "2025-03-31T23:16:13.572142Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050601", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMiI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "9", + "eventTime": "2025-03-31T23:16:13.573790Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050602", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "66546@Quinn-Klassens-MacBook-Pro.local:e14f139e-a6aa-4745-98a1-ec72770f7355", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-testMultipleLargeGetVersionInSignals[1]-1fa242e1-32ba-4964-92c4-1888a304287d" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "10", + "eventTime": "2025-03-31T23:16:13.574291Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050607", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMyI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "11", + "eventTime": "2025-03-31T23:16:13.575129Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050609", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "9", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "requestId": "2ab5efaa-7261-4b91-8c30-9eb64c880de2", + "historySizeBytes": "2808" + } + }, + { + "eventId": "12", + "eventTime": "2025-03-31T23:16:13.630404Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050613", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "9", + "startedEventId": "11", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "13", + "eventTime": "2025-03-31T23:16:13.630441Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050614", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "12" + } + }, + { + "eventId": "14", + "eventTime": "2025-03-31T23:16:13.630444Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050615", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMiI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "12" + } + }, + { + "eventId": "15", + "eventTime": "2025-03-31T23:16:13.630446Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050616", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMyI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "12" + } + }, + { + "eventId": "16", + "eventTime": "2025-03-31T23:16:13.576191Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050617", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNCI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "17", + "eventTime": "2025-03-31T23:16:13.577909Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050618", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNSI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "18", + "eventTime": "2025-03-31T23:16:13.579467Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050619", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNiI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "19", + "eventTime": "2025-03-31T23:16:13.581316Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050620", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNyI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "20", + "eventTime": "2025-03-31T23:16:13.583096Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050621", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOCI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "21", + "eventTime": "2025-03-31T23:16:13.584831Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050622", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOSI=" + } + ] + }, + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "22", + "eventTime": "2025-03-31T23:16:13.586375Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050623", + "workflowExecutionSignaledEventAttributes": { + "signalName": "close", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "23", + "eventTime": "2025-03-31T23:16:13.630449Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050624", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "66546@Quinn-Klassens-MacBook-Pro.local:e14f139e-a6aa-4745-98a1-ec72770f7355", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-testMultipleLargeGetVersionInSignals[1]-1fa242e1-32ba-4964-92c4-1888a304287d" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "24", + "eventTime": "2025-03-31T23:16:13.631658Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050629", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "23", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "requestId": "b15c708b-07d0-4122-bc88-9f811da7b4ba", + "historySizeBytes": "6860" + } + }, + { + "eventId": "25", + "eventTime": "2025-03-31T23:16:13.643390Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050633", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "23", + "startedEventId": "24", + "identity": "66546@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "26", + "eventTime": "2025-03-31T23:16:13.643415Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050634", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "27", + "eventTime": "2025-03-31T23:16:13.643417Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050635", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "28", + "eventTime": "2025-03-31T23:16:13.643420Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050636", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNiI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "29", + "eventTime": "2025-03-31T23:16:13.643422Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050637", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNyI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "30", + "eventTime": "2025-03-31T23:16:13.643425Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050638", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "31", + "eventTime": "2025-03-31T23:16:13.643427Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050639", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "25" + } + }, + { + "eventId": "32", + "eventTime": "2025-03-31T23:16:13.643430Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1050640", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTEiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTQiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTUiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTYiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTciLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTgiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTkiXQ==" + } + ] + }, + "workflowTaskCompletedEventId": "25" + } + } + ] +} \ No newline at end of file diff --git a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json new file mode 100644 index 0000000000..c824d91327 --- /dev/null +++ b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json @@ -0,0 +1,1008 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-03-31T22:58:22.977641Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1050332", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "TestSignaledWorkflow" + }, + "taskQueue": { + "name": "WorkflowTest-testMultipleGetVersionInSignals[1]-d7d64dae-98d3-4177-944b-196b4ec03aee", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "200s", + "workflowTaskTimeout": "5s", + "originalExecutionRunId": "0195ee6d-6a81-79bc-ba9d-b215afaf2934", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "firstExecutionRunId": "0195ee6d-6a81-79bc-ba9d-b215afaf2934", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {}, + "workflowId": "4d28a0d0-1bc4-4608-a081-eb0d2f0ea554" + } + }, + { + "eventId": "2", + "eventTime": "2025-03-31T22:58:22.977809Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050333", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-testMultipleGetVersionInSignals[1]-d7d64dae-98d3-4177-944b-196b4ec03aee", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2025-03-31T22:58:22.982790Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050339", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "requestId": "b525c9a1-f159-4d57-a37a-7ac84a2909a7", + "historySizeBytes": "440" + } + }, + { + "eventId": "4", + "eventTime": "2025-03-31T22:58:22.986637Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050343", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "langUsedFlags": [ + 1, + 2 + ], + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2025-03-31T22:58:22.983320Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050344", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMCI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "6", + "eventTime": "2025-03-31T22:58:22.985652Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050345", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMSI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "7", + "eventTime": "2025-03-31T22:58:22.986676Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050346", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "46391@Quinn-Klassens-MacBook-Pro.local:870f638e-4af3-4780-bf64-6594eaa94b14", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-testMultipleGetVersionInSignals[1]-d7d64dae-98d3-4177-944b-196b4ec03aee" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "8", + "eventTime": "2025-03-31T22:58:22.988071Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050351", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "requestId": "402290dc-3d68-4f0d-b5cc-4436058b0c59", + "historySizeBytes": "1606" + } + }, + { + "eventId": "9", + "eventTime": "2025-03-31T22:58:22.992786Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050355", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "7", + "startedEventId": "8", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "10", + "eventTime": "2025-03-31T22:58:22.992835Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050356", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "9" + } + }, + { + "eventId": "11", + "eventTime": "2025-03-31T22:58:22.992861Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050357", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "9", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiJd" + } + } + } + } + }, + { + "eventId": "12", + "eventTime": "2025-03-31T22:58:22.992873Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050358", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "9" + } + }, + { + "eventId": "13", + "eventTime": "2025-03-31T22:58:22.992887Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050359", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "9", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIl0=" + } + } + } + } + }, + { + "eventId": "14", + "eventTime": "2025-03-31T22:58:22.988593Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050360", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMiI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "15", + "eventTime": "2025-03-31T22:58:22.990533Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050361", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMyI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "16", + "eventTime": "2025-03-31T22:58:22.992224Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050362", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNCI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "17", + "eventTime": "2025-03-31T22:58:22.992894Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050363", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "46391@Quinn-Klassens-MacBook-Pro.local:870f638e-4af3-4780-bf64-6594eaa94b14", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-testMultipleGetVersionInSignals[1]-d7d64dae-98d3-4177-944b-196b4ec03aee" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "18", + "eventTime": "2025-03-31T22:58:22.994156Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050368", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "17", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "requestId": "91790285-b319-4273-9f98-6c8fbd118daf", + "historySizeBytes": "5025" + } + }, + { + "eventId": "19", + "eventTime": "2025-03-31T22:58:23.051639Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050372", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "17", + "startedEventId": "18", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "20", + "eventTime": "2025-03-31T22:58:23.051690Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050373", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMiI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "19" + } + }, + { + "eventId": "21", + "eventTime": "2025-03-31T22:58:23.051757Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050374", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "19", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS0yLTIiXQ==" + } + } + } + } + }, + { + "eventId": "22", + "eventTime": "2025-03-31T22:58:23.051790Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050375", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMyI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "19" + } + }, + { + "eventId": "23", + "eventTime": "2025-03-31T22:58:23.051834Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050376", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "19", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS0yLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMtMiJd" + } + } + } + } + }, + { + "eventId": "24", + "eventTime": "2025-03-31T22:58:23.051857Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050377", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "19" + } + }, + { + "eventId": "25", + "eventTime": "2025-03-31T22:58:23.051901Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050378", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "19", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS0yLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNC0yIl0=" + } + } + } + } + }, + { + "eventId": "26", + "eventTime": "2025-03-31T22:58:22.994901Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050379", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNSI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "27", + "eventTime": "2025-03-31T22:58:22.996521Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050380", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNiI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "28", + "eventTime": "2025-03-31T22:58:22.998241Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050381", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNyI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "29", + "eventTime": "2025-03-31T22:58:23.001001Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050382", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOCI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "30", + "eventTime": "2025-03-31T22:58:23.004486Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050383", + "workflowExecutionSignaledEventAttributes": { + "signalName": "testSignal", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOSI=" + } + ] + }, + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "31", + "eventTime": "2025-03-31T22:58:23.009900Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050384", + "workflowExecutionSignaledEventAttributes": { + "signalName": "close", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "header": {} + } + }, + { + "eventId": "32", + "eventTime": "2025-03-31T22:58:23.051918Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050385", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "46391@Quinn-Klassens-MacBook-Pro.local:870f638e-4af3-4780-bf64-6594eaa94b14", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-testMultipleGetVersionInSignals[1]-d7d64dae-98d3-4177-944b-196b4ec03aee" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "33", + "eventTime": "2025-03-31T22:58:23.055792Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050390", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "32", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "requestId": "9846f80b-475a-41d1-881b-b549ec67ed6e", + "historySizeBytes": "12173" + } + }, + { + "eventId": "34", + "eventTime": "2025-03-31T22:58:23.070285Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050394", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "32", + "startedEventId": "33", + "identity": "46391@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "sdkName": "temporal-java", + "sdkVersion": "1.23.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "35", + "eventTime": "2025-03-31T22:58:23.070330Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050395", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "34" + } + }, + { + "eventId": "36", + "eventTime": "2025-03-31T22:58:23.070394Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050396", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "34", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS0yLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNC0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS01LTIiXQ==" + } + } + } + } + }, + { + "eventId": "37", + "eventTime": "2025-03-31T22:58:23.070422Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050397", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNiI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "dHJ1ZQ==" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "34" + } + }, + { + "eventId": "38", + "eventTime": "2025-03-31T22:58:23.070464Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "taskId": "1050398", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "34", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtMS0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS0yLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMtMiIsImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNC0yIiwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS01LTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTYtMiJd" + } + } + } + } + }, + { + "eventId": "39", + "eventTime": "2025-03-31T22:58:23.070480Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050399", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtNyI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "34" + } + }, + { + "eventId": "40", + "eventTime": "2025-03-31T22:58:23.070485Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050400", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOCI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "34" + } + }, + { + "eventId": "41", + "eventTime": "2025-03-31T22:58:23.070491Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050401", + "markerRecordedEventAttributes": { + "markerName": "Version", + "details": { + "changeId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEtOSI=" + } + ] + }, + "upsertSA": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ZmFsc2U=" + } + ] + }, + "version": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + } + }, + "workflowTaskCompletedEventId": "34" + } + }, + { + "eventId": "42", + "eventTime": "2025-03-31T22:58:23.070498Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1050402", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "WyJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTAiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTEiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTIiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTMiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTQiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTUiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTYiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTciLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTgiLCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLTkiXQ==" + } + ] + }, + "workflowTaskCompletedEventId": "34" + } + } + ] +} \ No newline at end of file From d482995fcb864c963f451274c355de7ec1dc24a0 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Mon, 26 May 2025 11:19:34 -0700 Subject: [PATCH 2/5] Fix tests --- .../temporal/workflow/versionTests/BaseVersionTest.java | 9 ++++----- .../DefaultVersionNotSupportedDuringReplayTest.java | 5 +++++ .../versionTests/GetVersionAddNewBeforeTest.java | 4 ++++ ...onAfterScopeCancellationInMainWorkflowMethodTest.java | 5 +++++ .../GetVersionAfterScopeCancellationTest.java | 5 +++++ .../workflow/versionTests/GetVersionAndTimerTest.java | 4 ++++ .../versionTests/GetVersionDefaultInSignalTest.java | 4 ++++ .../versionTests/GetVersionInSignalOnReplayTest.java | 4 ++++ .../workflow/versionTests/GetVersionInSignalTest.java | 4 ++++ .../versionTests/GetVersionMultipleCallsDefaultTest.java | 4 ++++ .../GetVersionMultipleCallsInSignalTest.java | 5 +++++ .../versionTests/GetVersionMultipleCallsTest.java | 4 ++++ .../versionTests/GetVersionMultithreadingRemoveTest.java | 4 ++++ .../versionTests/GetVersionMultithreadingTest.java | 4 ++++ .../versionTests/GetVersionOutOfOrderFailTest.java | 4 ++++ .../versionTests/GetVersionRemovalBeforeMarkerTest.java | 4 ++++ .../versionTests/GetVersionRemovedBeforeTest.java | 4 ++++ .../versionTests/GetVersionRemovedInReplayTest.java | 4 ++++ .../versionTests/GetVersionSameIdOnReplayTest.java | 4 ++++ .../workflow/versionTests/GetVersionSameIdTest.java | 4 ++++ .../temporal/workflow/versionTests/GetVersionTest.java | 4 ++++ .../workflow/versionTests/GetVersionUpsertSATest.java | 4 ++++ .../versionTests/GetVersionWithoutCommandEventTest.java | 4 ++++ .../versionTests/GetVersionWorkflowRemoveTest.java | 4 ++++ .../GetVersionWorkflowReplaceCompletelyTest.java | 5 +++++ .../GetVersionWorkflowReplaceGetVersionIdTest.java | 5 +++++ ...onNotSupportedWithConflictingRangesExecutionTest.java | 5 +++++ 27 files changed, 115 insertions(+), 5 deletions(-) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java index b4fcc692e0..0b128a7783 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/BaseVersionTest.java @@ -5,21 +5,19 @@ import io.temporal.worker.WorkflowImplementationOptions; import java.util.Arrays; import java.util.Collections; -import org.junit.Before; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public abstract class BaseVersionTest { - @Parameterized.Parameter(0) public static boolean setVersioningFlag; public static boolean upsertVersioningSA = false; @Parameterized.Parameters() public static Object[] data() { - return new Object[][] {{true}, {false}}; + return new Object[][] {{true, true}, {false, true}, {true, false}, {false, false}}; } public WorkflowImplementationOptions options; @@ -30,12 +28,13 @@ public WorkflowImplementationOptions getDefaultWorkflowImplementationOptions() { .build(); } - @Before - public void setup() { + public BaseVersionTest(boolean setVersioningFlag, boolean upsertVersioningSA) { if (setVersioningFlag) { WorkflowStateMachines.initialFlags = Collections.unmodifiableList( Arrays.asList(SdkFlag.SKIP_YIELD_ON_DEFAULT_VERSION, SdkFlag.SKIP_YIELD_ON_VERSION)); } + this.setVersioningFlag = setVersioningFlag; + this.upsertVersioningSA = upsertVersioningSA; } } diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java index 39d8451f27..5de28436b3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/DefaultVersionNotSupportedDuringReplayTest.java @@ -28,6 +28,11 @@ public class DefaultVersionNotSupportedDuringReplayTest extends BaseVersionTest getDefaultWorkflowImplementationOptions(), TestVersionNotSupportedWorkflowImpl.class) .build(); + public DefaultVersionNotSupportedDuringReplayTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testVersionNotSupported() throws InterruptedException { TestWorkflowReturnString workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java index ab54cdefe3..a5ad4b8262 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java @@ -31,6 +31,10 @@ public class GetVersionAddNewBeforeTest extends BaseVersionTest { .build()) .build(); + public GetVersionAddNewBeforeTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionAddNewBefore() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java index f8809d13d6..ee3d40547d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationInMainWorkflowMethodTest.java @@ -23,6 +23,11 @@ public class GetVersionAfterScopeCancellationInMainWorkflowMethodTest extends Ba .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), WorkflowImpl.class) .build(); + public GetVersionAfterScopeCancellationInMainWorkflowMethodTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + public static final class WorkflowImpl implements TestWorkflows.NoArgsWorkflow { @Override diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java index 626901136f..155cb2f45f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAfterScopeCancellationTest.java @@ -31,6 +31,11 @@ public class GetVersionAfterScopeCancellationTest extends BaseVersionTest { .setWorkerOptions(WorkerOptions.newBuilder().build()) .build(); + public GetVersionAfterScopeCancellationTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionAndCancelTimer() { ReminderWorkflow workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java index dfd5e23a41..f58e1efa76 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java @@ -26,6 +26,10 @@ public class GetVersionAndTimerTest extends BaseVersionTest { public SDKTestWorkflowRule testWorkflowRuleWithVersion = SDKTestWorkflowRule.newBuilder().setWorkflowTypes(TimedWorkflowWithVersionImpl.class).build(); + public GetVersionAndTimerTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testTimedWorkflowWithoutVersionImpl() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java index 7cfae1adf3..f79b750278 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionDefaultInSignalTest.java @@ -30,6 +30,10 @@ public class GetVersionDefaultInSignalTest extends BaseVersionTest { .build()) .build(); + public GetVersionDefaultInSignalTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionDefaultInSignal() { TestWorkflows.TestSignaledWorkflow workflow = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java index e6b4dd2f84..87132f1191 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalOnReplayTest.java @@ -32,6 +32,10 @@ public class GetVersionInSignalOnReplayTest extends BaseVersionTest { .build()) .build(); + public GetVersionInSignalOnReplayTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionInSignal() { TestWorkflows.TestSignaledWorkflow workflow = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java index e5604c5b68..0ac4e7ac1f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInSignalTest.java @@ -21,6 +21,10 @@ public class GetVersionInSignalTest extends BaseVersionTest { .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionInSignal.class) .build(); + public GetVersionInSignalTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionInSignal() { TestWorkflows.TestSignaledWorkflow workflow = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java index 45568991d7..3574b6ae61 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsDefaultTest.java @@ -29,6 +29,10 @@ public class GetVersionMultipleCallsDefaultTest extends BaseVersionTest { .build()) .build(); + public GetVersionMultipleCallsDefaultTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionMultipleCallsDefault() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java index 22829e3706..963ad9b47e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsInSignalTest.java @@ -45,6 +45,11 @@ public class GetVersionMultipleCallsInSignalTest extends BaseVersionTest { .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestGetVersionInSignal.class) .build(); + public GetVersionMultipleCallsInSignalTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testMultipleLargeGetVersionInSignals() { TestSignaledWorkflow workflow = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java index a38402c406..899a87166b 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultipleCallsTest.java @@ -28,6 +28,10 @@ public class GetVersionMultipleCallsTest extends BaseVersionTest { .build()) .build(); + public GetVersionMultipleCallsTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionMultipleCalls() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java index 097a04f4cc..226e633f57 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingRemoveTest.java @@ -35,6 +35,10 @@ public class GetVersionMultithreadingRemoveTest extends BaseVersionTest { .build()) .build(); + public GetVersionMultithreadingRemoveTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionMultithreadingRemoval() { assumeTrue("This test only passes if SKIP_YIELD_ON_VERSION is enabled", setVersioningFlag); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java index 58f0d6dfa0..915f73f2ac 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionMultithreadingTest.java @@ -34,6 +34,10 @@ public class GetVersionMultithreadingTest extends BaseVersionTest { .build()) .build(); + public GetVersionMultithreadingTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionDefaultMultithreading() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java index 501833dfeb..9e4be4c046 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionOutOfOrderFailTest.java @@ -43,6 +43,10 @@ public class GetVersionOutOfOrderFailTest extends BaseVersionTest { .build()) .build(); + public GetVersionOutOfOrderFailTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionOutOfOrderFail() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java index 5370271871..4b96a32585 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovalBeforeMarkerTest.java @@ -30,6 +30,10 @@ public class GetVersionRemovalBeforeMarkerTest extends BaseVersionTest { .build()) .build(); + public GetVersionRemovalBeforeMarkerTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testSideEffectAfterGetVersion() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java index dc4a5adbbc..10cc0347d8 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedBeforeTest.java @@ -33,6 +33,10 @@ public class GetVersionRemovedBeforeTest extends BaseVersionTest { .build()) .build(); + public GetVersionRemovedBeforeTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionRemovedBefore() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java index 7796e0c356..80c55afc70 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionRemovedInReplayTest.java @@ -34,6 +34,10 @@ public class GetVersionRemovedInReplayTest extends BaseVersionTest { .build()) .build(); + public GetVersionRemovedInReplayTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionRemovedInReplay() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java index 4b41d5d31a..c5de8bfebd 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java @@ -32,6 +32,10 @@ public class GetVersionSameIdOnReplayTest extends BaseVersionTest { .build()) .build(); + public GetVersionSameIdOnReplayTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionSameIdOnReplay() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java index 61c157cbf7..24fb6aea0e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java @@ -28,6 +28,10 @@ public class GetVersionSameIdTest extends BaseVersionTest { .build()) .build(); + public GetVersionSameIdTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionSameId() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java index da47d7b80c..24be02e467 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionTest.java @@ -37,6 +37,10 @@ public class GetVersionTest extends BaseVersionTest { .build()) .build(); + public GetVersionTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersion() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java index b61b54bd49..a7059044f5 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionUpsertSATest.java @@ -57,6 +57,10 @@ public class GetVersionUpsertSATest extends BaseVersionTest { .build()) .build(); + public GetVersionUpsertSATest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersion() { TestWorkflow1 workflowStub = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java index f13d97067e..53878e7d48 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWithoutCommandEventTest.java @@ -35,6 +35,10 @@ public class GetVersionWithoutCommandEventTest extends BaseVersionTest { .build()) .build(); + public GetVersionWithoutCommandEventTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionWithoutCommandEvent() throws Exception { executionStarted = new CompletableFuture(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java index c3355bc600..d5c811552e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java @@ -36,6 +36,10 @@ public class GetVersionWorkflowRemoveTest extends BaseVersionTest { .build()) .build(); + public GetVersionWorkflowRemoveTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionWorkflowRemove() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java index c9f228a448..de68b1635d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java @@ -37,6 +37,11 @@ public class GetVersionWorkflowReplaceCompletelyTest extends BaseVersionTest { .build()) .build(); + public GetVersionWorkflowReplaceCompletelyTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionWorkflowReplaceCompletely() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java index 9368b6c0b9..daf5abdd76 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java @@ -37,6 +37,11 @@ public class GetVersionWorkflowReplaceGetVersionIdTest extends BaseVersionTest { .build()) .build(); + public GetVersionWorkflowReplaceGetVersionIdTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testGetVersionWorkflowReplaceGetVersionId() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java index cce7784d4a..4b11599289 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/VersionNotSupportedWithConflictingRangesExecutionTest.java @@ -40,6 +40,11 @@ public class VersionNotSupportedWithConflictingRangesExecutionTest extends BaseV .build()) .build(); + public VersionNotSupportedWithConflictingRangesExecutionTest( + boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + @Test public void testVersionNotSupported() { TestWorkflow1 workflowStub = From 6bcb938ff9ccba60871d6170678b53e5c12ce014 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Mon, 26 May 2025 16:25:09 -0700 Subject: [PATCH 3/5] update some comments --- .../internal/history/VersionMarkerUtils.java | 16 ++++++++------- .../replay/ReplayWorkflowContextImpl.java | 2 +- .../testGetVersionHistoryUpsertSA.json | 2 +- ...ltipleLargeGetVersionInSignalsHistory.json | 20 +++++++++---------- ...rgeGetVersionInSignalsUpsertSAHistory.json | 20 +++++++++---------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java b/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java index 8dad397cfc..3071d3a563 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/history/VersionMarkerUtils.java @@ -21,7 +21,8 @@ public class VersionMarkerUtils { public static final String MARKER_NAME = "Version"; public static final String MARKER_CHANGE_ID_KEY = "changeId"; public static final String MARKER_VERSION_KEY = "version"; - public static final String UPSERT_VERSION_SA_KEY = "upsertSA"; + // Key used to store if an upsert version search attribute was written while writing the marker. + public static final String VERSION_SA_UPDATED_KEY = "versionSearchAttributeUpdated"; // TemporalChangeVersion is used as search attributes key to find workflows with specific change // version. @@ -75,9 +76,9 @@ public static Integer getVersion(MarkerRecordedEventAttributes markerAttributes) @Nullable public static boolean getUpsertVersionSA(MarkerRecordedEventAttributes markerAttributes) { - Boolean upsertSA = - MarkerUtils.getValueFromMarker(markerAttributes, UPSERT_VERSION_SA_KEY, Boolean.class); - return upsertSA != null && upsertSA; + Boolean versionSearchAttributeUpdated = + MarkerUtils.getValueFromMarker(markerAttributes, VERSION_SA_UPDATED_KEY, Boolean.class); + return versionSearchAttributeUpdated != null && versionSearchAttributeUpdated; } public static RecordMarkerCommandAttributes createMarkerAttributes( @@ -88,9 +89,10 @@ public static RecordMarkerCommandAttributes createMarkerAttributes( MARKER_CHANGE_ID_KEY, DefaultDataConverter.STANDARD_INSTANCE.toPayloads(changeId).get()); details.put( MARKER_VERSION_KEY, DefaultDataConverter.STANDARD_INSTANCE.toPayloads(version).get()); - details.put( - UPSERT_VERSION_SA_KEY, - DefaultDataConverter.STANDARD_INSTANCE.toPayloads(upsertVersionSA).get()); + if (upsertVersionSA) { + details.put( + VERSION_SA_UPDATED_KEY, DefaultDataConverter.STANDARD_INSTANCE.toPayloads(true).get()); + } return RecordMarkerCommandAttributes.newBuilder() .setMarkerName(MARKER_NAME) .putAllDetails(details) diff --git a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java index fe829f92cc..72173d0a39 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java @@ -350,7 +350,7 @@ public void upsertSearchAttributes(@Nonnull SearchAttributes searchAttributes) { // When we enabled upserting of the search attribute by default, we should consider raising a // warning here. log.debug( - "{} is a reserved field. This can be set automatically by the SDK by calling `setEnableUpsertVersionSearchAttributes` on you `WorkflowImplementationOptions`", + "{} is a reserved field. This can be set automatically by the SDK by calling `setEnableUpsertVersionSearchAttributes` on your `WorkflowImplementationOptions`", TEMPORAL_CHANGE_VERSION.getName()); } workflowStateMachines.upsertSearchAttributes(searchAttributes); diff --git a/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json b/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json index d0f20d5025..71b27f1511 100644 --- a/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json +++ b/temporal-sdk/src/test/resources/testGetVersionHistoryUpsertSA.json @@ -100,7 +100,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { diff --git a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json index c82f39425e..8c2a622486 100644 --- a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json +++ b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsHistory.json @@ -111,7 +111,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -260,7 +260,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -302,7 +302,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -344,7 +344,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -567,7 +567,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -609,7 +609,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -651,7 +651,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -693,7 +693,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -735,7 +735,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -777,7 +777,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { diff --git a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json index c824d91327..22c35d29cf 100644 --- a/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json +++ b/temporal-sdk/src/test/resources/testMultipleLargeGetVersionInSignalsUpsertSAHistory.json @@ -176,7 +176,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -238,7 +238,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -407,7 +407,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -469,7 +469,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -531,7 +531,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -753,7 +753,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -815,7 +815,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -877,7 +877,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -919,7 +919,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { @@ -961,7 +961,7 @@ } ] }, - "upsertSA": { + "versionSearchAttributeUpdated": { "payloads": [ { "metadata": { From a7420921e8f7170b76efd5940e3206b8d7d2c954 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Tue, 27 May 2025 10:12:27 -0700 Subject: [PATCH 4/5] add continue as new test --- .../GetVersionContinueAsNewTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java new file mode 100644 index 0000000000..7e2513c6df --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java @@ -0,0 +1,106 @@ +package io.temporal.workflow.versionTests; + +import static io.temporal.internal.history.VersionMarkerUtils.TEMPORAL_CHANGE_VERSION; +import static org.junit.Assert.assertEquals; + +import io.temporal.api.common.v1.WorkflowExecution; +import io.temporal.api.enums.v1.EventType; +import io.temporal.api.history.v1.HistoryEvent; +import io.temporal.client.WorkflowClient; +import io.temporal.client.WorkflowStub; +import io.temporal.common.WorkflowExecutionHistory; +import io.temporal.internal.history.VersionMarkerUtils; +import io.temporal.testing.internal.SDKTestWorkflowRule; +import io.temporal.workflow.Workflow; +import io.temporal.workflow.WorkflowInterface; +import io.temporal.workflow.WorkflowMethod; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import org.junit.Rule; +import org.junit.Test; + +public class GetVersionContinueAsNewTest extends BaseVersionTest { + public GetVersionContinueAsNewTest(boolean setVersioningFlag, boolean upsertVersioningSA) { + super(setVersioningFlag, upsertVersioningSA); + } + + @Rule + public SDKTestWorkflowRule testWorkflowRule = + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestWorkflowImpl.class) + .setUseExternalService(true) + .build(); + + @Test + public void versionNotCarriedOverOnContinueAsNew() { + TestWorkflow workflow = testWorkflowRule.newWorkflowStubTimeoutOptions(TestWorkflow.class); + // Start workflow to obtain the first run id + WorkflowExecution run1 = WorkflowClient.start(workflow::execute, 2); + // Wait for workflow completion + WorkflowStub untyped = WorkflowStub.fromTyped(workflow); + untyped.getResult(Void.class); + // Point the untyped stub to the latest execution + untyped = + testWorkflowRule + .getWorkflowClient() + .newUntypedWorkflowStub( + run1.getWorkflowId(), Optional.of(run1.getRunId()), Optional.empty()); + WorkflowStub latestUntyped = + testWorkflowRule.getWorkflowClient().newUntypedWorkflowStub(run1.getWorkflowId()); + WorkflowExecution run2 = latestUntyped.getExecution(); + + WorkflowExecutionHistory history1 = + testWorkflowRule.getWorkflowClient().fetchHistory(run1.getWorkflowId(), run1.getRunId()); + List markers1 = + history1.getEvents().stream() + .filter(e -> e.getEventType() == EventType.EVENT_TYPE_MARKER_RECORDED) + .collect(Collectors.toList()); + assertEquals(1, markers1.size()); + assertEquals( + 2, + VersionMarkerUtils.getVersion(markers1.get(0).getMarkerRecordedEventAttributes()) + .intValue()); + if (upsertVersioningSA) { + assertEquals( + Collections.singletonList("change-2"), + untyped.describe().getTypedSearchAttributes().get(TEMPORAL_CHANGE_VERSION)); + } + + WorkflowExecutionHistory history2 = + testWorkflowRule.getWorkflowClient().fetchHistory(run2.getWorkflowId(), run2.getRunId()); + List markers2 = + history2.getEvents().stream() + .filter(e -> e.getEventType() == EventType.EVENT_TYPE_MARKER_RECORDED) + .collect(Collectors.toList()); + assertEquals(1, markers2.size()); + assertEquals( + 1, + VersionMarkerUtils.getVersion(markers2.get(0).getMarkerRecordedEventAttributes()) + .intValue()); + if (upsertVersioningSA) { + assertEquals( + Collections.singletonList("change-1"), + latestUntyped.describe().getTypedSearchAttributes().get(TEMPORAL_CHANGE_VERSION)); + } + } + + @WorkflowInterface + public interface TestWorkflow { + @WorkflowMethod + void execute(int runs); + } + + public static class TestWorkflowImpl implements TestWorkflow { + @Override + public void execute(int runs) { + int version = Workflow.getVersion("change", Workflow.DEFAULT_VERSION, runs); + assertEquals(runs, version); + if (runs > 1) { + TestWorkflow next = Workflow.newContinueAsNewStub(TestWorkflow.class); + next.execute(runs - 1); + } + } + } +} From 35d1dc894e05b09d4e7ae83972e13fbe06605c51 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Tue, 27 May 2025 11:17:48 -0700 Subject: [PATCH 5/5] Fix GetVersionContinueAsNewTest --- .../workflow/versionTests/GetVersionContinueAsNewTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java index 7e2513c6df..50db1a0f1a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionContinueAsNewTest.java @@ -30,7 +30,6 @@ public GetVersionContinueAsNewTest(boolean setVersioningFlag, boolean upsertVers public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder() .setWorkflowTypes(getDefaultWorkflowImplementationOptions(), TestWorkflowImpl.class) - .setUseExternalService(true) .build(); @Test