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

  1. Use the printed 'Faulty validators:' list to identify which node misbehaved, then inspect its logs
  2. Restart the faulty validator(s) and re-run the query
  3. For local nets with corrupted state, tear down and re-create: `linera net down` then `linera net up`
  4. 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

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


AI-assisted analysis of linera-io/linera-protocol@6c226ddcb3 (2026-08-22). Data as JSON: /api/errors/469d9f0801a26ad4. Report an issue: GitHub.