conductor-oss/conductor · error · TransientException

Failed to remove event handler: %s

Error message

Failed to remove event handler: %s

What it means

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).

Source

Thrown at cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAO.java:87

    public void addEventHandler(EventHandler eventHandler) {
        insertOrUpdateEventHandler(eventHandler);
    }

    @Override
    public void updateEventHandler(EventHandler eventHandler) {
        insertOrUpdateEventHandler(eventHandler);
    }

    @Override
    public void removeEventHandler(String name) {
        try {
            recordCassandraDaoRequests("removeEventHandler");
            session.execute(deleteEventHandlerStatement.bind(name));
        } catch (Exception e) {
            Monitors.error(CLASS_NAME, "removeEventHandler");
            String errorMsg = String.format("Failed to remove event handler: %s", name);
            LOGGER.error(errorMsg, e);
            throw new TransientException(errorMsg, e);
        }
    }

    @Override
    public List<EventHandler> getAllEventHandlers() {
        return getAllEventHandlersFromDB();
    }

    @Override
    public List<EventHandler> getEventHandlersForEvent(String event, boolean activeOnly) {
        if (activeOnly) {
            return getAllEventHandlers().stream()
                    .filter(eventHandler -> eventHandler.getEvent().equals(event))
                    .filter(EventHandler::isActive)
                    .collect(Collectors.toList());
        } else {
            return getAllEventHandlers().stream()
                    .filter(eventHandler -> eventHandler.getEvent().equals(event))

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Verify the Cassandra cluster is reachable and healthy (nodetool status).
  2. Confirm CassandraBaseDAO.init() ran successfully at startup (keyspace and event handler tables created).
  3. Retry the remove operation — TransientException indicates a potentially recoverable failure.
  4. Check driver logs for connection/timeouts and tune read/connect timeout and pooling.

Example fix

// before
public void removeEventHandler(String name) {
    session.execute(deleteEventHandlerStatement.bind(name));
}

// after (caller-side retry for TransientException)
RetryTemplate.builder().maxAttempts(3)
    .exponentialBackoff(100, 2, 1000).build()
    .execute(ctx -> { dao.removeEventHandler(name); return null; });
Defensive patterns

Strategy: retry

Validate before calling

// Validate the handler name is non-blank before deleting
if (name == null || name.isBlank()) throw new IllegalArgumentException("handler name required");

Try / catch

try {
    dao.removeEventHandler(name);
} catch (TransientException e) {
    log.warn("Transient failure removing handler {}; retrying", name);
    throw e; // let a retry policy (e.g. Spring Retry) handle it

Prevention

When it happens

Trigger: 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.

Common situations: Cassandra cluster down or network partition. Keyspace/table schema not initialized (init() failed earlier). Driver connection pool exhausted. Coordinator node restarted mid-request.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/23080b9092d0c60a. Report an issue: GitHub.