{"record":{"id":"f70e1e0427619fe5","repo":"gofiber/fiber","slug":"cache-failed-to-store-raw-key-q-w","errorCode":null,"errorMessage":"cache: failed to store raw key %q: %w","messagePattern":"cache: failed to store raw key %q: %w","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"middleware/cache/manager.go","lineNumber":188,"sourceCode":"\t\t\treturn fmt.Errorf(\"cache: failed to marshal key %q: %w\", m.logKey(key), err)\n\t\t}\n\t\tif err := m.storage.SetWithContext(ctx, key, raw, exp); err != nil {\n\t\t\tm.release(it)\n\t\t\treturn fmt.Errorf(\"cache: failed to store key %q: %w\", m.logKey(key), err)\n\t\t}\n\t\tm.release(it)\n\t\treturn nil\n\t}\n\n\tm.memory.Set(key, it, exp)\n\treturn nil\n}\n\n// set data to storage or memory\nfunc (m *manager) setRaw(ctx context.Context, key string, raw []byte, exp time.Duration) error {\n\tif m.storage != nil {\n\t\tif err := m.storage.SetWithContext(ctx, key, raw, exp); err != nil {\n\t\t\treturn fmt.Errorf(\"cache: failed to store raw key %q: %w\", m.logKey(key), err)\n\t\t}\n\t\treturn nil\n\t}\n\n\tm.memory.Set(key, raw, exp)\n\treturn nil\n}\n\n// delete data from storage or memory\nfunc (m *manager) del(ctx context.Context, key string) error {\n\tif m.storage != nil {\n\t\tif err := m.storage.DeleteWithContext(ctx, key); err != nil {\n\t\t\treturn fmt.Errorf(\"cache: failed to delete key %q: %w\", m.logKey(key), err)\n\t\t}\n\t\treturn nil\n\t}\n\n\tm.memory.Delete(key)","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/gofiber/fiber/blob/a105acad6c1e4576a77f01e02973f67e962bb58d/middleware/cache/manager.go#L170-L206","documentation":"Returned by manager.setRaw when the external Storage's SetWithContext fails while persisting the separated raw response body (key+\"_body\"). Because setRaw runs before the metadata set in the two-write external-storage flow, this failure means no metadata key was written and cleanup is straightforward.","triggerScenarios":"External-Storage cache store where the raw body write (manager.setRaw, called at cache.go:973) fails: backend down, write timeout, payload too large for the backend's value-size limit (Redis max bulk-payload), quota exceeded, context cancellation.","commonSituations":"Caching large response bodies that exceed the storage backend's per-value size cap; Redis/MongoDB under memory pressure; network instability; client disconnect during streaming response.","solutions":["Check the wrapped error for size-limit vs connectivity causes.","Verify the response body size fits within the backend's max value/bulk size (e.g. Redis proto-max-bulk-len, MongoDB document 16MB cap).","Configure the cache to skip oversized bodies or cap MaxBytes appropriately.","Treat as cache miss on the next request — ensure the request itself does not fail."],"exampleFix":"// before: raw-body store failure aborts the cached response\nif err := manager.setRaw(reqCtx, key+\"_body\", e.body, exp); err != nil {\n    return err\n}\n\n// after: downgrade to a warning and skip caching this response\nif err := manager.setRaw(reqCtx, key+\"_body\", e.body, exp); err != nil {\n    log.Warn(\"cache raw-body store skipped:\", err)\n    return nil // do not cache; handler response still served\n}","handlingStrategy":"retry","validationCode":"// Confirm a representative body size fits the backend's value-size cap before enabling caching.\nfunc bodyFitsBackend(body []byte, maxSize int) error {\n    if len(body) > maxSize {\n        return fmt.Errorf(\"body %d bytes exceeds backend max %d\", len(body), maxSize)\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"if err := manager.setRaw(reqCtx, key+\"_body\", e.body, exp); err != nil {\n    if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {\n        return\n    }\n    log.Warn(\"raw-body store skipped:\", err)\n    // do not fail the request; skip caching this response\n}","preventionTips":["Do not cache responses larger than the backend's per-value limit (Redis bulk-len, Mongo 16MB).","Set MaxBytes to match your backend's comfortable value size.","Monitor backend memory/quota under production load."],"tags":["cache","storage","network","raw-body","write","go","fiber"],"backgroundTag":null,"analyzedSha":"a105acad6c1e4576a77f01e02973f67e962bb58d","analyzedAt":"2026-08-11T17:33:26.942Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}