redis/redis ยท critical

Node %s replied with error: %s

Error message

Node %s replied with error:
%s

What it means

Same AUTH-failure path as error 30, but reached when redis-benchmark connects through a Unix domain socket (hostsocket != NULL) instead of TCP. The message prints the socket path in place of the IP:port pair and otherwise terminates the run identically.

Source

Thrown at src/redis-benchmark.c:254

    if (config.tls==1) {
        const char *err = NULL;
        if (cliSecureConnection(ctx, config.sslconfig, &err) == REDIS_ERR && err) {
            fprintf(stderr, "Could not negotiate a TLS connection: %s\n", err);
            goto cleanup;
        }
    }
    if (config.conn_info.auth == NULL)
        return ctx;
    if (config.conn_info.user == NULL)
        reply = redisCommand(ctx,"AUTH %s", config.conn_info.auth);
    else
        reply = redisCommand(ctx,"AUTH %s %s", config.conn_info.user, config.conn_info.auth);
    if (reply != NULL) {
        if (reply->type == REDIS_REPLY_ERROR) {
            if (hostsocket == NULL)
                fprintf(stderr, "Node %s:%d replied with error:\n%s\n", ip, port, reply->str);
            else
                fprintf(stderr, "Node %s replied with error:\n%s\n", hostsocket, reply->str);
            freeReplyObject(reply);
            redisFree(ctx);
            exit(1);
        }
        freeReplyObject(reply);
        return ctx;
    }
    fprintf(stderr, "ERROR: failed to fetch reply from ");
    if (hostsocket == NULL)
        fprintf(stderr, "%s:%d\n", ip, port);
    else
        fprintf(stderr, "%s\n", hostsocket);
cleanup:
    freeReplyObject(reply);
    redisFree(ctx);
    return NULL;
}

View on GitHub (pinned to 3acc0c49cf)

Solutions

  1. Confirm the socket exists and its owner matches the user running the benchmark: ls -l /var/run/redis/redis-server.sock
  2. Test auth over the socket: redis-cli -s /var/run/redis/redis-server.sock -a <password> --no-auth-warning ping
  3. If ACLs are in use, add --user <username> to the benchmark invocation
  4. Restart Redis to recreate the socket if it is stale from a prior process

Example fix

# before
redis-benchmark -s /var/run/redis/redis-server.sock -a oldpass
# after
redis-benchmark -s /var/run/redis/redis-server.sock --user default -a 'newpass'
Defensive patterns

Strategy: validation

Validate before calling

/* Same pre-flight AUTH probe, but for a unix-socket target. */
redisReply *probe = redisCommand(ctx, "AUTH %s %s",
    config.conn_info.user ? config.conn_info.user : "default",
    config.conn_info.auth);
if (probe != NULL && probe->type == REDIS_REPLY_ERROR) {
    fprintf(stderr, "auth rejected on socket %s: %s\n", hostsocket, probe->str);
    freeReplyObject(probe); redisFree(ctx); return NULL;
}

Prevention

When it happens

Trigger: Running redis-benchmark with -s /var/run/redis/redis-server.sock and an AUTH that the server rejects. The branch at src/redis-benchmark.c:253-254 is taken because hostsocket is non-NULL.

Common situations: Socket permissions changed, socket protected by a different ACL user than the TCP listener, Redis restarted with a new requirepass but the old socket path still in use, or a misconfigured supervisord unit pointing -s at a stale socket from a previous instance.

Related errors


AI-assisted analysis of redis/redis@3acc0c49cf (2026-08-01). Data as JSON: /data/errors/6464fa9a99ff345e.json. Report an issue: GitHub.