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
- Check the wrapped inner error from doltAddAndCommit for the concrete dolt CLI message.
- Configure committer identity (dolt config --global user.name/user.email) if the error mentions missing identity.
- Retry after resolving any dirty/conflicting working set; avoid running concurrent writes from multiple bd processes on the same workspace.
- 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
- Set dolt/git user.name and user.email globally in CI images
- Avoid concurrent bd writers on the same workspace
- Ensure the CLI database directory exists in server-mode setups
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
- failed to commit restore: %w
- failed to commit orphaned dependency removals: %w
- failed to add dolt remote: %w
- failed to commit pending changes before pull: %w
- failed to commit pending changes before sync: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/a15917afd088b997.
Report an issue: GitHub.