{"record":{"id":"43fd5fdb3a4c0e27","repo":"redis/go-redis","slug":"redis-client-tracking-bcast-cannot-be-combined-wi","errorCode":null,"errorMessage":"redis: CLIENT TRACKING BCAST cannot be combined with OPTIN or OPTOUT","messagePattern":"redis: CLIENT TRACKING BCAST cannot be combined with OPTIN or OPTOUT","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"commands.go","lineNumber":631,"sourceCode":"\tcmd := NewStatusCmd(ctx, args...)\n\t_ = c(ctx, cmd)\n\treturn cmd\n}\n\n// ClientTrackingOff disables tracking on the serving connection. See\n// ClientTracking for the pooled-client and built-in-CSC caveats.\nfunc (c cmdable) ClientTrackingOff(ctx context.Context) *StatusCmd {\n\tcmd := NewStatusCmd(ctx, \"client\", \"tracking\", \"off\")\n\t_ = c(ctx, cmd)\n\treturn cmd\n}\n\nfunc validateClientTrackingOptions(opt *ClientTrackingOptions) error {\n\tif opt.OptIn && opt.OptOut {\n\t\treturn errors.New(\"redis: CLIENT TRACKING OPTIN and OPTOUT are mutually exclusive\")\n\t}\n\tif opt.Bcast && (opt.OptIn || opt.OptOut) {\n\t\treturn errors.New(\"redis: CLIENT TRACKING BCAST cannot be combined with OPTIN or OPTOUT\")\n\t}\n\tif len(opt.Prefixes) > 0 && !opt.Bcast {\n\t\treturn errors.New(\"redis: CLIENT TRACKING PREFIX requires BCAST\")\n\t}\n\treturn nil\n}\n\nfunc appendClientTrackingOptions(args []interface{}, opt *ClientTrackingOptions) []interface{} {\n\tif opt.Redirect != 0 {\n\t\targs = append(args, \"redirect\", opt.Redirect)\n\t}\n\tif opt.Bcast {\n\t\targs = append(args, \"bcast\")\n\t}\n\tfor _, p := range opt.Prefixes {\n\t\targs = append(args, \"prefix\", p)\n\t}\n\tif opt.OptIn {","sourceCodeStart":613,"sourceCodeEnd":649,"githubUrl":"https://github.com/redis/go-redis/blob/c5cad058c72f58370553b48566302303cf8a2e89/commands.go#L613-L649","documentation":"Error returned by validateClientTrackingOptions (commands.go:631) when ClientTrackingOptions has Bcast set to true together with OptIn or OptOut. These modes are mutually exclusive in Redis's CLIENT TRACKING: BCAST broadcasts invalidation for all keys in the client's keyspace, while OPTIN/OPTOUT control per-key opt-in/opt-out tracking for a non-BCAST setup. Fix: either enable Bcast alone, or drop Bcast and use OptIn/OptOut.","triggerScenarios":"Calling ClientTracking with ClientTrackingOptions{Bcast: true, OptIn: true} or {Bcast: true, OptOut: true}.","commonSituations":"Copying example code that used OPTIN and adding BCAST for broader invalidation; toggling Bcast on in config without clearing the opt flags.","solutions":["Remove OptIn/OptOut when using Bcast: true.","If per-key opt-in/out is needed, drop Bcast.","Remember PREFIX also requires BCAST."],"exampleFix":"// before\nrdb.ClientTracking(ctx, &redis.ClientTrackingOptions{Bcast: true, OptIn: true})\n// after\nrdb.ClientTracking(ctx, &redis.ClientTrackingOptions{Bcast: true})","handlingStrategy":"validation","validationCode":"func validTracking(o *redis.ClientTrackingOptions) bool {\n    return o != nil && !(o.Bcast && (o.OptIn || o.OptOut))\n}","typeGuard":null,"tryCatchPattern":"if err := rdb.ClientTracking(ctx, opt).Err(); err != nil {\n    if strings.Contains(err.Error(), \"BCAST cannot be combined\") {\n        // clear OptIn/OptOut and retry\n    }\n}","preventionTips":["Treat Bcast as exclusive with opt-in/out semantics when designing config keys.","Document in your options struct that Bcast ignores OptIn/OptOut."],"tags":["client-tracking","validation","options"],"backgroundTag":"client-tracking-options-invalid","analyzedSha":"c5cad058c72f58370553b48566302303cf8a2e89","analyzedAt":"2026-09-01T06:50:53.388Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}