{"record":{"id":"2d62f073326b538a","repo":"gastownhall/beads","slug":"journal-close-dependency-removals-from-s-w","errorCode":null,"errorMessage":"journal: close dependency removals from %s: %w","messagePattern":"journal: close dependency removals from (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/storage/issueops/journal_dependencies.go","lineNumber":108,"sourceCode":"\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 {\n\t\tif edges[i].source != edges[j].source {\n\t\t\treturn edges[i].source < edges[j].source\n\t\t}","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/issueops/journal_dependencies.go#L90-L126","documentation":"This error is returned when rows.Close() fails after successfully iterating dependency-removal rows in dependencyEdgesInTableForIssueIDsInTx. Closing a rows handle releases database resources, and a close failure usually signals an already-broken connection. The library surfaces it because leaking cursors on journal tables can exhaust server resources.","triggerScenarios":"RecordDependencyRemovalsForTableInTx or dependencyEdgesForIssueIDsInTx call paths where the database connection has gone bad by the time rows.Close() is called after iteration completes.","commonSituations":"Network interruptions to a remote Dolt server; connection-pool recycling a broken connection; driver ErrBadConn surfacing at close time.","solutions":["Verify connection health and retry; this is often transient","Check the wrapped driver error for ErrBadConn and let the pool replace the connection","Ensure connection pool settings (MaxLifetime) are shorter than any network idle timeouts"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// no pre-call validation possible; verify pool health instead\nif db == nil { return errors.New(\"nil DB handle before dependency rebuild\") }","typeGuard":null,"tryCatchPattern":"if err != nil && errors.Is(err, driver.ErrBadConn) {\n    // let sql.DB replace the connection and retry once\n}","preventionTips":["Set conn MaxIdleTime/MaxLifetime below network idle timeouts","Avoid holding transactions across long computations","Let database/sql pool manage connections rather than caching handles"],"tags":["database","resource-cleanup","journal","dependencies"],"backgroundTag":"rows-close-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}