{"record":{"id":"b1090980fc4970d9","repo":"conductor-oss/conductor","slug":"failed-to-remove-workflow-definition-s-d","errorCode":null,"errorMessage":"Failed to remove workflow definition: %s/%d","messagePattern":"Failed to remove workflow definition: (.+?)/(.+?)","errorType":"exception","errorClass":"TransientException","httpStatus":500,"severity":"error","filePath":"cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java","lineNumber":266,"sourceCode":"            String errorMsg = String.format(\"Error fetching workflow def: %s/%d\", name, version);\n            LOGGER.error(errorMsg, e);\n            throw new TransientException(errorMsg, e);\n        }\n    }\n\n    @Override\n    public void removeWorkflowDef(String name, Integer version) {\n        try {\n            session.execute(deleteWorkflowDefStatement.bind(name, version));\n            session.execute(\n                    deleteWorkflowDefIndexStatement.bind(\n                            WORKFLOW_DEF_INDEX_KEY, getWorkflowDefIndexValue(name, version)));\n        } catch (DriverException e) {\n            Monitors.error(CLASS_NAME, \"removeWorkflowDef\");\n            String errorMsg =\n                    String.format(\"Failed to remove workflow definition: %s/%d\", name, version);\n            LOGGER.error(errorMsg, e);\n            throw new TransientException(errorMsg, e);\n        }\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public List<WorkflowDef> getAllWorkflowDefs() {\n        try {\n            ResultSet resultSet =\n                    session.execute(selectAllWorkflowDefsStatement.bind(WORKFLOW_DEF_INDEX_KEY));\n            List<Row> rows = resultSet.all();\n            if (rows.size() == 0) {\n                LOGGER.info(\"No workflow definitions were found.\");\n                return Collections.EMPTY_LIST;\n            }\n            return rows.stream()\n                    .map(\n                            row -> {\n                                String defNameVersion =","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java#L248-L284","documentation":"Thrown when a DriverException occurs during removeWorkflowDef, which issues two statements (delete the def row and delete its index entry). Either statement failing raises this TransientException. Note the two deletes are not atomic, so a failure between them can leave the index entry orphaned.","triggerScenarios":"session.execute(deleteWorkflowDefStatement.bind(...)) or the subsequent deleteWorkflowDefIndexStatement raises a DriverException while removing a workflow definition.","commonSituations":"Cluster unavailable mid-delete; partial failure leaving an orphaned index row (workflow appears gone from the def table but lingers in the version index); connection drop under load.","solutions":["Retry the remove operation - TransientException is retryable.","After a successful retry, verify the index entry is also gone (getAllWorkflowDefs) to detect/clean orphaned index rows.","Ensure cluster health and that the workflow_def / index tables exist.","Check the wrapped DriverException to distinguish timeout vs unavailable."],"exampleFix":"// before: single delete attempt, no recovery\nmetadataDAO.removeWorkflowDef(name, version);\n\n// after: retry, then reconcile orphaned index\nRetryUtils.retryOn(TransientException.class, 3, Duration.ofMillis(200),\n    () -> metadataDAO.removeWorkflowDef(name, version));","handlingStrategy":"retry","validationCode":"// Pre-flight: confirm connectivity before deleting\nif (cassandraSession.isClosed()) {\n    throw new IllegalStateException(\"Cassandra session is closed; cannot remove workflow def\");\n}","typeGuard":null,"tryCatchPattern":"// Retry remove; reconcile orphaned index entries afterward\ntry {\n    metadataDAO.removeWorkflowDef(name, version);\n} catch (TransientException e) {\n    backoffAndRetry(() -> metadataDAO.removeWorkflowDef(name, version), 3);\n}","preventionTips":["Retry removeWorkflowDef on TransientException.","After removal, verify the index entry is also gone to catch orphaned rows.","Run schema migrations so both the def and index tables exist.","Monitor for partial-delete anomalies during cluster instability."],"tags":["cassandra","workflow-definition","transient","network","driver","delete"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}