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

  1. Inspect the wrapped inner error — connection errors need the Dolt server restarted/reached; 'unknown table' needs schema migration (`bd init` or upgrade path).
  2. Verify network connectivity and credentials to the dolt-sql-server.
  3. Increase context timeout if the deadline was exceeded.
  4. 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

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


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