{"record":{"id":"af998367bdb2f3f4","repo":"tursodatabase/turso","slug":"mvcc-logical-log-extension-record-count-without-ex","errorCode":null,"errorMessage":"MVCC logical log extension record count without extension block at offset {offset}","messagePattern":"MVCC logical log extension record count without extension block at offset (.+?)","errorType":"http","errorClass":"anyhow::Error","httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":1178,"sourceCode":"        MVCC_TX_HEADER_SIZE\n    };\n    if log.len() - offset < header_size + MVCC_TX_TRAILER_SIZE {\n        return Ok(None);\n    }\n    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","sourceCodeStart":1160,"sourceCodeEnd":1196,"githubUrl":"https://github.com/tursodatabase/turso/blob/492c4a71cd7c2649e7df83da1471b74f4b1c7aa9/cli/sync_server.rs#L1160-L1196","documentation":"An internal consistency rule of extended frames: if the extension-block size (u64 at offset+24) is zero, the extension record count (u32 at offset+32) must also be zero. A nonzero count with no block is a contradictory frame that the reader refuses rather than mis-parse.","triggerScenarios":"read_mvcc_frame_boundary sees extension_size == 0 while extension_record_count != 0 on a frame during scan_mvcc_log.","commonSituations":"Corrupted extension header fields; a writer bug that emits counts without blocks; hand-edited or partially overwritten frames.","solutions":["Restore the log from backup or regenerate it; the frame is internally inconsistent","If you wrote the frame producer, assert block-size and record-count agreement in tests"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Extension-block invariants are internal consistency rules;\n// any violation means corruption - restore or regenerate.\nlet snapshot = scan_mvcc_log(&log)\n    .map_err(|err| anyhow!(\"MVCC log frame metadata inconsistent: {err}\"))?;","preventionTips":["If you fork the writer, add round-trip tests asserting block-size/count/flag agreement","Keep backups; invariant violations are not repairable in place","Avoid concurrent writers that can interleave partial frames"],"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"}