{"record":{"id":"c37d39c915f9f0ab","repo":"linera-io/linera-protocol","slug":"processdeposit-not-committed-other","errorCode":null,"errorMessage":"ProcessDeposit not committed: {other:?}","messagePattern":"ProcessDeposit not committed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"linera-bridge/src/relay/mod.rs","lineNumber":654,"sourceCode":"                                count = operations.len(),\n                                \"Submitting ProcessDeposit operations...\"\n                            );\n\n                            chain_client.synchronize_from_validators().await\n                                .context(\"failed to synchronize\")?;\n\n                            let outcome = chain_client\n                                .execute_operations(operations, vec![])\n                                .await?;\n                            match outcome {\n                                linera_core::data_types::ClientOutcome::Committed(cert) => {\n                                    tracing::info!(\n                                        height = %cert.block().header.height,\n                                        \"ProcessDeposit committed\"\n                                    );\n                                }\n                                other => {\n                                    anyhow::bail!(\"ProcessDeposit not committed: {other:?}\");\n                                }\n                            };\n                            Ok(())\n                        }.await;\n                        if response.send(result).is_err() {\n                            tracing::debug!(\"ProcessDeposit response receiver dropped\");\n                        }\n                        update_balance_metrics(&evm_client, &linera_client).await;\n                    }\n                }\n            }\n        }\n    }\n\n    Ok(())\n}\n","sourceCodeStart":636,"sourceCodeEnd":671,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-bridge/src/relay/mod.rs#L636-L671","documentation":"The relay submitted ProcessDeposit operations via chain_client.execute_operations and the outcome was not ClientOutcome::Committed — it was WaitForTimeout (the bridge chain is multi-owner and this client is not the current leader) or Conflict (another block was committed at the same height first). The deposit operations therefore did not land in this block.","triggerScenarios":"Another relay instance or the leader client concurrently processes the same inbox/deposits (Conflict); the bridge chain's round leadership is held by a different owner during a multi-owner round, so execute_operations returns WaitForTimeout until the round changes.","commonSituations":"Running two relay instances against the same bridge chain (one wins, the other conflicts); rotating leadership on a multi-owner committee chain where the relay must wait its turn; a stale client that has not synchronized the latest block height racing a concurrent submitter.","solutions":["If WaitForTimeout: this is usually transient — retry after synchronizing; leadership rotation lets the same operations commit in a later round.","If Conflict: run chain_client.synchronize_from_validators() and retry — the conflicting block often already contains the deposits; verify the deposit was processed (query isDepositProcessed) before resubmitting.","Ensure only one relay instance operates the bridge chain at a time to avoid chronic conflicts.","Treat the error as retryable at the monitor/retry layer rather than fatal."],"exampleFix":"// before\nother => {\n    anyhow::bail!(\"ProcessDeposit not committed: {other:?}\");\n}\n\n// after: branch on the outcome for retry semantics\nmatch outcome {\n    ClientOutcome::Committed(cert) => tracing::info!(height = %cert.block().header.height, \"ProcessDeposit committed\"),\n    ClientOutcome::WaitForTimeout(t) => anyhow::bail!(\n        \"ProcessDeposit deferred: not leader until {}; retry after round change\", t.timestamp),\n    ClientOutcome::Conflict(cert) => anyhow::bail!(\n        \"ProcessDeposit conflicted with block {}; sync and re-check isDepositProcessed\", cert.hash()),\n}","handlingStrategy":"retry","validationCode":"// Before resubmitting after a Conflict, verify whether the deposits were already\n// processed by the competing block:\nif monitor.query_deposit_processed(&deposit_key).await? { return Ok(()); }","typeGuard":null,"tryCatchPattern":"match outcome {\n    ClientOutcome::Committed(c) => Ok(c),\n    ClientOutcome::WaitForTimeout(_) | ClientOutcome::Conflict(_) => {\n        // transient on multi-owner chains: sync, re-check idempotency, retry\n        chain_client.synchronize_from_validators().await?;\n        Err(retryable) // let the retry loop resubmit\n    }\n}","preventionTips":["Run exactly one relay instance per bridge chain to avoid chronic conflicts.","Always synchronize_from_validators before execute_operations to reduce stale-height conflicts."],"tags":["linera-bridge","relay","multi-owner-chain","conflict","retry","rust"],"backgroundTag":"block-commit-conflict","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}