{"record":{"id":"4aad633dc1cacaf0","repo":"FuelLabs/fuel-core","slug":"write-block-timed-out-after","errorCode":null,"errorMessage":"write_block timed out after {:?}","messagePattern":"write_block timed out after (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/fuel-core/src/service/adapters/consensus_module/poa.rs","lineNumber":1352,"sourceCode":"            }\n            Ok(Err(err)) if err.to_string().contains(\"FENCING_ERROR:\") => {\n                poa_metrics().write_block_fencing_error_total.inc();\n                tracing::warn!(\n                    \"write_block: fencing rejected (height={block_height}): {err}\"\n                );\n                Ok(WriteBlockResult::FencingRejected)\n            }\n            Ok(Err(err)) => {\n                poa_metrics().write_block_error_total.inc();\n                RedisLeaderLeaseAdapter::clear_cached_connection_for(&self.redis_node)\n                    .await;\n                Err(err.into())\n            }\n            Err(_) => {\n                poa_metrics().write_block_error_total.inc();\n                RedisLeaderLeaseAdapter::clear_cached_connection_for(&self.redis_node)\n                    .await;\n                Err(anyhow!(\n                    \"write_block timed out after {:?}\",\n                    self.node_timeout\n                ))\n            }\n        }\n    }\n\n    async fn check_lease_owner(&self) -> bool {\n        let mut connection = match RedisLeaderLeaseAdapter::multiplexed_connection_for(\n            &self.redis_node,\n            self.node_timeout,\n        )\n        .await\n        {\n            Ok(connection) => connection,\n            Err(_) => return false,\n        };\n        let is_owner = timeout(","sourceCodeStart":1334,"sourceCodeEnd":1370,"githubUrl":"https://github.com/FuelLabs/fuel-core/blob/add100d30d21498e8528c46be8567fbd2ea019af/crates/fuel-core/src/service/adapters/consensus_module/poa.rs#L1334-L1370","documentation":"A single-node Redis write in publish_block_on_node exceeded its configured write_block timeout. The elapsed deadline (included via {:?}) triggers before the Redis client returns, so the outcome of the actual write on that node is unknown — it may have committed after the deadline. Distinct from the FENCING_ERROR branch handled above it; this is a plain timeout error propagating up after the cached connection for the node is cleared.","triggerScenarios":"Thrown at crates/fuel-core/src/service/adapters/consensus_module/poa.rs:1352 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry the write on the same node — idempotent block writes make a second attempt safe even if the first eventually committed","Clear/re-establish the Redis connection for the node (the code already clears the cached connection) to drop a possibly stale socket","Tune the write_block timeout to match observed Redis latency (write_block_error_total and fencing metrics help)","Rely on the quorum logic: one timed-out node only matters if it drops writes below quorum, in which case repair_sub_quorum_block re-publishes"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"add100d30d21498e8528c46be8567fbd2ea019af","analyzedAt":"2026-09-05T18:46:12.018Z","contentChangedAt":"2026-09-05T18:46:12.018Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}