gastownhall/beads · error

list federation peers: %w

Error message

list federation peers: %w

What it means

ListFederationPeersInTx failed while querying federation_peers; the driver error is wrapped as "list federation peers". This is a database-level failure (missing table, connection, schema), not an empty result. An empty table returns an empty slice with nil error.

Source

Thrown at internal/storage/issueops/federation.go:100

	if username.Valid {
		row.Peer.Username = username.String
	}
	if lastSync.Valid {
		row.Peer.LastSync = &lastSync.Time
	}

	return &row, nil
}

// ListFederationPeersInTx returns all configured federation peer rows.
func ListFederationPeersInTx(ctx context.Context, tx *sql.Tx) ([]*FederationPeerRow, error) {
	rows, err := tx.QueryContext(ctx, `
		SELECT name, remote_url, username, password_encrypted, sovereignty, last_sync, created_at, updated_at
		FROM federation_peers ORDER BY name
	`)
	if err != nil {
		return nil, fmt.Errorf("list federation peers: %w", err)
	}
	defer rows.Close()

	var peers []*FederationPeerRow
	for rows.Next() {
		var row FederationPeerRow
		var lastSync sql.NullTime
		var username sql.NullString

		if err := rows.Scan(
			&row.Peer.Name, &row.Peer.RemoteURL, &username, &row.EncryptedPwd,
			&row.Peer.Sovereignty, &lastSync, &row.Peer.CreatedAt, &row.Peer.UpdatedAt,
		); err != nil {
			return nil, fmt.Errorf("scan federation peer: %w", err)
		}

		if username.Valid {
			row.Peer.Username = username.String

View on GitHub (pinned to 71377f2769)

Solutions

  1. Read the wrapped driver error to identify the root cause
  2. Run pending schema migrations to create federation_peers
  3. Retry if the error is transient (connection reset)
  4. Confirm you are connected to the intended database

Example fix

// before
peers, err := issueops.ListFederationPeersInTx(ctx, tx) // fails: table not found
// after
if err := migrate(ctx, db); err != nil { // ensure federation_peers exists
    return err
}
peers, err := issueops.ListFederationPeersInTx(ctx, tx)
Defensive patterns

Strategy: retry

Validate before calling

// ensure federation_peers exists before listing
if err := migrate(ctx, db); err != nil {
    return err
}

Try / catch

var peers []*issueops.FederationPeerRow
var err error
for i := 0; i < 3; i++ {
    peers, err = issueops.ListFederationPeersInTx(ctx, tx)
    if err == nil || errors.Is(ctx.Err(), context.Canceled) {
        break
    }
    time.Sleep(time.Duration(1<<i) * 100 * time.Millisecond) // transient-error backoff
}
if err != nil {
    return fmt.Errorf("list peers: %w", err)
}

Prevention

When it happens

Trigger: tx.QueryContext on federation_peers returns a driver error: table missing (migration not run), connection refused/reset, or schema mismatch.

Common situations: Fresh database before migrations; Dolt server down; running a newer binary against an older schema where federation_peers doesn't exist.

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/53ecfc457f2d828a. Report an issue: GitHub.