{"record":{"id":"3e8a45f4e893317d","repo":"linera-io/linera-protocol","slug":"local-error-handling-validator-response-validator","errorCode":null,"errorMessage":"Local error handling validator response: validator still reports missing cross-chain updates for chain {dependencies_chain_id} after they were all synced","messagePattern":"Local error handling validator response: validator still reports missing cross-chain updates for chain (.+?) after they were all synced","errorType":"exception","errorClass":"NodeError","httpStatus":null,"severity":"error","filePath":"linera-core/src/updater.rs","lineNumber":623,"sourceCode":"                    self.sync_remote_if_needed(\n                        chain_id,\n                        proposal.content.round,\n                        proposal.content.block.height,\n                        &err,\n                    )\n                    .await?;\n                }\n                // The validator reports *every* missing cross-chain bundle in a single\n                // `MissingCrossChainUpdates`, so we sync all of them at once and retry. Some\n                // received certificates may be missing for this validator (e.g. to create the\n                // chain or make the balance sufficient). If it still reports missing bundles\n                // after we synced the whole set, retrying would not make progress, so we surface\n                // the error instead of looping.\n                Err(NodeError::MissingCrossChainUpdates {\n                    chain_id: dependencies_chain_id,\n                    bundles,\n                }) if dependencies_chain_id == proposal.content.block.chain_id => {\n                    ensure!(\n                        !synced_cross_chain_updates,\n                        NodeError::ResponseHandlingError {\n                            error: format!(\n                                \"validator still reports missing cross-chain updates for chain \\\n                                 {dependencies_chain_id} after they were all synced\"\n                            ),\n                        }\n                    );\n                    synced_cross_chain_updates = true;\n                    tracing::debug!(\n                        remote_node = %self.remote_node.address(),\n                        %chain_id,\n                        bundles = bundles.len(),\n                        \"validator reported missing cross-chain updates; syncing them in one batch\",\n                    );\n                    // Sync each reported origin chain up to the needed height, collapsing any\n                    // duplicate origins to the highest height.\n                    let mut origin_heights: BTreeMap<ChainId, BlockHeight> = BTreeMap::new();","sourceCodeStart":605,"sourceCodeEnd":641,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-core/src/updater.rs#L605-L641","documentation":"Raised in RemoteNodeUpdater::send_block_proposal: when a validator rejects a block proposal with MissingCrossChainUpdates, the client syncs every reported origin chain to the needed height and retries the proposal once. If the validator then reports missing cross-chain updates for the same chain again, the one-shot guard fires: retrying further cannot make progress, because the local node was unable to supply what the validator says it needs.","triggerScenarios":"The local node does not actually hold the cross-chain message bundles the validator demands (the sync sent nothing useful for those origins); validator and client disagree on which bundles exist (version drift); validator storage state corrupted so it never accepts the bundles it is sent.","commonSituations":"Proposing a block that receives messages from chains the client never fully downloaded; clients restored from an old wallet/state trying to spend received funds; validator software downgrade or upgrade changing bundle accounting.","solutions":["Fully synchronize the origin chains from other validators before proposing: download their certificates up to the reported heights","Re-run prepare_chain() so the client's local node catches up with everything the validator references","Check that client and validators run compatible linera versions (cross-chain bundle format changes)","If the validator is simply broken, exclude it from the quorum set and retry"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":"fn is_cross_chain_sync_stuck(err: &chain_client::Error) -> bool {\n    matches!(\n        err,\n        chain_client::Error::RemoteNodeError(NodeError::ResponseHandlingError { error })\n            if error.contains(\"missing cross-chain updates\")\n    )\n}","tryCatchPattern":"match client.execute_operations(operations, vec![]).await {\n    Err(e) if is_cross_chain_sync_stuck(&e) => {\n        // Sync all origin chains fully, then rebuild and retry the proposal.\n        client.prepare_chain().await?;\n        client.execute_operations(operations, vec![]).await\n    }\n    other => other,\n}","preventionTips":["Fully download chains that send you messages before proposing blocks that consume them","After restoring a wallet, run a full chain sync before executing cross-chain-dependent operations","Keep client and validator versions aligned across cross-chain bundle format changes"],"tags":["linera","cross-chain","messages","sync","validators"],"backgroundTag":"cross-chain-sync-failed","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}