{"record":{"id":"aac97f4b2df98edd","repo":"conductor-oss/conductor","slug":"workflow-s-version-s-already-exists","errorCode":null,"errorMessage":"Workflow: %s, version: %s already exists!","messagePattern":"Workflow: (.+?), version: (.+?) already exists!","errorType":"exception","errorClass":"ConflictException","httpStatus":409,"severity":"error","filePath":"cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java","lineNumber":173,"sourceCode":"        } catch (DriverException e) {\n            Monitors.error(CLASS_NAME, \"removeTaskDef\");\n            String errorMsg = String.format(\"Failed to remove task definition: %s\", name);\n            LOGGER.error(errorMsg, e);\n            throw new TransientException(errorMsg, e);\n        }\n    }\n\n    @Override\n    public void createWorkflowDef(WorkflowDef workflowDef) {\n        try {\n            String workflowDefinition = toJson(workflowDef);\n            if (!session.execute(\n                            insertWorkflowDefStatement.bind(\n                                    workflowDef.getName(),\n                                    workflowDef.getVersion(),\n                                    workflowDefinition))\n                    .wasApplied()) {\n                throw new ConflictException(\n                        \"Workflow: %s, version: %s already exists!\",\n                        workflowDef.getName(), workflowDef.getVersion());\n            }\n            String workflowDefIndex =\n                    getWorkflowDefIndexValue(workflowDef.getName(), workflowDef.getVersion());\n            session.execute(\n                    insertWorkflowDefVersionIndexStatement.bind(\n                            workflowDefIndex, workflowDefIndex));\n            recordCassandraDaoRequests(\"createWorkflowDef\");\n            recordCassandraDaoPayloadSize(\n                    \"createWorkflowDef\", workflowDefinition.length(), \"n/a\", workflowDef.getName());\n        } catch (DriverException e) {\n            Monitors.error(CLASS_NAME, \"createWorkflowDef\");\n            String errorMsg =\n                    String.format(\n                            \"Error creating workflow definition: %s/%d\",\n                            workflowDef.getName(), workflowDef.getVersion());\n            LOGGER.error(errorMsg, e);","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java#L155-L191","documentation":"Thrown by CassandraMetadataDAO.createWorkflowDef when a Cassandra lightweight transaction (an INSERT ... IF NOT EXISTS) returns wasApplied()==false, meaning a WorkflowDef row with the same name+version already exists in the workflow_def table. ConflictException maps to an HTTP 409-style duplicate-registration error: the write was rejected because the resource is already present.","triggerScenarios":"Calling the metadata API (or MetadataDAO.createWorkflowDef) to register a workflow definition whose name+version pair already has a row committed in Cassandra. The LWT compare-and-set detects the existing key and rolls back, so wasApplied() is false.","commonSituations":"Re-running a deployment/bootstrap script that re-registers the same version; CI pipelines that create (rather than upsert) on every run; importing/migrating definitions without checking existence first; two concurrent registrants racing on the same version.","solutions":["Call updateWorkflowDef (or an upsert path) instead of create when the version may already exist.","Bump the WorkflowDef version to register the definition as a new variant.","Remove the existing definition (removeWorkflowDef) before re-creating it.","Make registration scripts idempotent: check getWorkflowDef(name, version) first and skip or update when present."],"exampleFix":"// before: always create, fails on re-run\nmetadataDAO.createWorkflowDef(def);\n\n// after: idempotent check-then-create/update\nif (metadataDAO.getWorkflowDef(def.getName(), def.getVersion()).isPresent()) {\n    metadataDAO.updateWorkflowDef(def);\n} else {\n    metadataDAO.createWorkflowDef(def);\n}","handlingStrategy":"validation","validationCode":"// Check existence before creating to avoid the conflict\nboolean exists = metadataDAO\n        .getWorkflowDef(def.getName(), def.getVersion())\n        .isPresent();\nif (exists) {\n    throw new IllegalStateException(\n        \"Workflow \" + def.getName() + \"/\" + def.getVersion()\n        + \" already exists; use update instead of create\");\n}","typeGuard":null,"tryCatchPattern":"// Treat a conflict as 'already registered' and fall back to update\ntry {\n    metadataDAO.createWorkflowDef(def);\n} catch (ConflictException e) {\n    LOGGER.info(\"Workflow already exists, updating: {}/{}\",\n        def.getName(), def.getVersion());\n    metadataDAO.updateWorkflowDef(def);\n}","preventionTips":["Make registration scripts idempotent: check-then-create-or-update.","Prefer updateWorkflowDef for re-deploys of the same version.","Use unique versions for new definitions rather than overwriting.","Wrap bulk imports in a conflict handler that upserts instead of failing."],"tags":["cassandra","workflow-definition","conflict","duplicate","lwt"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}