micro/go-micro · error
Failed to delete data
Error message
Failed to delete data
What it means
Returned by Delete when the KV view's Delete of a single key fails, wrapped as "Failed to delete data". The bucket was found in the local cache, but JetStream refused the delete operation on that subject.
Source
Thrown at store/nats-js-kv/nats.go:284
}
if opt.Table == "DELETE_BUCKET" {
n.buckets.Del(key)
if err := n.js.DeleteKeyValue(key); err != nil {
return errors.Wrap(err, "Failed to delete bucket")
}
return nil
}
store, ok := n.buckets.Get(opt.Database)
if !ok {
return ErrBucketNotFound
}
if err := store.Delete(n.NatsKey(opt.Table, key)); err != nil {
return errors.Wrap(err, "Failed to delete data")
}
return nil
}
// List returns any keys that match, or an empty list with no error if none matched.
func (n *natsStore) List(opts ...store.ListOption) ([]string, error) {
if err := n.initConn(); err != nil {
return nil, err
}
opt := store.ListOptions{}
for _, o := range opts {
o(&opt)
}
if opt.Database == "" {
opt.Database = n.opts.DatabaseView on GitHub (pinned to 24529f1404)
Solutions
- Check the wrapped error for connection problems and reinitialize/reconnect the store before retrying
- Verify the bucket stream is healthy and has a leader ('nats stream info KV_<bucket>')
- Validate the key/table combination contains only valid NATS key characters
- Treat nats.ErrKeyNotFound-style errors as success if deletes should be idempotent
Example fix
// before
if err := st.Delete(key); err != nil { return err }
// after
if err := st.Delete(key); err != nil {
if errors.Is(err, nats.ErrKeyNotFound) { return nil }
return err
} Defensive patterns
Strategy: retry
Validate before calling
// ensure store is initialized and key is valid
if err := st.Init(); err != nil { return err }
if strings.ContainsAny(key, " ") || key == "" {
return fmt.Errorf("invalid key %q", key)
} Try / catch
if err := st.Delete(key); err != nil {
if strings.Contains(err.Error(), "Failed to delete data") {
_ = st.Init() // refresh connection
err = st.Delete(key)
}
return err
} Prevention
- Reinitialize the store after NATS server restarts (watch for disconnect events)
- Keep keys within valid NATS subject characters
- Treat delete-of-missing-key as success for idempotency
- Check stream health (leader election) when deletes fail during failover
When it happens
Trigger: Calling Delete(key) when the NATS connection is down, the JetStream stream for the bucket has no leader, or the key name produced by n.NatsKey(opt.Table, key) is invalid or cannot be published as a delete subject.
Common situations: Deleting a key right after the NATS server restarted (stale connection); deleting during cluster failover; calling Delete before the bucket was actually created server-side because the local cache was populated from a previous session.
Related errors
- source not found: %s
- Failed to store data in bucket '%s'
- Failed to delete bucket
- Failed to list keys in bucket
- Failed to get object from bucket
AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01).
Data as JSON: /api/errors/f01d7eab53809763.
Report an issue: GitHub.