{"record":{"id":"3418348fc95acb96","repo":"apache/dolphinscheduler","slug":"cannot-find-taskstateaction-for-state-taskex","errorCode":null,"errorMessage":"\"Cannot find TaskStateAction for state: \" + taskExecutionStatus","messagePattern":"\"Cannot find TaskStateAction for state: \" \\+ taskExecutionStatus","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/task/statemachine/TaskStateActionFactory.java","lineNumber":43,"sourceCode":"import java.util.Map;\n\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class TaskStateActionFactory {\n\n    private final Map<TaskExecutionStatus, ITaskStateAction> taskStateActionMap = new HashMap<>();\n\n    public TaskStateActionFactory(List<ITaskStateAction> taskStateActions) {\n        taskStateActions.forEach(\n                taskStateAction -> taskStateActionMap.put(taskStateAction.matchState(), taskStateAction));\n        Arrays.stream(TaskExecutionStatus.values()).forEach(this::getTaskStateAction);\n    }\n\n    public ITaskStateAction getTaskStateAction(final TaskExecutionStatus taskExecutionStatus) {\n        final ITaskStateAction taskStateAction = taskStateActionMap.get(taskExecutionStatus);\n        if (taskStateAction == null) {\n            throw new IllegalArgumentException(\"Cannot find TaskStateAction for state: \" + taskExecutionStatus);\n        }\n        return taskStateAction;\n    }\n\n}\n","sourceCodeStart":25,"sourceCodeEnd":49,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/task/statemachine/TaskStateActionFactory.java#L25-L49","documentation":"Thrown by TaskStateActionFactory.getTaskStateAction when a TaskExecutionStatus enum value has no registered ITaskStateAction in the internal map. The factory is built by iterating all TaskExecutionStatus values and mapping them to state actions; a null lookup means the mapping table is incomplete or a new enum value was added without an action.","triggerScenarios":"Calling getTaskStateAction with a TaskExecutionStatus value that was not registered (e.g. KILL, or a newly added enum constant), or an enum value added in a version upgrade whose action implementation is missing.","commonSituations":"Upgrading DolphinScheduler where a new TaskExecutionStatus was introduced but the state-machine factory wasn't updated; task state callback arriving with an unexpected state from a newer worker.","solutions":["Check TaskExecutionStatus of the failing task and confirm which state has no mapping","Add/restore the corresponding ITaskStateAction registration in TaskStateActionFactory's constructor","Upgrade/align master and worker versions so state enums match","Wrap task state handling to log the raw status before lookup for diagnosis"],"exampleFix":"// before\npublic ITaskStateAction getTaskStateAction(final TaskExecutionStatus status) {\n    return taskStateActionMap.get(status); // NPE downstream\n}\n// after\npublic ITaskStateAction getTaskStateAction(final TaskExecutionStatus status) {\n    final ITaskStateAction action = taskStateActionMap.get(status);\n    if (action == null) throw new IllegalArgumentException(\"Cannot find TaskStateAction for state: \" + status);\n    return action;\n}","handlingStrategy":"validation","validationCode":"if (TaskExecutionStatus.valueOf(status.name()) != null && java.util.Arrays.stream(TaskExecutionStatus.values()).anyMatch(s -> s == status)) {\n    // proceed; additionally verify factory has an action registered\n}","typeGuard":"boolean hasAction(TaskExecutionStatus s) {\n    return java.util.Arrays.stream(TaskExecutionStatus.values()).anyMatch(v -> v == s);\n}","tryCatchPattern":"try { action = factory.getTaskStateAction(status); } catch (IllegalArgumentException e) { log.error(\"unmapped state {}\", status, e); return; }","preventionTips":["Register an action for every TaskExecutionStatus value in the factory constructor","Add a startup self-check that iterates all enum values and looks each up","Keep master and worker on matching versions"],"tags":["java","state-machine","illegal-argument"],"backgroundTag":"invalid-enum-value","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}