{"record":{"id":"e479e1cd806e68c0","repo":"apache/seatunnel","slug":"failed-to-get-http-port-from-member-skip","errorCode":null,"errorMessage":"Failed to get HTTP port from member {}, skip.","messagePattern":"Failed to get HTTP port from member (.+?), skip\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LogService.java","lineNumber":81,"sourceCode":"        HttpConfig httpConfig =\n                seaTunnelServer.getSeaTunnelConfig().getEngineConfig().getHttpConfig();\n        String contextPath = httpConfig.getContextPath();\n\n        List<Tuple3<String, String, String>> allLogNameList = new ArrayList<>();\n\n        for (Member member : nodeEngine.getClusterService().getMembers()) {\n            String host = member.getAddress().getHost();\n            int nodeHttpPort;\n            try {\n                nodeHttpPort =\n                        (int)\n                                NodeEngineUtil.sendOperationToMemberNode(\n                                                nodeEngine,\n                                                new GetNodeHttpPortOperation(),\n                                                member.getAddress())\n                                        .get();\n            } catch (Exception e) {\n                log.warn(\"Failed to get HTTP port from member {}, skip.\", member.getAddress(), e);\n                continue;\n            }\n\n            String url = \"http://\" + host + \":\" + nodeHttpPort + contextPath;\n            String logUrl = url + REST_URL_GET_ALL_LOG_NAME;\n\n            String allName =\n                    httpConfig.isEnableBasicAuth()\n                            ? sendGet(\n                                    logUrl,\n                                    httpConfig.getBasicAuthUsername(),\n                                    httpConfig.getBasicAuthPassword())\n                            : sendGet(logUrl);\n\n            if (StringUtils.isBlank(allName)) {\n                log.warn(\"GET {} returned empty body (null/empty). Skip this node.\", logUrl);\n                continue;\n            }","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LogService.java#L63-L99","documentation":"When enumerating log file names across all cluster nodes, LogService asks each member for its HTTP port via GetNodeHttpPortOperation. If that call fails for a member (timeout, member unreachable, operation exception), this warning is logged and the member is skipped, so its logs are absent from the aggregated list.","triggerScenarios":"Calling the all-log-names REST endpoint when one member is down, network partitioned, or its REST/HTTP service failed to start (port conflict, http disabled in config), making GetNodeHttpPortOperation hang or throw.","commonSituations":"Node crashed or being decommissioned during the request; seatunnel http port disabled/misconfigured on one node; firewall blocking inter-member REST port; slow node exceeding operation timeout.","solutions":["Check that the reported member is alive and its HTTP connector is enabled (http config in seatunnel.yaml / hazelcast config).","Fix network/firewall so the coordinator can reach the member's REST port.","Restart the failed member; verify the REST endpoint responds locally on that node.","If intentional (node being removed), ignore the warning or exclude the member from the cluster properly."],"exampleFix":"// before (seatunnel.yaml, http disabled on one node)\n// http: enable: false\n// after\n// http: enable: true\n//   port: 8080","handlingStrategy":"retry","validationCode":"// pre-check each member is reachable before listing logs\n// for (Member m : members) {\n//     if (!isPortOpen(m.getAddress().getHost(), restPort(m), timeoutMs)) {\n//         skip(m); // avoid the warn+skip path\n//     }\n// }","typeGuard":null,"tryCatchPattern":"try {\n    int port = (int) NodeEngineUtil.sendOperationToMemberNode(nodeEngine, new GetNodeHttpPortOperation(), member.getAddress()).get();\n} catch (Exception e) {\n    log.warn(\"Member {} unreachable for HTTP port, skipping logs\", member.getAddress(), e);\n}","preventionTips":["Enable the HTTP connector on every node with a consistent port","Keep inter-node REST ports open in firewalls","Monitor node liveness before issuing cluster-wide log queries"],"tags":["network","rest-api","hazelcast","cluster","http-port"],"backgroundTag":"connection-refused","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"}