gastownhall/beads · error
iterate dependents for batch from %s: %w
Error message
iterate dependents for batch from %s: %w
What it means
After consuming all rows, FindAllDependentsInTx checks rows.Err(); a non-nil result (driver error during iteration, connection reset while streaming rows) is wrapped with this message naming the table. This catches failures that occur mid-iteration rather than at query time.
Source
Thrown at internal/storage/issueops/delete.go:451
continue
}
return nil, fmt.Errorf("query dependents for batch from %s: %w", depTable, err)
}
for rows.Next() {
var depID string
if err := rows.Scan(&depID); err != nil {
_ = rows.Close()
return nil, fmt.Errorf("scan dependent: %w", err)
}
if !result[depID] {
result[depID] = true
toProcess = append(toProcess, depID)
}
}
_ = rows.Close()
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("iterate dependents for batch from %s: %w", depTable, err)
}
}
}
return result, nil
}
//nolint:gosec // G201: table is selected by callers from fixed issue/wisp auxiliary tables.
func CountRowsForIssueIDsInTx(ctx context.Context, tx DBTX, table string, ids []string) (int, error) {
total := 0
for i := 0; i < len(ids); i += deleteBatchSize {
end := i + deleteBatchSize
if end > len(ids) {
end = len(ids)
}
inClause, args := buildSQLInClause(ids[i:end])
var count int
if err := tx.QueryRowContext(ctx,View on GitHub (pinned to 71377f2769)
Solutions
- Retry the cascade delete with a stable connection to the database
- Increase the context timeout so long traversals are not cancelled mid-iteration
- For remote Dolt, check network stability / server logs for the mid-query failure
Example fix
// before ctx := context.Background() // after ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() // pass ctx so large traversals aren't cut off mid-rows
Defensive patterns
Strategy: retry
Validate before calling
// confirm DB reachable with adequate headroom before traversal
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
if err := db.PingContext(ctx); err != nil { return err } Try / catch
_, err := DeleteIssuesInTx(ctx, ctxArg, ids, WithCascade())
if err != nil && strings.Contains(err.Error(), "iterate dependents for batch from") {
// transient stream failure; retry after connection check
return retryWithBackoff(ctx, ids)
}
return err Prevention
- Use long-lived, stable connections for remote Dolt cascades
- Set context timeouts that cover the full traversal
- Avoid cancelling the parent context mid-delete
- Retry transient network failures with backoff
When it happens
Trigger: Cascade delete traversal (ResolveDeletionSetInTx → FindAllDependentsInTx) where the result set stream from dependencies or wisp_dependencies breaks mid-read — network drop to remote Dolt, driver timeout, or context cancellation during iteration.
Common situations: Large dependent sets streamed from a remote database over a flaky connection; context deadline expiring while iterating many batches.
Related errors
- db: RawSQL Query: rows: %w
- dependency graph: rows %s: %w
- dolt server connection failed: %w
- failed to iterate peers for migration: %w
- db: ChildCounterSQLRepository.NextChildID: rows: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/555d0c6eafc33f71.
Report an issue: GitHub.