gastownhall/beads · error
conflicts resolved but is_blocked recompute failed: %w
Error message
conflicts resolved but is_blocked recompute failed: %w
What it means
After a conflicted merge is resolved and committed, Sync runs RecomputeBlockedAfterMerge(ctx, beforeCommit) to recompute is_blocked over the whole merge+resolution window (the conflicted merge had skipped the automatic recompute, per bd-578h9.11). This error means the data and conflicts are resolved but the derived is_blocked values may be stale or wrong until a recompute succeeds.
Source
Thrown at internal/storage/dolt/federation.go:414
}
}
result.ConflictsResolved = true
// Commit the resolution INCLUDING config: the operator chose this
// strategy, and plain Commit excludes config (GH#2455). A config-only
// conflict — routine now that kv.memory.* memories sync through config —
// would otherwise resolve but never commit, leaving the merge
// unconcluded and re-wedging the next sync.
if err := s.CommitMergeResolution(ctx, fmt.Sprintf("Resolve conflicts from %s using %s strategy", peer, strategy)); err != nil {
result.Error = fmt.Errorf("failed to commit conflict resolution: %w", err)
return result, result.Error
}
// bd-578h9.11: the conflicted merge skipped the automatic is_blocked
// recompute (unresolved rows would have fed it garbage); now that the
// resolution is committed, cover the whole merge+resolution window.
if err := s.RecomputeBlockedAfterMerge(ctx, beforeCommit); err != nil {
result.Error = fmt.Errorf("conflicts resolved but is_blocked recompute failed: %w", err)
return result, result.Error
}
}
result.Merged = true
// Count pulled commits
afterCommit, _ := s.GetCurrentCommit(ctx) // Best effort: empty commit hash means diff won't be logged
if beforeCommit != afterCommit {
result.PulledCommits = 1 // Simplified - could count actual commits
}
// Step 5: Push our changes to peer, filtering excluded types.
excludeTypes := config.GetFederationConfig().ExcludeTypes
if err := s.filteredPushToPeer(ctx, peer, excludeTypes); err != nil {
// Push failure is not fatal - peer may not accept pushes
result.PushError = err
} else {
result.Pushed = trueView on GitHub (pinned to 71377f2769)
Solutions
- Inspect the wrapped cause to find the failing recompute statement
- Re-run sync — clean pulls trigger finishPeerPull's recompute path, and the recompute is idempotent
- Manually trigger a blocked recompute (or run `bd doctor`-style consistency repair) to refresh is_blocked
- Increase dolt server timeouts if the merge window is large
- Check server logs around the sync timestamp for the exact query error
Example fix
// before: abort pipeline on recompute failure
return fmt.Errorf("sync failed: %w", result.Error)
// after: data is synced; flag recompute for retry
if result.Error != nil && strings.Contains(result.Error.Error(), "is_blocked recompute failed") {
log.Warn("synced; scheduling blocked-recompute retry")
queueRecompute()
result.Error = nil
} Defensive patterns
Strategy: retry
Validate before calling
if store == nil || isReadOnly() { skipRecomputeExpectations() } Type guard
func isRecomputeFailure(err error) bool {
return err != nil && strings.Contains(err.Error(), "is_blocked recompute failed")
} Try / catch
result, err := store.Sync(ctx, peer, strategy, opts)
if isRecomputeFailure(err) {
log.Warn("synced but recompute failed; retrying")
queueRecompute() // idempotent re-run later
} Prevention
- Schedule periodic idempotent recompute runs as a safety net
- Raise DB timeouts for large merge windows
- Avoid overlapping syncs that lengthen the merge window
When it happens
Trigger: store.Sync with strategy on a conflicted merge where resolution and CommitMergeResolution succeeded but RecomputeBlockedAfterMerge errors — SQL failure, timeout, or dependency-graph query failure during the recompute.
Common situations: Large merge windows (many changed dependencies) making the recompute slow enough to hit timeouts; DB contention right after commit; transient server restart mid-sync.
Related errors
- pull succeeded but is_blocked recompute failed: %w
- failed to commit pending changes before sync: %w
- fetch failed: %w
- merge failed: %w
- merge conflicts require resolution (use --strategy ours|thei
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/e6c23fe3b30e588e.
Report an issue: GitHub.