Return 409 on workflow updates race conditions (#4510)

This commit is contained in:
Stanislav Novosad
2026-01-21 15:45:52 -07:00
committed by GitHub
parent f879f4983c
commit f781a6f0ef
2 changed files with 38 additions and 24 deletions

View File

@@ -54,6 +54,14 @@ class FailedToUpdateWorkflow(BaseWorkflowHTTPException):
) )
class WorkflowVersionConflict(BaseWorkflowHTTPException):
def __init__(self, workflow_permanent_id: str) -> None:
super().__init__(
f"Concurrent update detected for workflow {workflow_permanent_id}. Please retry.",
status_code=status.HTTP_409_CONFLICT,
)
class OutputParameterKeyCollisionError(BaseWorkflowHTTPException): class OutputParameterKeyCollisionError(BaseWorkflowHTTPException):
def __init__(self, key: str, retry_count: int | None = None) -> None: def __init__(self, key: str, retry_count: int | None = None) -> None:
message = f"Output parameter key {key} already exists in the context manager." message = f"Output parameter key {key} already exists in the context manager."

View File

@@ -60,6 +60,7 @@ from skyvern.forge.sdk.schemas.workflow_runs import WorkflowRunBlock, WorkflowRu
from skyvern.forge.sdk.trace import TraceManager from skyvern.forge.sdk.trace import TraceManager
from skyvern.forge.sdk.workflow.exceptions import ( from skyvern.forge.sdk.workflow.exceptions import (
InvalidWorkflowDefinition, InvalidWorkflowDefinition,
WorkflowVersionConflict,
) )
from skyvern.forge.sdk.workflow.models.block import ( from skyvern.forge.sdk.workflow.models.block import (
BlockTypeVar, BlockTypeVar,
@@ -1586,6 +1587,7 @@ class WorkflowService:
sequential_key: str | None = None, sequential_key: str | None = None,
folder_id: str | None = None, folder_id: str | None = None,
) -> Workflow: ) -> Workflow:
try:
return await app.DATABASE.create_workflow( return await app.DATABASE.create_workflow(
title=title, title=title,
workflow_definition=workflow_definition.model_dump(), workflow_definition=workflow_definition.model_dump(),
@@ -1610,6 +1612,10 @@ class WorkflowService:
sequential_key=sequential_key, sequential_key=sequential_key,
folder_id=folder_id, folder_id=folder_id,
) )
except IntegrityError as e:
if "uc_org_permanent_id_version" in str(e) and workflow_permanent_id:
raise WorkflowVersionConflict(workflow_permanent_id) from e
raise
async def create_workflow_from_prompt( async def create_workflow_from_prompt(
self, self,