apache/seatunnel · warning

Failed to get info from node

Error message

Failed to get info from node: {}

What it means

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.

Solutions

  1. Check connectivity from the SeaTunnel worker to every cluster node listed by CLUSTER NODES (host/port reachable, not firewalled).
  2. Verify redis auth configuration (password/user) matches the Redis server; test with redis-cli -h <host> -p <port> -a <pass> info.
  3. Ensure at least one cluster node is healthy — the method succeeds as soon as any node returns info; repair or remove dead nodes.
  4. Confirm cluster mode config in SeaTunnel matches the actual Redis deployment (cluster vs standalone/sentinel).
  5. Inspect the attached exception in the warning log for the root cause (timeouts, NOAUTH, connection refused).

Example fix

// before
JedisWrapper wrapper = new JedisWrapper(clusterConfig);
String info = wrapper.info(); // throws if all nodes fail
// after
try {
    String info = wrapper.info();
} catch (RedisConnectorException e) {
    // log per-node warnings above to identify the unhealthy nodes
    log.error("Redis cluster unreachable, check node connectivity/auth", e);
}
Defensive patterns

Strategy: retry

Validate before calling

// before submitting the job, verify the cluster responds
try (Jedis jedis = new Jedis(host, port)) {
    if (password != null) jedis.auth(password);
    jedis.ping();
    String info = jedis.info();
    if (info == null || info.isEmpty()) throw new IllegalStateException("empty INFO");
}

Type guard

boolean isClusterReachable(Set<String> nodes) {
    return nodes != null && !nodes.isEmpty() && nodes.stream().anyMatch(n -> canPing(n));
}

Try / catch

try {
    String info = jedisWrapper.info();
} catch (RedisConnectorException e) {
    if (e.getErrorCode() == GET_REDIS_INFO_ERROR) {
        // inspect per-node warnings logged above, then retry or fail fast
    }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/59f03d19a2ffc133. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-redis/src/main/java/org/apache/seatunnel/connectors/seatunnel/redis/config/JedisWrapper.java:109

    public List<String> zrange(final String key, final long start, final long stop) {
        return jedisCluster.zrange(key, start, stop);
    }

    @Override
    public String info() {
        Map<String, ConnectionPool> nodes = jedisCluster.getClusterNodes();
        if (nodes.isEmpty()) {
            throw new RedisConnectorException(
                    GET_REDIS_INFO_ERROR, "No available nodes in cluster");
        }

        // Traverse all nodes and try to obtain the info
        for (Map.Entry<String, ConnectionPool> entry : nodes.entrySet()) {
            try {
                Jedis jedis = getJedis(entry.getKey());
                return jedis.info();
            } catch (Exception e) {
                log.warn("Failed to get info from node: {}", entry.getKey(), e);
            }
        }

        throw new RedisConnectorException(
                GET_REDIS_INFO_ERROR, "Failed to get redis info from all node in cluster");
    }

    @Override
    public String type(String key) {
        return jedisCluster.type(key);
    }

    public Map<String, ConnectionPool> getClusterNodes() {
        return jedisCluster.getClusterNodes();
    }

    @Override
    public long expire(final String key, final long seconds) {

View on GitHub (pinned to cf67b549a7)