{"record":{"id":"0d4fce482c76b589","repo":"gastownhall/beads","slug":"failed-to-remove-federation-peer-w","errorCode":null,"errorMessage":"failed to remove federation peer: %w","messagePattern":"failed to remove federation peer: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/dolt/credentials.go","lineNumber":413,"sourceCode":"\t\t\t\treturn nil, fmt.Errorf(\"failed to initialize credential key: %w\", err)\n\t\t\t}\n\t\t\tpeer.Password, err = s.decryptPassword(encryptedPwd)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to decrypt password: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\tpeers = append(peers, &peer)\n\t}\n\n\treturn peers, rows.Err()\n}\n\n// RemoveFederationPeer removes a federation peer and its credentials.\nfunc (s *DoltStore) RemoveFederationPeer(ctx context.Context, name string) error {\n\tresult, err := s.execContext(ctx, \"DELETE FROM federation_peers WHERE name = ?\", name)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to remove federation peer: %w\", err)\n\t}\n\n\trows, _ := result.RowsAffected() // Best effort: rows affected is used only for logging\n\tif rows == 0 {\n\t\t// Peer not in credentials table, but might still be a Dolt remote\n\t\t// Continue to try removing the remote\n\t}\n\n\t// Also remove the Dolt remote (best-effort)\n\t_ = s.RemoveRemote(ctx, name) // Best effort cleanup before re-adding remote\n\n\treturn nil\n}\n\n// updatePeerLastSync updates the last sync time for a peer.\nfunc (s *DoltStore) updatePeerLastSync(ctx context.Context, name string) error {\n\t_, err := s.execContext(ctx, \"UPDATE federation_peers SET last_sync = CURRENT_TIMESTAMP WHERE name = ?\", name)\n\treturn wrapExecError(\"update peer last sync\", err)","sourceCodeStart":395,"sourceCodeEnd":431,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/dolt/credentials.go#L395-L431","documentation":"RemoveFederationPeer deletes a peer row (and its encrypted credentials) from federation_peers via DELETE. This error wraps the SQL exec failure. Note the function is tolerant of the peer not existing (0 rows affected is fine); this error only fires when the DELETE statement itself fails.","triggerScenarios":"Calling RemoveFederationPeer when the database connection is down, the federation_peers table doesn't exist, the context is cancelled, or the server rejects the write (read-only replica, permissions, lock timeout).","commonSituations":"dolt-sql-server restarted or unreachable mid-session; operating on a DB from an older beads version without the table; concurrent Dolt transactions holding locks; stale credentials after a server-mode connection drop.","solutions":["Verify DB connectivity: reconnect the store or restart dolt-sql-server, then retry the removal.","Ensure the federation_peers table exists (run bd init/migration).","Check for lock contention or read-only mode on the Dolt database and retry after resolving.","If the peer already doesn't exist, the removal is effectively a no-op — you can treat a 'table not found' as success in cleanup code."],"exampleFix":"// before\nerr := store.RemoveFederationPeer(ctx, \"old-peer\") // connection refused\n// after: reopen the store first\nstore, err = dolt.OpenStore(dbPath)\nif err != nil { return err }\nerr = store.RemoveFederationPeer(ctx, \"old-peer\")","handlingStrategy":"try-catch","validationCode":"// confirm DB is writable/reachable before deleting\nif err := db.PingContext(ctx); err != nil { /* reconnect first */ }","typeGuard":null,"tryCatchPattern":"err := store.RemoveFederationPeer(ctx, name)\nif err != nil {\n    // table may not exist or DB may be down; treat missing-table as success for cleanup paths\n    if !strings.Contains(err.Error(), \"doesn't exist\") { return err }\n}","preventionTips":["Check server health before batch peer removals","Run migrations so federation_peers always exists","Retry transient SQL failures with backoff","Avoid read-only replicas for credential management"],"tags":["database","sql","delete","federation"],"backgroundTag":"sql-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}