{"record":{"id":"59f03d19a2ffc133","repo":"apache/seatunnel","slug":"failed-to-get-info-from-node","errorCode":null,"errorMessage":"Failed to get info from node: {}","messagePattern":"Failed to get info from node: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-redis/src/main/java/org/apache/seatunnel/connectors/seatunnel/redis/config/JedisWrapper.java","lineNumber":109,"sourceCode":"    public List<String> zrange(final String key, final long start, final long stop) {\n        return jedisCluster.zrange(key, start, stop);\n    }\n\n    @Override\n    public String info() {\n        Map<String, ConnectionPool> nodes = jedisCluster.getClusterNodes();\n        if (nodes.isEmpty()) {\n            throw new RedisConnectorException(\n                    GET_REDIS_INFO_ERROR, \"No available nodes in cluster\");\n        }\n\n        // Traverse all nodes and try to obtain the info\n        for (Map.Entry<String, ConnectionPool> entry : nodes.entrySet()) {\n            try {\n                Jedis jedis = getJedis(entry.getKey());\n                return jedis.info();\n            } catch (Exception e) {\n                log.warn(\"Failed to get info from node: {}\", entry.getKey(), e);\n            }\n        }\n\n        throw new RedisConnectorException(\n                GET_REDIS_INFO_ERROR, \"Failed to get redis info from all node in cluster\");\n    }\n\n    @Override\n    public String type(String key) {\n        return jedisCluster.type(key);\n    }\n\n    public Map<String, ConnectionPool> getClusterNodes() {\n        return jedisCluster.getClusterNodes();\n    }\n\n    @Override\n    public long expire(final String key, final long seconds) {","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-redis/src/main/java/org/apache/seatunnel/connectors/seatunnel/redis/config/JedisWrapper.java#L91-L127","documentation":"JedisWrapper.info() traverses every node of a Redis cluster attempting to run the INFO command; when a node fails it logs this warning ('Failed to get info from node: {}') and moves on. If every node fails, a RedisConnectorException (GET_REDIS_INFO_ERROR, 'Failed to get redis info from all node in cluster') is thrown. The warning identifies which specific node was unreachable or errored.","triggerScenarios":"Calling JedisWrapper.info() against a Redis cluster where a node is down, connection refused/timed out, requires AUTH the client lacks, or otherwise fails jedis.info(); logged once per failing node before the final exception if all nodes fail.","commonSituations":"Partial cluster outage or node being rebalanced; Redis node behind firewall/NAT only reachable from some hosts; wrong password (RedisAuthenticationConfig) causing NOAUTH on each node; cluster nodes map stale after topology change; network DNS resolution failures in containerized deployments.","solutions":["Check connectivity from the SeaTunnel worker to every cluster node listed by CLUSTER NODES (host/port reachable, not firewalled).","Verify redis auth configuration (password/user) matches the Redis server; test with redis-cli -h <host> -p <port> -a <pass> info.","Ensure at least one cluster node is healthy — the method succeeds as soon as any node returns info; repair or remove dead nodes.","Confirm cluster mode config in SeaTunnel matches the actual Redis deployment (cluster vs standalone/sentinel).","Inspect the attached exception in the warning log for the root cause (timeouts, NOAUTH, connection refused)."],"exampleFix":"// before\nJedisWrapper wrapper = new JedisWrapper(clusterConfig);\nString info = wrapper.info(); // throws if all nodes fail\n// after\ntry {\n    String info = wrapper.info();\n} catch (RedisConnectorException e) {\n    // log per-node warnings above to identify the unhealthy nodes\n    log.error(\"Redis cluster unreachable, check node connectivity/auth\", e);\n}","handlingStrategy":"retry","validationCode":"// before submitting the job, verify the cluster responds\ntry (Jedis jedis = new Jedis(host, port)) {\n    if (password != null) jedis.auth(password);\n    jedis.ping();\n    String info = jedis.info();\n    if (info == null || info.isEmpty()) throw new IllegalStateException(\"empty INFO\");\n}","typeGuard":"boolean isClusterReachable(Set<String> nodes) {\n    return nodes != null && !nodes.isEmpty() && nodes.stream().anyMatch(n -> canPing(n));\n}","tryCatchPattern":"try {\n    String info = jedisWrapper.info();\n} catch (RedisConnectorException e) {\n    if (e.getErrorCode() == GET_REDIS_INFO_ERROR) {\n        // inspect per-node warnings logged above, then retry or fail fast\n    }\n}","preventionTips":["Monitor Redis cluster node health (CLUSTER INFO / CLUSTER NODES) before and during jobs","Keep redis auth config in sync with the server (rotate passwords together)","Ensure network/firewall rules allow worker → every cluster node","Avoid pointing a cluster-mode client at a standalone or sentinel deployment"],"tags":["redis","cluster","network","logging"],"backgroundTag":"connection-refused","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}