gofiber/fiber · error

failed to write cached response at fastpath

Error message

failed to write cached response at fastpath: %w

What it means

Wraps any error from maybeWriteCachedResponse on the pre-lock fastpath — i.e. the first lookup attempt before acquiring the idempotency lock. It is a thin context layer over error 168 (failed to read response) or 169 (failed to unmarshal response), identifying that the failure happened during the unlocked fast lookup.

Solutions

  1. Resolve the underlying storage/marshalling error (see errors 168/169).
  2. If transient, a client retry with the same idempotency key is safe.
  3. Add metrics on fastpath failures to detect storage flapping.
  4. Consider a short-circuit fallback if idempotency is best-effort in your system.
Defensive patterns

Strategy: retry

Prevention

When it happens

Trigger: A non-safe request with a valid X-Idempotency-Key enters the handler; the first maybeWriteCachedResponse call (before Lock.Lock) returns an error from Storage.GetWithContext or UnmarshalMsg. The error is re-wrapped and returned to Fiber's error handler.

Common situations: Storage backend briefly unavailable at request time, transient network error to Redis/DB, or schema-mismatched cached blob encountered on the fastpath. Distinct from error 172 which signals the same failure after acquiring the lock.

Related errors


AI-assisted analysis of gofiber/fiber@a105acad6c (2026-08-11). Data as JSON: /api/errors/151ddd6b8a31d17e. Report an issue: GitHub.

Appendix: source

Thrown at middleware/idempotency/idempotency.go:120

		// Don't execute middleware if Next returns true
		if cfg.Next != nil && cfg.Next(c) {
			return c.Next()
		}

		// Don't execute middleware if the idempotency key is empty
		if c.Get(cfg.KeyHeader) == "" {
			return c.Next()
		}

		// Validate key
		key := utils.CopyString(c.Get(cfg.KeyHeader))
		if err := cfg.KeyHeaderValidate(key); err != nil {
			return err
		}

		// First-pass: if the idempotency key is in the storage, get and return the response
		if ok, err := maybeWriteCachedResponse(c, key); err != nil {
			return fmt.Errorf("failed to write cached response at fastpath: %w", err)
		} else if ok {
			return nil
		}

		if err := cfg.Lock.Lock(key); err != nil {
			return fmt.Errorf("failed to lock: %w", err)
		}
		defer func() {
			if err := cfg.Lock.Unlock(key); err != nil {
				log.Errorf("[IDEMPOTENCY] failed to unlock key %q: %v", maskKey(key), err)
			}
		}()

		// Lock acquired. If the idempotency key now is in the storage, get and return the response
		if ok, err := maybeWriteCachedResponse(c, key); err != nil {
			return fmt.Errorf("failed to write cached response while locked: %w", err)
		} else if ok {
			return nil

View on GitHub (pinned to a105acad6c)