gastownhall/beads · error

blocker edge rows from %s: %w

Error message

blocker edge rows from %s: %w

What it means

Wraps an error from rows.Err() after streaming blocker edge rows in IsBlockedInTx. Errors that occur mid-iteration (connection drop, I/O failure, cancellation) surface here after the loop, aborting the blocked check so no partial edge set is used.

Source

Thrown at internal/storage/issueops/dependency_queries.go:954

			WHERE issue_id = ? AND type IN ('blocks', 'waits-for', 'conditional-blocks')
		`, DepTargetExpr, depTable), issueID)
		if err != nil {
			if optionalBlockedTable(depTable) && isTableNotExistError(err) {
				continue
			}
			return false, nil, fmt.Errorf("check blockers from %s: %w", depTable, err)
		}
		for rows.Next() {
			var e depEdge
			if err := rows.Scan(&e.dependsOnID, &e.depType); err != nil {
				_ = rows.Close()
				return false, nil, fmt.Errorf("scan blocker edge: %w", err)
			}
			edges = append(edges, e)
		}
		_ = rows.Close()
		if err := rows.Err(); err != nil {
			return false, nil, fmt.Errorf("blocker edge rows from %s: %w", depTable, err)
		}
	}

	if len(edges) == 0 {
		return true, nil, nil
	}

	blockerIDs := make([]string, 0, len(edges))
	for _, e := range edges {
		blockerIDs = append(blockerIDs, e.dependsOnID)
	}
	statusByID, err := loadStatusByIDInTx(ctx, tx, blockerIDs)
	if err != nil {
		return false, nil, fmt.Errorf("check blocker status: %w", err)
	}
	var blockers []string
	for _, e := range edges {
		status, ok := statusByID[e.dependsOnID]

View on GitHub (pinned to 71377f2769)

Solutions

  1. Inspect the wrapped error for cancellation vs I/O cause
  2. Increase timeouts or avoid cancelling the context mid-transaction
  3. Restore connectivity to the SQL server and retry
  4. Check disk space / file locks for embedded backends
Defensive patterns

Strategy: try-catch

Try / catch

if err := issueops.IsBlocked(ctx, id); err != nil {
	if errors.Is(err, context.Canceled) || errors.Is(err, io.ErrUnexpectedEOF) {
		// transient: retry with fresh context
	}
	return err
}

Prevention

When it happens

Trigger: The driver encounters a streaming error while iterating edge rows from a dependency table during IsBlockedInTx, detected via rows.Err() after the Next() loop.

Common situations: Context cancellation/timeout mid-query; connection reset to a remote SQL server; embedded storage I/O errors (disk full, file lock).

Related errors


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