gastownhall/beads · error

failed to commit federation peer: %w

Error message

failed to commit federation peer: %w

What it means

After the upsert and remote registration, addFederationPeer commits the federation_peers table change to Dolt history via doltAddAndCommit. This wraps failure of that staging/commit step, meaning the credentials row may be visible in the working set but not committed, breaking Dolt-versioned consistency.

Source

Thrown at internal/storage/dolt/credentials.go:316

			password_encrypted = VALUES(password_encrypted),
			sovereignty = VALUES(sovereignty),
			updated_at = CURRENT_TIMESTAMP
	`, peer.Name, peer.RemoteURL, peer.Username, encryptedPwd, peer.Sovereignty)

	if err != nil {
		return fmt.Errorf("failed to add federation peer: %w", err)
	}

	// Also add the Dolt remote.
	if err := s.AddRemote(ctx, peer.Name, peer.RemoteURL); err != nil {
		// Ignore "remote already exists" errors
		if !strings.Contains(err.Error(), "already exists") {
			return fmt.Errorf("failed to add dolt remote: %w", err)
		}
	}

	if err := s.doltAddAndCommit(ctx, []string{"federation_peers"}, "federation: add peer "+peer.Name); err != nil {
		return fmt.Errorf("failed to commit federation peer: %w", err)
	}

	return nil
}

// 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)

View on GitHub (pinned to 71377f2769)

Solutions

  1. Check the wrapped inner error from doltAddAndCommit for the concrete dolt CLI message.
  2. Configure committer identity (dolt config --global user.name/user.email) if the error mentions missing identity.
  3. Retry after resolving any dirty/conflicting working set; avoid running concurrent writes from multiple bd processes on the same workspace.
  4. Verify the CLI database directory exists and is healthy in server-mode deployments; re-run AddFederationPeer (idempotent upsert) once fixed.
Defensive patterns

Strategy: retry

Try / catch

if err := store.AddFederationPeer(ctx, peer); err != nil && strings.Contains(err.Error(), "failed to commit federation peer") {
    // configure dolt identity or resolve dirty working set, then retry
    err = store.AddFederationPeer(ctx, peer)
}

Prevention

When it happens

Trigger: doltAddAndCommit fails: `dolt add federation_peers` or `dolt commit` subprocess error — no Dolt identity configured (user.name/user.email), merge conflict or dirty working set, CLI database missing in server mode, or the commit fails due to lock contention.

Common situations: Fresh environment where git/dolt committer identity is unset; concurrent bd processes committing simultaneously; the CLI-side database directory absent or corrupted in server-mode setups.

Related errors


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