{"record":{"id":"64a7942a464ba841","repo":"apache/seatunnel","slug":"wait-worker-register-error","errorCode":null,"errorMessage":"wait worker register error","messagePattern":"wait worker register error","errorType":"exception","errorClass":"SeaTunnelEngineException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/CoordinatorService.java","lineNumber":1053,"sourceCode":"                                entry.getKey(), e.getMessage()));\n                continue;\n            }\n            if (jobState instanceof JobStatus && ((JobStatus) jobState).isEndState()) {\n                restoreJobFromMasterActiveSwitch(entry.getKey(), entry.getValue());\n                zombieIterator.remove();\n            }\n        }\n        if (needRestoreFromMasterNodeSwitchJobs.isEmpty()) {\n            return;\n        }\n        // waiting have worker registered\n        while (getResourceManager().workerCount(Collections.emptyMap()) == 0) {\n            try {\n                logger.info(\"Waiting for worker registered\");\n                Thread.sleep(1000);\n            } catch (InterruptedException e) {\n                logger.severe(ExceptionUtils.getMessage(e));\n                throw new SeaTunnelEngineException(\"wait worker register error\", e);\n            }\n        }\n        List<CompletableFuture<Void>> collect =\n                needRestoreFromMasterNodeSwitchJobs.stream()\n                        .map(\n                                entry ->\n                                        CompletableFuture.runAsync(\n                                                () -> {\n                                                    logger.info(\n                                                            String.format(\n                                                                    \"begin restore job (%s) from master active switch\",\n                                                                    entry.getKey()));\n                                                    try {\n                                                        // skip the job new submit\n                                                        if (!runningJobMasterMap.containsKey(\n                                                                entry.getKey())) {\n                                                            restoreJobFromMasterActiveSwitch(\n                                                                    entry.getKey(),","sourceCodeStart":1035,"sourceCodeEnd":1071,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/CoordinatorService.java#L1035-L1071","documentation":"After a master switch, restoreAllRunningJobFromMasterNodeSwitch() blocks until at least one worker registers with the ResourceManager, polling every second. The wait loop is interrupted via Thread.currentThread() interrupt; the code logs it and throws SeaTunnelEngineException('wait worker register error'). This means the coordinator thread waiting for workers was interrupted rather than workers being unavailable per se.","triggerScenarios":"The coordinator/master thread executing restoreAllRunningJobFromMasterNodeSwitch receives an interrupt (node shutdown, thread pool termination, engine stop) while sleeping in the 1-second poll loop waiting for worker count > 0.","commonSituations":"Shutting down a Zeta master node while no workers have registered yet (e.g. cluster startup racing with shutdown); killing the node process; deployment scripts that restart masters before workers join.","solutions":["Ensure at least one worker node is started and registered before/while masters activate","Avoid shutting down or interrupting the master during the worker-wait window; stop workers after jobs are restored","Check logs for what interrupted the thread (shutdown hook, Hazelcast member removal) and sequence node lifecycle accordingly","Increase cluster startup orchestration delays so workers register promptly after master election","If restore is failing during scheduled restarts, move job restore off the shutdown path or increase OPERATION_RETRY settings"],"exampleFix":"// before\nwhile (getResourceManager().workerCount(Collections.emptyMap()) == 0) {\n    Thread.sleep(1000);\n}\n// after\nlong deadline = System.currentTimeMillis() + 120_000L;\nwhile (getResourceManager().workerCount(Collections.emptyMap()) == 0) {\n    if (System.currentTimeMillis() > deadline) {\n        throw new SeaTunnelEngineException(\"Timed out waiting for worker registration\");\n    }\n    Thread.sleep(1000);\n}","handlingStrategy":"try-catch","validationCode":"// before triggering master restore, ensure workers are registered\nif (resourceManager.workerCount(Collections.emptyMap()) == 0) {\n    logger.warning(\"No workers registered; start workers before master activation/restore\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    restoreAllRunningJobs();\n} catch (SeaTunnelEngineException e\n        && e.getMessage().equals(\"wait worker register error\")) {\n    logger.warning(\"Restore wait loop interrupted; check node shutdown ordering: \" + e.getCause());\n}","preventionTips":["Start workers before masters or ensure workers rejoin quickly after failover","Do not stop/restart nodes during the worker-wait phase of restore","Sequence rolling restarts: wait for job restore completion before shutting a node down","Automate cluster startup so workers register within seconds of master election"],"tags":["interrupted","worker-registration","failover","zeta-engine"],"backgroundTag":"invalid-state-transition","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}