{"record":{"id":"9b0eb17a75beb6c0","repo":"gofr-dev/gofr","slug":"failed-to-get-key-w","errorCode":null,"errorMessage":"failed to get key: %w","messagePattern":"failed to get key: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/datasource/kv-store/nats/nats.go","lineNumber":119,"sourceCode":"\t\tc.logger.Errorf(\"error while creating/accessing KV bucket: %v\", err)\n\t\treturn\n\t}\n\n\tc.kv = kv\n\tc.logger.Infof(\"successfully connected to NATS-KV Store at %s:%s \", c.configs.Server, c.configs.Bucket)\n}\n\nfunc (c *Client) Get(ctx context.Context, key string) (string, error) {\n\tspan := c.addTrace(ctx, \"get\", key)\n\tdefer c.sendOperationStats(time.Now(), \"GET\", \"get\", span, key)\n\n\tentry, err := c.kv.Get(key)\n\tif err != nil {\n\t\tif errors.Is(err, nats.ErrKeyNotFound) {\n\t\t\treturn \"\", fmt.Errorf(\"%w: %s\", errKeyNotFound, key)\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"failed to get key: %w\", err)\n\t}\n\n\treturn string(entry.Value()), nil\n}\n\nfunc (c *Client) Set(ctx context.Context, key, value string) error {\n\tspan := c.addTrace(ctx, \"set\", key)\n\tdefer c.sendOperationStats(time.Now(), \"SET\", \"set\", span, key, value)\n\n\t_, err := c.kv.Put(key, []byte(value))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to set key-value pair: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *Client) Delete(ctx context.Context, key string) error {","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/datasource/kv-store/nats/nats.go#L101-L137","documentation":"NATS KV Get wraps any non-not-found error from the underlying bucket read with 'failed to get key: %w'. Unlike the key-not-found path, this indicates a real failure talking to JetStream/NATS (connection, permissions, bucket state), with the NATS cause preserved via %w.","triggerScenarios":"c.kv.Get(key) fails with errors other than nats.ErrKeyNotFound — connection dropped, bucket/stream deleted, JetStream unavailable, permission denied on the bucket.","commonSituations":"NATS server restart or network partition mid-operation, IAM/account lacking read on the bucket, bucket purged or nuked while the app runs.","solutions":["Inspect the wrapped cause (errors.Unwrap / %w) to identify the NATS error","Add reconnect handling: retry after the NATS client reconnects (nc.Options with ReconnectWait) or recreate the KV view","Verify account permissions grant read on the KV bucket","Check server logs for JetStream stream/bucket deletion events"],"exampleFix":"// before\nv, err := store.Get(ctx, key)\nreturn v, err\n// after\nv, err := store.Get(ctx, key)\nif err != nil && !errors.Is(err, kv.ErrKeyNotFound) {\n    return retry.WithBackoff(func() error { _, err = store.Get(ctx, key); return err })\n}","handlingStrategy":"retry","validationCode":"// pre-flight: connection + bucket readable\nif store == nil || !store.connected { return errors.New(\"nats kv not connected\") }\n_, err := js.KeyValue(cfg.Bucket)\nif err != nil { return fmt.Errorf(\"bucket unreadable: %w\", err) }","typeGuard":"func IsKeyNotFound(err error) bool { return errors.Is(err, natskv.ErrKeyNotFound) } // exclude miss before retrying","tryCatchPattern":"v, err := store.Get(ctx, key)\nif err != nil && !errors.Is(err, natskv.ErrKeyNotFound) {\n    err = retry.WithBackoff(func() error { v, err = store.Get(ctx, key); return err })\n}\nreturn v, err","preventionTips":["Never retry on key-not-found — retry only real failures","Enable NATS auto-reconnect and wait for reconnect before retrying","Verify account permissions for the bucket","Alert on repeated 'failed to get key' wrapped causes"],"tags":["nats","jetstream","kv-store","connectivity"],"backgroundTag":"kv-get-failed","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}