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

  1. Read the wrapped driver error to identify the root cause
  2. Run migrations if federation_peers is missing
  3. Retry the transaction if the error was transient
  4. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/63483f6160048209. Report an issue: GitHub.