{"record":{"id":"808a22e57547138d","repo":"gofr-dev/gofr","slug":"failed-to-set-key-value-pair-w","errorCode":null,"errorMessage":"failed to set key-value pair: %w","messagePattern":"failed to set key-value pair: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/datasource/kv-store/nats/nats.go","lineNumber":131,"sourceCode":"\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 {\n\tspan := c.addTrace(ctx, \"delete\", key)\n\tdefer c.sendOperationStats(time.Now(), \"DELETE\", \"delete\", span, key)\n\n\terr := c.kv.Delete(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 delete key: %w\", err)\n\t}\n","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/datasource/kv-store/nats/nats.go#L113-L149","documentation":"NATS KV Set wraps failures from c.kv.Put with 'failed to set key-value pair: %w', preserving the JetStream cause. It means the write to the bucket failed — typically a connection, bucket-existence, or JetStream limits problem — rather than a data issue.","triggerScenarios":"c.kv.Put(key, []byte(value)) errors: bucket does not exist, NATS connection lost, JetStream publish fails due to max payload/message-size limits, no storage resources, or account lacks publish permission.","commonSituations":"Bucket deleted or never created, oversized values exceeding JetStream max payload, NATS server restart, closed/expired connection, disk-full on the server's file store.","solutions":["Read the wrapped cause to distinguish connection vs bucket vs size errors","Ensure the bucket exists at startup (Create the KV bucket before use) and reconnect logic is in place","Reduce value size or raise server max_payload if large values are intended","Retry with backoff on transient connection errors"],"exampleFix":"// before\nerr := store.Set(ctx, key, bigBlob)\n// after\nif len(bigBlob) > maxPayload { return ErrValueTooLarge }\nif err := store.Set(ctx, key, bigBlob); err != nil {\n    return retry.WithBackoff(func() error { return store.Set(ctx, key, bigBlob) })\n}","handlingStrategy":"retry","validationCode":"// pre-flight checks before Set\nif len(value) > maxJetstreamPayload { return fmt.Errorf(\"value too large: %d bytes\", len(value)) }\nif _, err := js.KeyValue(cfg.Bucket); err != nil { return fmt.Errorf(\"bucket %q missing: %w\", cfg.Bucket, err) }","typeGuard":"func isSetFailure(err error) bool { return err != nil && strings.Contains(err.Error(), \"failed to set key-value pair\") } // prefer keeping the raw error and errors.Unwrap","tryCatchPattern":"if err := store.Set(ctx, key, value); err != nil {\n    if isTransient(errors.Unwrap(err)) {\n        return retry.WithBackoff(func() error { return store.Set(ctx, key, value) })\n    }\n    return err\n}","preventionTips":["Create the KV bucket at startup and verify it before writes","Enforce a max value size below the server's max_payload","Enable NATS reconnect options and idempotent writes (Set is an upsert)","Check server disk/JetStream limits if writes fail persistently"],"tags":["nats","jetstream","kv-store","write-failure"],"backgroundTag":"kv-put-failed","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}