gastownhall/beads · error
delete: count events: %w
Error message
delete: count events: %w
What it means
deleteMany wraps errors from eventsRepo.CountAllForIDs on the regular-issues table when gathering pre-delete event counts for the result. The 'delete: count events:' prefix marks the failing step; the driver error is preserved via %w. Deletion has not started.
Source
Thrown at internal/storage/domain/issue_delete.go:135
depCount, err := u.countDeletedDependencies(ctx, allIDs)
if err != nil {
return DeleteIssuesResult{}, err
}
result.DependenciesCount = depCount
labelIssue, err := u.labelRepo.CountAllForIDs(ctx, regularIDs, LabelOpts{})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count labels: %w", err)
}
labelWisp, err := u.labelRepo.CountAllForIDs(ctx, wispIDs, LabelOpts{UseWispsTable: true})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count wisp labels: %w", err)
}
result.LabelsCount = labelIssue + labelWisp
evIssue, err := u.eventsRepo.CountAllForIDs(ctx, regularIDs, RecordEventOpts{})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count events: %w", err)
}
evWisp, err := u.eventsRepo.CountAllForIDs(ctx, wispIDs, RecordEventOpts{UseWispsTable: true})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count wisp events: %w", err)
}
result.EventsCount = evIssue + evWisp
if params.DryRun {
result.DeletedCount = len(regularIDs) + len(wispIDs)
return result, nil
}
var connected map[string]*types.Issue
var connectedIsWisp map[string]bool
if params.UpdateTextReferences {
deletedSet := make(map[string]bool, len(allIDs))
for _, id := range allIDs {
deletedSet[id] = trueView on GitHub (pinned to 71377f2769)
Solutions
- Inspect the wrapped error from CountAllForIDs
- Verify Dolt health and events-table schema
- Retry the delete; it is non-destructive at this point
- Batch very large deletes to reduce table-scan pressure
Example fix
// before
res, err := uc.DeleteIssues(ctx, ids, actor)
if err != nil { return err }
// after
if err != nil {
if strings.Contains(err.Error(), "count events") {
log.Printf("event count failed before delete: %v", err)
}
return err
} Defensive patterns
Strategy: retry
Validate before calling
if err := pingDolt(ctx); err != nil {
return fmt.Errorf("storage down, deferring delete: %w", err)
} Try / catch
res, err := uc.DeleteIssues(ctx, ids, actor)
if err != nil && strings.Contains(err.Error(), "count events") {
// events count failed pre-delete; safe to retry
return retryDelete(ctx, ids)
} Prevention
- Check events-table schema after beads upgrades
- Avoid delete batches during peak Dolt load
- Retry pre-delete stat failures rather than treating them as destructive failures
When it happens
Trigger: Any deleteMany invocation reaching the events-count phase when CountAllForIDs(ctx, regularIDs, RecordEventOpts{}) fails — DB connection error, SQL error on the events table, storage unavailable.
Common situations: Bulk issue deletes with event-history tables under load; schema drift on events tables after version upgrades; Dolt restart during a delete batch.
Related errors
- delete: count labels: %w
- delete: count wisp events: %w
- delete: cascade expansion: %w
- delete: partition: %w
- delete: count wisp labels: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/d3d39df611e7dce1.
Report an issue: GitHub.