{"record":{"id":"23080b9092d0c60a","repo":"conductor-oss/conductor","slug":"failed-to-remove-event-handler-s","errorCode":null,"errorMessage":"Failed to remove event handler: %s","messagePattern":"Failed to remove event handler: (.+?)","errorType":"exception","errorClass":"TransientException","httpStatus":500,"severity":"error","filePath":"cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAO.java","lineNumber":87,"sourceCode":"    public void addEventHandler(EventHandler eventHandler) {\n        insertOrUpdateEventHandler(eventHandler);\n    }\n\n    @Override\n    public void updateEventHandler(EventHandler eventHandler) {\n        insertOrUpdateEventHandler(eventHandler);\n    }\n\n    @Override\n    public void removeEventHandler(String name) {\n        try {\n            recordCassandraDaoRequests(\"removeEventHandler\");\n            session.execute(deleteEventHandlerStatement.bind(name));\n        } catch (Exception e) {\n            Monitors.error(CLASS_NAME, \"removeEventHandler\");\n            String errorMsg = String.format(\"Failed to remove event handler: %s\", name);\n            LOGGER.error(errorMsg, e);\n            throw new TransientException(errorMsg, e);\n        }\n    }\n\n    @Override\n    public List<EventHandler> getAllEventHandlers() {\n        return getAllEventHandlersFromDB();\n    }\n\n    @Override\n    public List<EventHandler> getEventHandlersForEvent(String event, boolean activeOnly) {\n        if (activeOnly) {\n            return getAllEventHandlers().stream()\n                    .filter(eventHandler -> eventHandler.getEvent().equals(event))\n                    .filter(EventHandler::isActive)\n                    .collect(Collectors.toList());\n        } else {\n            return getAllEventHandlers().stream()\n                    .filter(eventHandler -> eventHandler.getEvent().equals(event))","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAO.java#L69-L105","documentation":"Thrown by CassandraEventHandlerDAO.removeEventHandler when the delete statement fails. Any Exception during session.execute(deleteEventHandlerStatement.bind(name)) is wrapped in a TransientException, signalling the failure may succeed on retry (Cassandra connectivity/coordinator issue).","triggerScenarios":"Calling removeEventHandler(String name) when the Cassandra session is unavailable, times out, or the coordinator rejects the delete. Also triggered by a null/invalid handler name that the driver rejects.","commonSituations":"Cassandra cluster down or network partition. Keyspace/table schema not initialized (init() failed earlier). Driver connection pool exhausted. Coordinator node restarted mid-request.","solutions":["Verify the Cassandra cluster is reachable and healthy (nodetool status).","Confirm CassandraBaseDAO.init() ran successfully at startup (keyspace and event handler tables created).","Retry the remove operation — TransientException indicates a potentially recoverable failure.","Check driver logs for connection/timeouts and tune read/connect timeout and pooling."],"exampleFix":"// before\npublic void removeEventHandler(String name) {\n    session.execute(deleteEventHandlerStatement.bind(name));\n}\n\n// after (caller-side retry for TransientException)\nRetryTemplate.builder().maxAttempts(3)\n    .exponentialBackoff(100, 2, 1000).build()\n    .execute(ctx -> { dao.removeEventHandler(name); return null; });","handlingStrategy":"retry","validationCode":"// Validate the handler name is non-blank before deleting\nif (name == null || name.isBlank()) throw new IllegalArgumentException(\"handler name required\");","typeGuard":null,"tryCatchPattern":"try {\n    dao.removeEventHandler(name);\n} catch (TransientException e) {\n    log.warn(\"Transient failure removing handler {}; retrying\", name);\n    throw e; // let a retry policy (e.g. Spring Retry) handle it","preventionTips":["Use Spring Retry / a retry wrapper around EventHandlerDAO writes for TransientException.","Monitor Cassandra health so transient failures are caught early.","Ensure init() completed so tables exist before delete operations."],"tags":["cassandra","event-handler","delete","transient","persistence"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}