gastownhall/beads · error
failed to get federation peer: %w
Error message
failed to get federation peer: %w
What it means
GetFederationPeer wraps any non-ErrNoRows error from the SELECT against federation_peers here. It means the lookup itself failed — the row's existence couldn't even be determined — typically due to connectivity or schema problems.
Source
Thrown at internal/storage/dolt/credentials.go:339
// GetFederationPeer retrieves a federation peer by name.
// Returns storage.ErrNotFound (wrapped) if the peer does not exist.
func (s *DoltStore) GetFederationPeer(ctx context.Context, name string) (*storage.FederationPeer, error) {
var peer storage.FederationPeer
var encryptedPwd []byte
var lastSync sql.NullTime
var username sql.NullString
err := s.db.QueryRowContext(ctx, `
SELECT name, remote_url, username, password_encrypted, sovereignty, last_sync, created_at, updated_at
FROM federation_peers WHERE name = ?
`, name).Scan(&peer.Name, &peer.RemoteURL, &username, &encryptedPwd, &peer.Sovereignty, &lastSync, &peer.CreatedAt, &peer.UpdatedAt)
if err == sql.ErrNoRows {
return nil, fmt.Errorf("%w: federation peer %s", storage.ErrNotFound, name)
}
if err != nil {
return nil, fmt.Errorf("failed to get federation peer: %w", err)
}
if username.Valid {
peer.Username = username.String
}
if lastSync.Valid {
peer.LastSync = &lastSync.Time
}
// Decrypt password
if len(encryptedPwd) > 0 {
if err := s.ensureCredentialKey(ctx); err != nil {
return nil, fmt.Errorf("failed to initialize credential key: %w", err)
}
peer.Password, err = s.decryptPassword(encryptedPwd)
if err != nil {
return nil, fmt.Errorf("failed to decrypt password: %w", err)
}View on GitHub (pinned to 71377f2769)
Solutions
- Inspect the wrapped inner error — connection errors need the Dolt server restarted/reached; 'unknown table' needs schema migration (`bd init` or upgrade path).
- Verify network connectivity and credentials to the dolt-sql-server.
- Increase context timeout if the deadline was exceeded.
- Run `bd doctor`/schema checks after version upgrades to ensure federation_peers exists.
Defensive patterns
Strategy: try-catch
Validate before calling
ctx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel()
Try / catch
peer, err := store.GetFederationPeer(ctx, name)
if err != nil && !errors.Is(err, storage.ErrNotFound) {
return fmt.Errorf("federation lookup failed (check Dolt server/schema): %w", err)
} Prevention
- Health-check the dolt-sql-server before federation operations
- Run schema checks after bd version upgrades
- Set sensible context timeouts and surface the wrapped cause
When it happens
Trigger: QueryRowContext/Scan fails for reasons other than no rows: database connection refused/dropped, federation_peers table missing (old schema), SQL type-scan mismatch, context cancellation/timeout, or read-only server errors.
Common situations: External dolt-sql-server down or restarted; connecting to a database initialized by an older bd version lacking the federation_peers table; context deadline exceeded on slow networks; schema drift after a bd upgrade without migration.
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
- db: CommentSQLRepository.CountsByIssueIDs: %w
- db: CommentSQLRepository.ListByIssueIDs: %w
- db: LabelSQLRepository.ListByIssueIDs: %w
- failed to get stale issues: %w
- ErrQuery
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/69c6f3372620f1eb.
Report an issue: GitHub.