gastownhall/beads · error
remove federation peer: %w
Error message
remove federation peer: %w
What it means
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.
Source
Thrown at internal/storage/issueops/federation.go:133
}
if username.Valid {
row.Peer.Username = username.String
}
if lastSync.Valid {
row.Peer.LastSync = &lastSync.Time
}
peers = append(peers, &row)
}
return peers, rows.Err()
}
// RemoveFederationPeerInTx deletes a federation peer by name.
func RemoveFederationPeerInTx(ctx context.Context, tx *sql.Tx, name string) error {
_, err := tx.ExecContext(ctx, "DELETE FROM federation_peers WHERE name = ?", name)
if err != nil {
return fmt.Errorf("remove federation peer: %w", err)
}
return nil
}
// AddRemoteIfNotExists adds a Dolt remote, ignoring "already exists" errors.
// This is a helper used when adding federation peers that also need a Dolt remote.
func AddRemoteIfNotExists(ctx context.Context, tx *sql.Tx, name, url string) error {
_, err := tx.ExecContext(ctx, "CALL DOLT_REMOTE('add', ?, ?)", name, url)
if err != nil && !strings.Contains(err.Error(), "already exists") {
return fmt.Errorf("add remote %s: %w", name, err)
}
return nil
}
View on GitHub (pinned to 71377f2769)
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
Example fix
// before
err := issueops.RemoveFederationPeerInTx(ctx, tx, name) // fails: server unavailable
// after
if err := waitForDB(ctx, db); err != nil { // ensure connectivity first
return err
}
tx, _ := db.BeginTx(ctx, nil)
err := issueops.RemoveFederationPeerInTx(ctx, tx, name) Defensive patterns
Strategy: retry
Validate before calling
// confirm connectivity and table presence first
if err := db.PingContext(ctx); err != nil {
return err
}
if _, err := tx.ExecContext(ctx, `SELECT 1 FROM federation_peers LIMIT 1`); err != nil {
return err
} Try / catch
err := issueops.RemoveFederationPeerInTx(ctx, tx, name)
if err != nil {
if isTransient(err) { // e.g. connection reset / lock timeout
return retryRemove(ctx, tx, name)
}
return fmt.Errorf("remove peer %s: %w", name, err)
} Prevention
- 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
When it happens
Trigger: tx.ExecContext on the DELETE returns a driver error: connection dropped, table missing, permissions failure, or lock timeout.
Common situations: Dolt server unavailable during peer removal; migration not run (federation_peers missing); insufficient privileges on the database.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- failed to add federation peer: %w
- add federation peer: %w
- get federation peer: %w
- list federation peers: %w
- failed to begin transaction: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/63483f6160048209.
Report an issue: GitHub.