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
- Confirm the bucket actually exists with 'nats kv info <bucket>' before deleting, and treat not-found as success if idempotency is desired
- Check the wrapped error: if it's a connection error, reinitialize the store and retry
- Verify the NATS account has admin/publish permissions on the stream 'KV_<bucket>'
- 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
- Make bucket deletion idempotent in caller code
- Ensure the account has permissions to delete streams
- Avoid deleting buckets during cluster failover windows
- Always verify with 'nats kv info' when a delete fails before retrying
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
- Failed to delete data
- Failed to get bucket (%s)
- Failed to create bucket (%s)
- source not found: %s
- error connecting to nats cluster %v: %w
AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01).
Data as JSON: /api/errors/1986a3c068e3bc18.
Report an issue: GitHub.