{"record":{"id":"c57d4c0dc5cb2484","repo":"thanos-io/thanos","slug":"bad-cached-type","errorCode":null,"errorMessage":"bad cached type","messagePattern":"bad cached type","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cortex/querier/queryrange/results_cache.go","lineNumber":871,"sourceCode":"\tif ts < start || ts > end {\n\t\treturn false\n\t}\n\treturn step <= 0 || (ts-start)%step == 0\n}\n\nfunc (e *Extent) toResponse() (Response, error) {\n\tmsg, err := types.EmptyAny(e.Response)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := types.UnmarshalAny(e.Response, msg); err != nil {\n\t\treturn nil, err\n\t}\n\n\tresp, ok := msg.(Response)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"bad cached type\")\n\t}\n\treturn resp, nil\n}\n","sourceCodeStart":853,"sourceCodeEnd":875,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/internal/cortex/querier/queryrange/results_cache.go#L853-L875","documentation":"toResponse unmarshals a cached Any-wrapped protobuf message and asserts it implements the queryrange.Response interface. If the cached entry's type name decodes to a message that is not a known Response type (corrupt or foreign cache entry), it returns \"bad cached type\".","triggerScenarios":"Reading a results-cache entry whose stored type URL was written by a different queryrange version/schema, or whose bytes were corrupted, so msg.(Response) fails in newAccumulator.","commonSituations":"Upgrading/downgrading Cortex while sharing the same memcached/redis cache; cache poisoned by a mixed-version fleet during rolling deploy; manually populated or flushed-incompatible cache backends.","solutions":["Flush the results cache (memcached/redis) after version upgrades","Ensure all frontend replicas run the same Cortex version during rollouts","Add a cache key version prefix so old entries are ignored"],"exampleFix":"// before: shared cache across versions with same keys\n// after: bump cache key version\ncacheKey := fmt.Sprintf(\"v2:%s:%s\", userID, req.GetQuery())","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"if resp, ok := msg.(queryrange.Response); !ok {\n\treturn fmt.Errorf(\"bad cached type %T\", msg)\n}","tryCatchPattern":"resp, err := toResponse(e.Response)\nif err != nil && strings.Contains(err.Error(), \"bad cached type\") {\n\tcache.Delete(key) // evict poisoned entry and re-fetch upstream\n\treturn upstreamHandler(ctx, req)\n}","preventionTips":["Flush shared caches on Cortex version upgrades","Version cache keys so old-format entries are never read","Run homogeneous frontend versions during rollouts"],"tags":["cache","deserialization","version-skew","protobuf","cortex"],"backgroundTag":"unexpected-response-shape","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}