redis/go-redis · error
redis: cannot pipeline command %q with request policy ReqAll
Error message
redis: cannot pipeline command %q with request policy ReqAllNodes/ReqAllShards/ReqMultiShard; Note: This behavior is subject to change in the future
What it means
Error "redis: cannot pipeline command %q with request policy ReqAllNodes/ReqAllShards/ReqMultiShard; Note: This behavior is subject to change in the future" thrown in redis/go-redis.
Source
Thrown at osscluster.go:1899
// instead of splitting every batch across all nodes at flush. Cluster slots are
// contiguous per node, so bucketing by slot range (slot*shards/16384) keeps a
// node's slots together. Keyless commands hash to slot -1 → bucket 0; multi-node
// commands are already rejected from pipelines, so only single-node commands
// reach here.
func (c *ClusterClient) installAutoPipelineSharding(ap *AutoPipeliner) {
// Reject commands whose request policy cannot ride a pipeline (ReqAllNodes/
// ReqAllShards/ReqMultiShard) at submit, BEFORE they can join a merged
// batch: mapCmdsByNode fails a whole mapping on such a command (user
// pipelines are all-or-nothing), and one autopipeline caller must not be
// able to poison unrelated callers' batches. Rejecting here also keeps the
// lone-command fast path consistent with batched dispatch — the command is
// refused regardless of what it happens to coalesce with.
ap.setPreflight(func(ctx context.Context, cmd Cmder) error {
if c.cmdInfoResolver == nil {
return nil
}
if policy := c.cmdInfoResolver.GetCommandPolicy(ctx, cmd); policy != nil && !policy.CanBeUsedInPipeline() {
return fmt.Errorf(
"redis: cannot pipeline command %q with request policy ReqAllNodes/ReqAllShards/ReqMultiShard; Note: This behavior is subject to change in the future", cmd.Name(),
)
}
return nil
})
// Commands whose routing is not slot-derived must not be coalesced: a solo
// flush reaches ClusterClient.process and its special handling (FT.CURSOR
// READ/DEL are sticky to the node holding the cursor), but inside a batch
// mapCmdsByNode routes by slot and can hit the wrong shard — visible only
// under concurrent traffic, which is the worst way to find it. Divert them
// instead of rejecting: they work fine on their own connection (review
// finding by codex on #3942).
ap.setMustDivert(func(ctx context.Context, cmd Cmder) bool {
if c.cmdInfoResolver == nil {
return false
}
policy := c.cmdInfoResolver.GetCommandPolicy(ctx, cmd)
return policy != nil && policy.Request == routing.ReqSpecialView on GitHub (pinned to c5cad058c7)
When it happens
Trigger: Thrown at osscluster.go:1899 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of redis/go-redis@c5cad058c7 (2026-09-01).
Data as JSON: /api/errors/48b6b908db06e6f1.
Report an issue: GitHub.