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.

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)

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.