linera-io/linera-protocol · error
Found faulty validators
Error message
Found faulty validators
What it means
After querying validators, this run() prints every validator classified as faulty — name, address, and its accumulated error count — and then bails. 'Faulty' means the validator was reached but its behavior/answers during the query session indicated problems (errors while processing requests), as distinct from merely unreachable validators. The printed list is the diagnostic; the bail makes the failure visible in the exit code.
Source
Thrown at linera-service/src/cli/validator.rs:698
println!("Local Node:");
local_results.print(None, None, None, None);
// Print validator results (only differences from local node)
for (name, address, votes, results) in &validator_results {
results.print(
Some(name),
Some(address),
Some(*votes),
Some(&local_results),
);
}
if !faulty_validators.is_empty() {
println!("\nFaulty validators:");
for ((name, address), errors) in faulty_validators {
println!(" {} at {}: {} error(s)", name, address, errors.len());
}
anyhow::bail!("Found faulty validators");
}
Ok(())
}
}
impl Query {
async fn run(
&self,
context: &ClientContext<impl linera_core::Environment>,
) -> anyhow::Result<()> {
let node = context.make_node_provider().make_node(&self.address)?;
let chain_id = self.chain_id.unwrap_or_else(|| context.default_chain());
println!("Querying validator about chain {chain_id}.\n");
let results = context
.query_validator(&self.address, &node, chain_id, self.public_key.as_ref())
.await;View on GitHub (pinned to 6c226ddcb3)
Solutions
- Use the printed 'Faulty validators:' list to identify which node misbehaved, then inspect its logs
- Restart the faulty validator(s) and re-run the query
- For local nets with corrupted state, tear down and re-create: `linera net down` then `linera net up`
- Verify client and validator binary versions match (version skew often looks like faults)
Defensive patterns
Strategy: try-catch
Try / catch
match run(&mut net).await {
Err(e) if e.to_string().contains("Found faulty validators") => {
// the faulty list (name/address/error count) was printed to stdout;
// capture and parse it to decide: restart vs recreate the net
handle_faulty_validators(&captured_output);
}
result => result?,
} Prevention
- Run the query command with stdout captured so the printed faulty list is machine-parseable on failure
- Keep client and validator binaries on the same version — skew frequently masquerades as faults
- For fault-injection experiments, expect this bail and assert on it rather than treating it as spurious
When it happens
Trigger: Running the validator inspection command when `faulty_validators` is non-empty: validators that produced errors during the query session (invalid responses, protocol-level errors, corrupted state).
Common situations: Fault-injection experiments on local test nets; a validator with corrupted storage after an unclean shutdown; version skew between the querying client and one validator.
Related errors
- Found issues while querying validators
- Found one or several issue(s) while querying validator {}
- Benchmark requires the 'opentelemetry' feature to be enabled
- Missing network description
- cannot forget the default chain `{chain_id}`; switch to anot
AI-assisted analysis of linera-io/linera-protocol@6c226ddcb3 (2026-08-22).
Data as JSON: /api/errors/469d9f0801a26ad4.
Report an issue: GitHub.