fix(orchestration): Prevent workf. cancellation to execute while rescheduling (#12903)

**What**
Currently, when cancelling async workflows, the step will get rescheduled while the current worker try to continue the execution leading to concurrency failure on compensation. This pr prevent the current worker from executing while an async step gets rescheduled

Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>
This commit is contained in:
Adrien de Peretti
2025-07-16 16:44:09 +02:00
committed by GitHub
parent eb83954f23
commit c5d609d09c
9 changed files with 305 additions and 63 deletions

View File

@@ -151,7 +151,7 @@ moduleIntegrationTestRunner<IWorkflowEngineService>({
describe("Testing basic workflow", function () {
describe("Cancel transaction", function () {
it("should cancel an ongoing execution with async unfinished yet step", async () => {
it("should cancel an ongoing execution with async unfinished yet step", (done) => {
const transactionId = "transaction-to-cancel-id"
const step1 = createStep("step1", async () => {
return new StepResponse("step1")
@@ -179,25 +179,42 @@ moduleIntegrationTestRunner<IWorkflowEngineService>({
}
)
await workflowOrcModule.run(workflowId, {
input: {},
transactionId,
})
workflowOrcModule
.run(workflowId, {
input: {},
transactionId,
})
.then(async () => {
await setTimeout(100)
await setTimeout(100)
await workflowOrcModule.cancel(workflowId, {
transactionId,
})
await workflowOrcModule.cancel(workflowId, {
transactionId,
})
workflowOrcModule.subscribe({
workflowId,
transactionId,
subscriber: async (event) => {
if (event.eventType === "onFinish") {
const execution =
await workflowOrcModule.listWorkflowExecutions({
transaction_id: transactionId,
})
await setTimeout(1000)
expect(execution.length).toEqual(1)
expect(execution[0].state).toEqual(
TransactionState.REVERTED
)
done()
}
},
})
})
const execution = await workflowOrcModule.listWorkflowExecutions({
transaction_id: transactionId,
})
expect(execution.length).toEqual(1)
expect(execution[0].state).toEqual(TransactionState.REVERTED)
failTrap(
done,
"should cancel an ongoing execution with async unfinished yet step"
)
})
it("should cancel a complete execution with a sync workflow running as async", async () => {