{"record":{"id":"bb1ba6d765b7d818","repo":"tursodatabase/turso","slug":"mvcc-logical-log-extension-block-missing-flag-at-o","errorCode":null,"errorMessage":"MVCC logical log extension block missing flag at offset {offset}","messagePattern":"MVCC logical log extension block missing flag at offset (.+?)","errorType":"http","errorClass":"anyhow::Error","httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":1183,"sourceCode":"    let payload_size = usize::try_from(read_u64_le(log, offset + 4)?)\n        .map_err(|_| anyhow!(\"MVCC logical log payload size overflows usize\"))?;\n    let extension_size = if has_extension_header {\n        let extension_size = usize::try_from(read_u64_le(log, offset + 24)?)\n            .map_err(|_| anyhow!(\"MVCC logical log extension size overflows usize\"))?;\n        let extension_record_count = read_u32_le(log, offset + 32)?;\n        let frame_flags = read_u32_le(log, offset + 36)?;\n        if frame_flags & !MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK != 0 {\n            return Err(anyhow!(\n                \"unsupported MVCC logical log frame flags at offset {offset}: {frame_flags:#x}\"\n            ));\n        }\n        if extension_size == 0 && extension_record_count != 0 {\n            return Err(anyhow!(\n                \"MVCC logical log extension record count without extension block at offset {offset}\"\n            ));\n        }\n        if extension_size > 0 && frame_flags & MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK == 0 {\n            return Err(anyhow!(\n                \"MVCC logical log extension block missing flag at offset {offset}\"\n            ));\n        }\n        extension_size\n    } else {\n        0\n    };\n    let trailer_start = offset\n        .checked_add(header_size)\n        .and_then(|value| value.checked_add(payload_size))\n        .and_then(|value| value.checked_add(extension_size))\n        .ok_or_else(|| anyhow!(\"MVCC logical log frame offset overflow\"))?;\n    let frame_end = trailer_start\n        .checked_add(MVCC_TX_TRAILER_SIZE)\n        .ok_or_else(|| anyhow!(\"MVCC logical log frame end overflow\"))?;\n    if frame_end > log.len() {\n        return Ok(None);\n    }","sourceCodeStart":1165,"sourceCodeEnd":1201,"githubUrl":"https://github.com/tursodatabase/turso/blob/492c4a71cd7c2649e7df83da1471b74f4b1c7aa9/cli/sync_server.rs#L1165-L1201","documentation":"The mirror invariant of error 769: a nonzero extension-block size requires MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK to be set in the frame flags word at offset+36. A block present without its flag means the frame layout and its metadata disagree, so the reader stops.","triggerScenarios":"read_mvcc_frame_boundary computes extension_size > 0 while frame_flags & MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK == 0 on an extension frame.","commonSituations":"A writer that appends extension blocks but forgets to set the flag (fork bug); corruption that cleared the flag bit; mixed logs produced by two different writer versions.","solutions":["Restore or regenerate the MVCC log","If forking the writer, set MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK whenever a block is emitted and cover it with a round-trip test"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"let snapshot = match scan_mvcc_log(&log) {\n    Ok(s) => s,\n    Err(err) if err.to_string().contains(\"extension block missing flag\") => {\n        restore_or_rebuild()?\n    }\n    Err(err) => return Err(err),\n};","preventionTips":["Set MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK in the writer whenever a block is emitted","Add writer-side assertions that fail fast on inconsistent frames","Test mixed workloads with and without extension blocks"],"tags":["mvcc","sync-server","extension-block","invariant","corruption"],"backgroundTag":"corrupt-log-file","analyzedSha":"492c4a71cd7c2649e7df83da1471b74f4b1c7aa9","analyzedAt":"2026-08-20T07:02:18.389Z","contentChangedAt":"2026-08-20T07:02:18.389Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}