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 = true

View on GitHub (pinned to 71377f2769)

Solutions

  1. Inspect the wrapped cause to find the failing recompute statement
  2. Re-run sync — clean pulls trigger finishPeerPull's recompute path, and the recompute is idempotent
  3. Manually trigger a blocked recompute (or run `bd doctor`-style consistency repair) to refresh is_blocked
  4. Increase dolt server timeouts if the merge window is large
  5. 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

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


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