{"id":"055abd1eaf03fdb9","repo":"gofiber/fiber","slug":"cache-failed-to-store-key-q-w","errorCode":null,"errorMessage":"cache: failed to store key %q: %w","messagePattern":"cache: failed to store key %q: %w","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"middleware/cache/manager.go","lineNumber":174,"sourceCode":"\t\t\treturn nil, fmt.Errorf(\"cache: unexpected raw entry type %T for key %q\", value, m.logKey(key))\n\t\t}\n\t\treturn raw, nil\n\t}\n\n\treturn nil, errCacheMiss\n}\n\n// set data to storage or memory\nfunc (m *manager) set(ctx context.Context, key string, it *item, exp time.Duration) error {\n\tif m.storage != nil {\n\t\traw, err := it.MarshalMsg(nil)\n\t\tif err != nil {\n\t\t\tm.release(it)\n\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","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/gofiber/fiber/blob/9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c/middleware/cache/manager.go#L156-L192","documentation":"Thrown at middleware/cache/manager.go:174 when storage.SetWithContext fails while persisting a freshly cached item. This is the write-side counterpart of error 140: the storage backend rejected the SET (with TTL). The wrapped %w is the raw driver error.","triggerScenarios":"Cache miss path computes a response and tries to store it, but the Storage backend is down, out of space, read-only, or the request ctx was cancelled before the SET completed.","commonSituations":"Redis OOM or maxmemory eviction policy returning an error; SQLite disk full; storage AUTH expired mid-flight; client disconnect causing ctx cancellation during the SET; network blip.","solutions":["Examine the wrapped driver error to pinpoint the backend refusal (OOM, disk-full, auth, timeout).","Increase storage capacity or tighten cache TTL/size to fit within the backend's memory budget.","Set the storage driver's write timeout below the per-request context deadline so SETs complete or fail before the request is torn down.","Make the fiber.ErrorHandler tolerate cache-write failures (log + serve the uncached response) so users are unaffected when storage hiccups.","Verify storage credentials and connectivity are still valid at runtime, not just at boot."],"exampleFix":"// before\napp.Use(cache.New(cache.Config{ Storage: redis.New() }))\n\n// after: tolerate cache write failures by wrapping the error handler\napp.New().ErrorHandler = func(c fiber.Ctx, err error) error {\n    var ce *cacheErr\n    if strings.HasPrefix(err.Error(), \"cache: failed to store\") {\n        log.Printf(\"cache write failed (serving uncached): %v\", err)\n        return c.Next() // already have response; just log\n    }\n    return fiber.DefaultErrorHandler(c, err)\n}","handlingStrategy":"try-catch","validationCode":"// At boot, validate the storage backend accepts writes.\nctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)\ndefer cancel()\nif err := store.SetWithContext(ctx, \"__probe__\", []byte(\"ok\"), time.Second); err != nil {\n    log.Fatalf(\"cache storage write probe failed: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := m.storage.SetWithContext(ctx, key, raw, exp); err != nil {\n    log.Printf(\"cache write failed for %q (serving uncached): %v\", key, err)\n    return err // ErrorHandler can downgrade to a non-fatal response\n}","preventionTips":["Probe storage write capability at startup.","Tune storage capacity/TTL to fit the working set; monitor eviction/error rates.","Set the storage write timeout below the per-request deadline.","Treat cache-write failures as non-fatal: log and serve uncached."],"tags":["cache","storage","network","redis","fiber"],"analyzedSha":"9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c","analyzedAt":"2026-08-04T21:44:03.395Z","schemaVersion":2}