{"record":{"id":"69c6f3372620f1eb","repo":"gastownhall/beads","slug":"failed-to-get-federation-peer-w","errorCode":null,"errorMessage":"failed to get federation peer: %w","messagePattern":"failed to get federation peer: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/dolt/credentials.go","lineNumber":339,"sourceCode":"\n// GetFederationPeer retrieves a federation peer by name.\n// Returns storage.ErrNotFound (wrapped) if the peer does not exist.\nfunc (s *DoltStore) GetFederationPeer(ctx context.Context, name string) (*storage.FederationPeer, error) {\n\tvar peer storage.FederationPeer\n\tvar encryptedPwd []byte\n\tvar lastSync sql.NullTime\n\tvar username sql.NullString\n\n\terr := s.db.QueryRowContext(ctx, `\n\t\tSELECT name, remote_url, username, password_encrypted, sovereignty, last_sync, created_at, updated_at\n\t\tFROM federation_peers WHERE name = ?\n\t`, name).Scan(&peer.Name, &peer.RemoteURL, &username, &encryptedPwd, &peer.Sovereignty, &lastSync, &peer.CreatedAt, &peer.UpdatedAt)\n\n\tif err == sql.ErrNoRows {\n\t\treturn nil, fmt.Errorf(\"%w: federation peer %s\", storage.ErrNotFound, name)\n\t}\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get federation peer: %w\", err)\n\t}\n\n\tif username.Valid {\n\t\tpeer.Username = username.String\n\t}\n\tif lastSync.Valid {\n\t\tpeer.LastSync = &lastSync.Time\n\t}\n\n\t// Decrypt password\n\tif len(encryptedPwd) > 0 {\n\t\tif err := s.ensureCredentialKey(ctx); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to initialize credential key: %w\", err)\n\t\t}\n\t\tpeer.Password, err = s.decryptPassword(encryptedPwd)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to decrypt password: %w\", err)\n\t\t}","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/dolt/credentials.go#L321-L357","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"ctx, cancel := context.WithTimeout(ctx, 10*time.Second)\ndefer cancel()","typeGuard":null,"tryCatchPattern":"peer, err := store.GetFederationPeer(ctx, name)\nif err != nil && !errors.Is(err, storage.ErrNotFound) {\n    return fmt.Errorf(\"federation lookup failed (check Dolt server/schema): %w\", err)\n}","preventionTips":["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"],"tags":["go","database","sql","query"],"backgroundTag":"database-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}