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

  1. Retry the cascade delete with a stable connection to the database
  2. Increase the context timeout so long traversals are not cancelled mid-iteration
  3. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/555d0c6eafc33f71. Report an issue: GitHub.