{"record":{"id":"65348a215156cf29","repo":"gastownhall/beads","slug":"journal-iterate-dependency-removals-from-s-w","errorCode":null,"errorMessage":"journal: iterate dependency removals from %s: %w","messagePattern":"journal: iterate dependency removals from (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/issueops/journal_dependencies.go","lineNumber":105,"sourceCode":"\t\t\tWHERE issue_id IN (%s) OR %s IN (%s)\n\t\t`, DepTargetExpr, table, inClause, DepTargetExpr, inClause), queryArgs...)\n\t\tif err != nil {\n\t\t\tif optionalBlockedTable(table) && isTableNotExistError(err) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"journal: query dependency removals from %s: %w\", table, err)\n\t\t}\n\t\tfor rows.Next() {\n\t\t\tvar edge journalDependencyEdge\n\t\t\tif err := rows.Scan(&edge.source, &edge.target, &edge.kind, &edge.metadata); err != nil {\n\t\t\t\t_ = rows.Close()\n\t\t\t\treturn nil, fmt.Errorf(\"journal: scan dependency removal from %s: %w\", table, err)\n\t\t\t}\n\t\t\tbyKey[dependencyEdgeKey(edge)] = edge\n\t\t}\n\t\tif err := rows.Err(); err != nil {\n\t\t\t_ = rows.Close()\n\t\t\treturn nil, fmt.Errorf(\"journal: iterate dependency removals from %s: %w\", table, err)\n\t\t}\n\t\tif err := rows.Close(); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"journal: close dependency removals from %s: %w\", table, err)\n\t\t}\n\t}\n\treturn sortedDependencyEdges(byKey), nil\n}\n\nfunc dependencyEdgeKey(edge journalDependencyEdge) string {\n\treturn edge.source + \"\\x00\" + edge.target + \"\\x00\" + edge.kind + \"\\x00\" + edge.metadata\n}\n\nfunc sortedDependencyEdges(byKey map[string]journalDependencyEdge) []journalDependencyEdge {\n\tedges := make([]journalDependencyEdge, 0, len(byKey))\n\tfor _, edge := range byKey {\n\t\tedges = append(edges, edge)\n\t}\n\tsort.Slice(edges, func(i, j int) bool {","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/issueops/journal_dependencies.go#L87-L123","documentation":"This error wraps a rows.Err() failure encountered while iterating the result set of dependency-removal rows read from a journal table inside dependencyEdgesInTableForIssueIDsInTx. The library throws it because a streaming row iteration can fail mid-scan (connection drop, driver decode error), and such failures must abort the rebuild of dependency edges rather than silently return a partial set. The wrapped table name identifies which journal table ('dependencies' or wisp variant) the iteration failed on.","triggerScenarios":"Calling RecordDependencyRemovalsForTableInTx or dependencyEdgesForIssueIDsInTx, which invoke dependencyEdgesInTableForIssueIDsInTx, when the underlying rows iterator returns a non-nil error after rows.Next() exhausts — e.g. the Dolt/MySQL connection breaks mid-result or the context deadline expires during iteration.","commonSituations":"Remote Dolt backends dropping connections on large result sets; context cancellation/timeouts during long transactions (GH#3414-style round-trip latency); server restarts mid-query.","solutions":["Check database connectivity and retry the operation once the connection is healthy","Increase the context timeout for the transaction so iteration is not cut off","Inspect the wrapped error (%w chain) for driver-specific causes (driver.ErrBadConn, context.DeadlineExceeded)","Reduce batch size of issue IDs to shrink result sets on slow remote backends"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if err := ctx.Err(); err != nil { return fmt.Errorf(\"context already done before dependency rebuild: %w\", err) }","typeGuard":null,"tryCatchPattern":"edges, err := dependencyEdgesForIssueIDsInTx(ctx, tx, ids)\nif err != nil {\n    var netErr net.Error\n    if errors.As(err, &netErr) || errors.Is(err, context.DeadlineExceeded) {\n        // transient: retry with fresh connection/backoff\n    }\n    return err\n}","preventionTips":["Keep transactions short to reduce mid-iteration connection loss","Set generous but bounded context deadlines for bulk journal reads","Monitor driver.ErrBadConn rates and pool health","Batch issue IDs to keep result sets small on remote backends"],"tags":["database","rows-iteration","journal","dependencies"],"backgroundTag":"rows-iteration-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}