Skip to content

Commit

Permalink
Add workflow id conflict policy to signal with start (#322)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sushisource authored Aug 5, 2024
1 parent ac9c891 commit 62da5d6
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Temporalio/Client/TemporalClient.Workflow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,7 @@ private async Task<WorkflowHandle<TWorkflow, TResult>> StartWorkflowInternalAsyn
Header = req.Header,
WorkflowStartDelay = req.WorkflowStartDelay,
SignalName = input.Options.StartSignal,
WorkflowIdConflictPolicy = input.Options.IdConflictPolicy,
};
if (input.Options.StartSignalArgs != null && input.Options.StartSignalArgs.Count > 0)
{
Expand Down
41 changes: 41 additions & 0 deletions tests/Temporalio.Tests/Worker/WorkflowWorkerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5618,9 +5618,20 @@ await AssertWarnings(
[Workflow]
public class IdConflictWorkflow
{
private string signal = "nothing";

// Just wait forever
[WorkflowRun]
public Task RunAsync() => Workflow.WaitConditionAsync(() => false);

[WorkflowSignal]
public async Task TheSignal(string sig)
{
signal = sig;
}

[WorkflowQuery]
public string GetSignal() => signal;
}

[Fact]
Expand Down Expand Up @@ -5648,6 +5659,7 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
{
IdConflictPolicy = WorkflowIdConflictPolicy.Fail,
}));
// signal-with-start does not allow fail policy

// Confirm gives back same handle if requested
var newHandle = await Env.Client.StartWorkflowAsync(
Expand All @@ -5660,6 +5672,19 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
Assert.Equal(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Running, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Also with signal-with-start
newHandle = await Env.Client.StartWorkflowAsync(
(IdConflictWorkflow wf) => wf.RunAsync(),
new(id: handle.Id, taskQueue: worker.Options.TaskQueue!)
{
StartSignal = "TheSignal",
StartSignalArgs = new[] { "hi!" },
IdConflictPolicy = WorkflowIdConflictPolicy.UseExisting,
});
newHandle = newHandle with { RunId = newHandle.ResultRunId };
Assert.Equal(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Running, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);

// Confirm terminates and starts new if requested
newHandle = await Env.Client.StartWorkflowAsync(
Expand All @@ -5672,6 +5697,22 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
Assert.NotEqual(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Terminated, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Also with signal-with-start
newHandle = await Env.Client.StartWorkflowAsync(
(IdConflictWorkflow wf) => wf.RunAsync(),
new(id: handle.Id, taskQueue: worker.Options.TaskQueue!)
{
StartSignal = "TheSignal",
StartSignalArgs = new[] { "hi!" },
IdConflictPolicy = WorkflowIdConflictPolicy.TerminateExisting,
});
newHandle = newHandle with { RunId = newHandle.ResultRunId };
Assert.NotEqual(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Terminated, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Ensure it actually got the signal this time
var queryRes = await newHandle.QueryAsync(wf => wf.GetSignal());
Assert.Equal("hi!", queryRes);
});
}

Expand Down

0 comments on commit 62da5d6

Please sign in to comment.