FuelLabs/fuel-core · error · anyhow::Error

Backlog unresolved at height {current_height}: repair error:

Error message

Backlog unresolved at height {current_height}: repair error: {e}

What it means

Same repair path (crates/fuel-core/src/service/adapters/consensus_module/poa.rs:898-909): repair_sub_quorum_block itself returned Err({e}) — an I/O or Redis failure while re-proposing the block to the nodes — and since no earlier height had been reconciled in this round, the error is wrapped as 'Backlog unresolved … repair error' and aborts reconciliation.

Source

Thrown at crates/fuel-core/src/service/adapters/consensus_module/poa.rs:903

                        Ok(false) => {
                            tracing::warn!(
                                "Repair failed to reach quorum at height \
                                 {current_height} — will retry next round"
                            );
                            if reconciled.is_empty() {
                                return Err(anyhow!(
                                    "Backlog unresolved at height {current_height}: \
                                     repair failed to reach quorum"
                                ));
                            }
                            break;
                        }
                        Err(e) => {
                            tracing::warn!(
                                "Repair error at height {current_height}: {e}"
                            );
                            if reconciled.is_empty() {
                                return Err(anyhow!(
                                    "Backlog unresolved at height {current_height}: \
                                     repair error: {e}"
                                ));
                            }
                            break;
                        }
                    }
                }
            } else {
                if reconciled.is_empty() {
                    return Err(anyhow!(
                        "Backlog unresolved at height {current_height}: \
                         no winning block candidate"
                    ));
                }
                break;
            }

View on GitHub (pinned to b9d4d170da)

Solutions

  1. Inspect the wrapped {e} and the preceding 'Repair error at height …' warning to identify the failing node(s)
  2. Restore those nodes or the network path and let the next reconciliation round retry the repair
  3. Raise node_timeout if the writes are merely slow rather than failing
Defensive patterns

Strategy: retry

Try / catch

match unreconciled_blocks(next_height).await {
    Err(e) if e.to_string().contains("repair error") => {
        // the inner {e} names the failing node/op: address it, then the next
        // reconciliation round retries the repair automatically
    }
    other => other,
}

Prevention

When it happens

Trigger: Connection failures or timeouts on enough nodes during the multi-node re-write that the repair call errors out entirely rather than completing with a false result.

Common situations: Redis outage starting mid-repair; transient network blip; node_timeout exceeded by the repair writes.

Related errors


AI-assisted analysis of FuelLabs/fuel-core@b9d4d170da (2026-08-16). Data as JSON: /api/errors/6889021d99874b7b. Report an issue: GitHub.