apache/seatunnel · error · SeaTunnelEngineException
wait worker register error
Error message
wait worker register error
What it means
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.
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
Example fix
// before
while (getResourceManager().workerCount(Collections.emptyMap()) == 0) {
Thread.sleep(1000);
}
// after
long deadline = System.currentTimeMillis() + 120_000L;
while (getResourceManager().workerCount(Collections.emptyMap()) == 0) {
if (System.currentTimeMillis() > deadline) {
throw new SeaTunnelEngineException("Timed out waiting for worker registration");
}
Thread.sleep(1000);
} Defensive patterns
Strategy: try-catch
Validate before calling
// before triggering master restore, ensure workers are registered
if (resourceManager.workerCount(Collections.emptyMap()) == 0) {
logger.warning("No workers registered; start workers before master activation/restore");
} Try / catch
try {
restoreAllRunningJobs();
} catch (SeaTunnelEngineException e
&& e.getMessage().equals("wait worker register error")) {
logger.warning("Restore wait loop interrupted; check node shutdown ordering: " + e.getCause());
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Job id restore interrupted while entering pending queue
- Can not get coordinator service from an active master node.
- Failed to fetch running jobs from IMap during master switch…
- Failed to load readyToCloseStartingTask from IMap, key
- Failed to persist readyToCloseStartingTask to IMap, key
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/64a7942a464ba841.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/CoordinatorService.java:1053
entry.getKey(), e.getMessage()));
continue;
}
if (jobState instanceof JobStatus && ((JobStatus) jobState).isEndState()) {
restoreJobFromMasterActiveSwitch(entry.getKey(), entry.getValue());
zombieIterator.remove();
}
}
if (needRestoreFromMasterNodeSwitchJobs.isEmpty()) {
return;
}
// waiting have worker registered
while (getResourceManager().workerCount(Collections.emptyMap()) == 0) {
try {
logger.info("Waiting for worker registered");
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.severe(ExceptionUtils.getMessage(e));
throw new SeaTunnelEngineException("wait worker register error", e);
}
}
List<CompletableFuture<Void>> collect =
needRestoreFromMasterNodeSwitchJobs.stream()
.map(
entry ->
CompletableFuture.runAsync(
() -> {
logger.info(
String.format(
"begin restore job (%s) from master active switch",
entry.getKey()));
try {
// skip the job new submit
if (!runningJobMasterMap.containsKey(
entry.getKey())) {
restoreJobFromMasterActiveSwitch(
entry.getKey(),View on GitHub (pinned to cf67b549a7)