go-redis/redis · warning
routing: unknown response_policy %q
Error message
routing: unknown response_policy %q
What it means
Returned by routing.ParseResponsePolicy when a response_policy string does not match any known value (default(keyless), default(hashslot), all_succeeded, one_succeeded, agg_sum, agg_min, agg_max, agg_logical_and, agg_logical_or, special). The parser is case-insensitive but unforgiving of typos or made-up names. On failure it falls back to RespDefaultKeyless and returns this error so the caller can decide whether to reject the policy definition.
Source
Thrown at internal/routing/policy.go:125
return RespDefaultHashSlot, nil
case "all_succeeded":
return RespAllSucceeded, nil
case "one_succeeded":
return RespOneSucceeded, nil
case "agg_sum":
return RespAggSum, nil
case "agg_min":
return RespAggMin, nil
case "agg_max":
return RespAggMax, nil
case "agg_logical_and":
return RespAggLogicalAnd, nil
case "agg_logical_or":
return RespAggLogicalOr, nil
case "special":
return RespSpecial, nil
default:
return RespDefaultKeyless, fmt.Errorf("routing: unknown response_policy %q", raw)
}
}
type CommandPolicy struct {
Request RequestPolicy
Response ResponsePolicy
// Tips that are not request_policy or response_policy
// e.g nondeterministic_output, nondeterministic_output_order.
Tips map[string]string
}
func (p *CommandPolicy) CanBeUsedInPipeline() bool {
return p.Request != ReqAllNodes && p.Request != ReqAllShards && p.Request != ReqMultiShard
}
func (p *CommandPolicy) IsReadOnly() bool {
_, readOnly := p.Tips[ReadOnlyCMD]
return readOnlyView on GitHub (pinned to 36d97525cd)
Solutions
- Check the offending value against the accepted list in policy.go:103-123 and correct the typo (use underscores, exact names).
- If you are feeding a policy name from a newer go-redis/Redis spec, upgrade the library so the parser recognises it.
- Treat the error as non-fatal: ParseResponsePolicy already falls back to RespDefaultKeyless, so you can log and continue if the default is acceptable.
Example fix
// before
p, err := routing.ParseResponsePolicy("all-succeeded")
// after
p, err := routing.ParseResponsePolicy("all_succeeded") Defensive patterns
Strategy: validation
Validate before calling
var knownResponsePolicies = map[string]bool{
"default(keyless)": true, "default(hashslot)": true,
"all_succeeded": true, "one_succeeded": true,
"agg_sum": true, "agg_min": true, "agg_max": true,
"agg_logical_and": true, "agg_logical_or": true,
"special": true,
}
func validResponsePolicy(s string) bool { return knownResponsePolicies[strings.ToLower(s)] } Type guard
func isKnownResponsePolicy(s string) bool { _, err := routing.ParseResponsePolicy(s); return err == nil } Prevention
- Source response_policy values from the routing constants' String() output rather than hand-typing them.
- Validate policy JSON against the accepted set at load time.
- Keep the command-policy file version-aligned with the go-redis version in use.
When it happens
Trigger: Calling routing.ParseResponsePolicy with a string from a command-rules/policy JSON document whose response_policy field holds a typo (e.g. "all_succeed", "agg-sum", "ALL_SUCCEEDED" is fine but "aggregate_sum" is not). Any code path that loads external command-policy definitions and forwards their response_policy field to this parser.
Common situations: Custom command-policy JSON shipped out-of-band (e.g. overriding routing for a module command), a version mismatch where a newer policy name is fed to an older library build that does not know it, or hand-edited policy files with underscore/hyphen mistakes.
Related errors
- MaxWorkers must be greater than or equal to 0
- handoff queue size must be greater than 0
- post-handoff relaxed duration must be greater than or equal
- invalid endpoint type
- invalid maintenance notifications setting (must be 'disabled
AI-assisted analysis of go-redis/redis@36d97525cd (2026-08-06).
Data as JSON: /data/errors/a9a15882edff0189.json.
Report an issue: GitHub.