{"record":{"id":"009fe91aa2063182","repo":"apache/dolphinscheduler","slug":"workflowserialcoordinator-is-already-started","errorCode":null,"errorMessage":"\"WorkflowSerialCoordinator is already started\"","messagePattern":"\"WorkflowSerialCoordinator is already started\"","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/workflow/serial/WorkflowSerialCoordinator.java","lineNumber":80,"sourceCode":"    @Autowired\n    private SerialCommandDiscardHandler serialCommandDiscardHandler;\n\n    @Autowired\n    private SerialCommandPriorityHandler serialCommandPriorityHandler;\n\n    private volatile boolean flag = false;\n\n    private Thread internalThread;\n\n    private static final int DEFAULT_FETCH_SIZE = 1000;\n\n    private static final int DEFAULT_FETCH_INTERVAL_SECONDS = 5;\n\n    @Override\n    public synchronized void start() {\n        log.info(\"WorkflowSerialCoordinator starting...\");\n        if (flag) {\n            throw new IllegalStateException(\"WorkflowSerialCoordinator is already started\");\n        }\n        if (internalThread != null) {\n            throw new IllegalStateException(\"InternalThread is already started\");\n        }\n        flag = true;\n        internalThread = new BaseDaemonThread(this::doStart) {\n        };\n        internalThread.setName(\"WorkflowSerialCoordinator-Thread\");\n        internalThread.start();\n        log.info(\"WorkflowSerialCoordinator started...\");\n    }\n\n    private void doStart() {\n        while (flag) {\n            try {\n                final StopWatch workflowSerialCoordinatorRoundCost = StopWatch.createStarted();\n                final List<SerialCommandsGroup> serialCommandsGroups = fetchSerialCommands();\n                serialCommandsGroups.forEach(this::handleSerialCommand);","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/workflow/serial/WorkflowSerialCoordinator.java#L62-L98","documentation":"WorkflowSerialCoordinator.start() is guarded so it can only be started once; calling it again when the started flag is set throws this IllegalStateException. This protects the single internal daemon thread that polls serial commands.","triggerScenarios":"Calling start() a second time on the same coordinator instance, e.g. duplicate lifecycle start from Spring context refresh or manual re-initialization.","commonSituations":"Misconfigured bean lifecycle causing double start, tests calling start() repeatedly without recreating the object.","solutions":["Ensure start() is invoked once per coordinator instance","Check for duplicate bean initialization in Spring config/component scanning","Create a new coordinator instance before restarting","Guard calls with the coordinator's own lifecycle state"],"exampleFix":"// before\ncoordinator.start();\ncoordinator.start(); // throws\n// after\nif (!coordinator.isStarted()) coordinator.start();","handlingStrategy":"validation","validationCode":"if (coordinatorStarted) { /* skip start */ } else { coordinator.start(); coordinatorStarted = true; }","typeGuard":"boolean canStart(WorkflowSerialCoordinator c) { return !c.isStarted() && !c.isClosed(); }","tryCatchPattern":"try { coordinator.start(); } catch (IllegalStateException e) { log.warn(\"coordinator already started: {}\", e.getMessage()); }","preventionTips":["Call start() exactly once per instance lifecycle","Avoid duplicate Spring bean initialization","Create a new instance for restarts"],"tags":["java","lifecycle","master"],"backgroundTag":"invalid-state-transition","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"}