micro/go-micro · error

Failed to delete bucket

Error message

Failed to delete bucket

What it means

Returned by Delete when opt.Table == "DELETE_BUCKET" and js.DeleteKeyValue(key) fails, i.e. the JetStream KV bucket stream could not be deleted. The in-memory bucket cache entry is removed first, so a failure here leaves the bucket server-side but forgotten locally until reconnect.

Solutions

  1. Confirm the bucket actually exists with 'nats kv info <bucket>' before deleting, and treat not-found as success if idempotency is desired
  2. Check the wrapped error: if it's a connection error, reinitialize the store and retry
  3. Verify the NATS account has admin/publish permissions on the stream 'KV_<bucket>'
  4. Retry after cluster settles if the error indicates no stream leader (transient quorum state)

Example fix

// before
err := st.Delete(bucketName, store.DeleteTable("DELETE_BUCKET"))
// after
err := st.Delete(bucketName, store.DeleteTable("DELETE_BUCKET"))
if err != nil && strings.Contains(err.Error(), "not found") {
    err = nil // idempotent delete
}
Defensive patterns

Strategy: try-catch

Validate before calling

// check bucket exists before deleting
js, _ := nc.JetStream()
if _, err := js.StreamView("KV_" + name); err != nil {
    return nil // already gone; nothing to delete
}

Try / catch

if err := st.Delete(name, store.DeleteTable("DELETE_BUCKET")); err != nil {
    if strings.Contains(err.Error(), "Failed to delete bucket") {
        // verify whether it still exists; treat already-gone as success
        return nil
    }
    return err
}

Prevention

When it happens

Trigger: Calling Delete(key, store.DeleteTable("DELETE_BUCKET")) when the bucket does not exist server-side, the connection to NATS is broken, the account lacks permission to delete the stream, or the stream is in a state that forbids deletion (e.g. in-flight consumers/leadership election).

Common situations: Double-deleting the same bucket; trying to delete a bucket created by another account/subject permission; NATS server temporarily unavailable; deleting during cluster failover while the stream has no leader.

Related errors


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

Appendix: source

Thrown at store/nats-js-kv/nats.go:272

	opt := store.DeleteOptions{}

	for _, o := range opts {
		o(&opt)
	}

	if opt.Database == "" {
		opt.Database = n.opts.Database
	}

	if opt.Table == "" {
		opt.Table = n.opts.Table
	}

	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.

View on GitHub (pinned to 24529f1404)