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.Database

View on GitHub (pinned to 24529f1404)

Solutions

  1. Check the wrapped error for connection problems and reinitialize/reconnect the store before retrying
  2. Verify the bucket stream is healthy and has a leader ('nats stream info KV_<bucket>')
  3. Validate the key/table combination contains only valid NATS key characters
  4. 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

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


AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01). Data as JSON: /api/errors/f01d7eab53809763. Report an issue: GitHub.