{"record":{"id":"e03b5d4da87f108e","repo":"apache/seatunnel","slug":"seatunnel-server-is-not-available-on-this-node","errorCode":null,"errorMessage":"SeaTunnel server is not available on this node.","messagePattern":"SeaTunnel server is not available on this node\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LoggerLevelService.java","lineNumber":254,"sourceCode":"    }\n\n    private JsonObject loggerJson(String name, Level level) {\n        JsonObject logger =\n                new JsonObject()\n                        .add(NAME, name)\n                        .add(LEVEL, level == null ? null : level.name())\n                        .add(ORIGIN, LogLevels.origin(name));\n        Level fileLevel = LogLevels.levelBeforeOverride(name);\n        if (fileLevel != null) {\n            logger.add(FILE_LEVEL, fileLevel.name());\n        }\n        return logger;\n    }\n\n    private HttpConfig httpConfig() {\n        SeaTunnelServer seaTunnelServer = getSeaTunnelServer(false);\n        if (seaTunnelServer == null) {\n            throw new IllegalStateException(\"SeaTunnel server is not available on this node.\");\n        }\n        return seaTunnelServer.getSeaTunnelConfig().getEngineConfig().getHttpConfig();\n    }\n\n    private String nodeId() {\n        return nodeEngine.getThisAddress().getHost() + \":\" + httpConfig().getPort();\n    }\n\n    /**\n     * Short reason of a failed member request, the stack trace goes to the node log instead. The\n     * root cause is reported, because the wrappers a failed operation collects on the way out\n     * ({@code CompletionException} around an {@code ExecutionException} around the real failure)\n     * say nothing about what went wrong.\n     */\n    private static String errorMessage(Throwable t) {\n        Throwable cause = t;\n        while (cause.getCause() != null && cause.getCause() != cause) {\n            cause = cause.getCause();","sourceCodeStart":236,"sourceCodeEnd":272,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LoggerLevelService.java#L236-L272","documentation":"LoggerLevelService.httpConfig resolves the node's HttpConfig through the SeaTunnelServer obtained from the Hazelcast NodeEngine. When the SeaTunnel server extension is not registered on the current node (e.g. the node is a client-lite member or the engine server was not started), it throws this IllegalStateException because log-level management cannot proceed without the engine's HTTP configuration.","triggerScenarios":"Calling any logger-level REST operation against a cluster node where getSeaTunnelServer(false) returns null — i.e. the SeaTunnelServer service is not available in that member's NodeEngine services map.","commonSituations":"Hitting the wrong node in a mixed deployment where some members run only Hazelcast without the SeaTunnel engine; misconfigured extension services after a partial startup; sending the request to a client-coordinator node instead of a worker/master node.","solutions":["Send the logger-level request to a node that runs the full SeaTunnel engine (master/worker), not a lite/client member.","Check node startup logs for SeaTunnelServer initialization errors; fix the failed server bootstrap and restart the node.","Verify the cluster configuration so all engine members register the SeaTunnelServer extension service."],"exampleFix":"// before\n# request routed to a node without the engine\ncurl -X GET 'http://lite-node:8080/log-level'\n// after\n# route to a master/worker node running the engine\ncurl -X GET 'http://master-node:8080/log-level'","handlingStrategy":"type-guard","validationCode":"// check the node runs the engine before calling logger-level APIs\nif (!isEngineNode(nodeAddress)) throw new Error(\"logger-level API requires a master/worker node, not a lite member\");","typeGuard":"boolean isEngineNode(Address address) {\n  SeaTunnelServer srv = nodeEngine.getService(SeaTunnelServer.SERVICE_NAME);\n  return srv != null;\n}","tryCatchPattern":"try { getLogLevel(node); } catch (IllegalStateException e) { if (e.getMessage().contains(\"SeaTunnel server is not available\")) { routeToEngineNode(node); } else throw e; }","preventionTips":["Maintain a registry of engine-enabled node addresses and send management APIs only to them.","Verify SeaTunnelServer started successfully in node logs after each deployment.","Avoid lite/client-only members in clusters managed via the REST API."],"tags":["rest-api","cluster","engine","state"],"backgroundTag":"resource-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}