{"record":{"id":"63483f6160048209","repo":"gastownhall/beads","slug":"remove-federation-peer-w","errorCode":null,"errorMessage":"remove federation peer: %w","messagePattern":"remove federation peer: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/issueops/federation.go","lineNumber":133,"sourceCode":"\t\t}\n\n\t\tif username.Valid {\n\t\t\trow.Peer.Username = username.String\n\t\t}\n\t\tif lastSync.Valid {\n\t\t\trow.Peer.LastSync = &lastSync.Time\n\t\t}\n\n\t\tpeers = append(peers, &row)\n\t}\n\treturn peers, rows.Err()\n}\n\n// RemoveFederationPeerInTx deletes a federation peer by name.\nfunc RemoveFederationPeerInTx(ctx context.Context, tx *sql.Tx, name string) error {\n\t_, err := tx.ExecContext(ctx, \"DELETE FROM federation_peers WHERE name = ?\", name)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"remove federation peer: %w\", err)\n\t}\n\treturn nil\n}\n\n// AddRemoteIfNotExists adds a Dolt remote, ignoring \"already exists\" errors.\n// This is a helper used when adding federation peers that also need a Dolt remote.\nfunc AddRemoteIfNotExists(ctx context.Context, tx *sql.Tx, name, url string) error {\n\t_, err := tx.ExecContext(ctx, \"CALL DOLT_REMOTE('add', ?, ?)\", name, url)\n\tif err != nil && !strings.Contains(err.Error(), \"already exists\") {\n\t\treturn fmt.Errorf(\"add remote %s: %w\", name, err)\n\t}\n\treturn nil\n}\n","sourceCodeStart":115,"sourceCodeEnd":147,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/issueops/federation.go#L115-L147","documentation":"RemoveFederationPeerInTx's DELETE FROM federation_peers WHERE name = ? failed at the SQL level; the error is wrapped as \"remove federation peer\". Deleting a nonexistent peer is NOT an error here (zero rows affected is fine). This is a database-side failure only.","triggerScenarios":"tx.ExecContext on the DELETE returns a driver error: connection dropped, table missing, permissions failure, or lock timeout.","commonSituations":"Dolt server unavailable during peer removal; migration not run (federation_peers missing); insufficient privileges on the database.","solutions":["Read the wrapped driver error to identify the root cause","Run migrations if federation_peers is missing","Retry the transaction if the error was transient","Check database user permissions for DELETE on federation_peers"],"exampleFix":"// before\nerr := issueops.RemoveFederationPeerInTx(ctx, tx, name) // fails: server unavailable\n// after\nif err := waitForDB(ctx, db); err != nil { // ensure connectivity first\n    return err\n}\ntx, _ := db.BeginTx(ctx, nil)\nerr := issueops.RemoveFederationPeerInTx(ctx, tx, name)","handlingStrategy":"retry","validationCode":"// confirm connectivity and table presence first\nif err := db.PingContext(ctx); err != nil {\n    return err\n}\nif _, err := tx.ExecContext(ctx, `SELECT 1 FROM federation_peers LIMIT 1`); err != nil {\n    return err\n}","typeGuard":null,"tryCatchPattern":"err := issueops.RemoveFederationPeerInTx(ctx, tx, name)\nif err != nil {\n    if isTransient(err) { // e.g. connection reset / lock timeout\n        return retryRemove(ctx, tx, name)\n    }\n    return fmt.Errorf(\"remove peer %s: %w\", name, err)\n}","preventionTips":["Ping the DB and retry transient errors before structural retries","Run migrations so federation_peers exists","Check DELETE privileges for the DB user in restricted environments"],"tags":["database","sql","federation","go"],"backgroundTag":"database-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}