{"record":{"id":"c1d7b1dcdaf34a6d","repo":"tursodatabase/turso","slug":"invalid-mvcc-logical-log-header-flags","errorCode":null,"errorMessage":"invalid MVCC logical log header flags","messagePattern":"invalid MVCC logical log header flags","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":1106,"sourceCode":"        end_offset: offset as u64,\n        crc_by_offset,\n    })\n}\n\nfn is_nonportable_mvcc_log_error(err: &anyhow::Error) -> bool {\n    let message = err.to_string();\n    message.starts_with(\"unsupported MVCC logical log version \")\n}\n\nfn validate_mvcc_log_header(log: &[u8]) -> Result<()> {\n    if read_u32_le(log, 0)? != MVCC_LOG_MAGIC {\n        return Err(anyhow!(\"invalid MVCC logical log magic\"));\n    }\n    if log[4] != MVCC_LOG_VERSION {\n        return Err(anyhow!(\"unsupported MVCC logical log version {}\", log[4]));\n    }\n    if log[5] & 0b1111_1110 != 0 {\n        return Err(anyhow!(\"invalid MVCC logical log header flags\"));\n    }\n    let header_len = u16::from_le_bytes([log[6], log[7]]) as usize;\n    if header_len != MVCC_LOG_HEADER_SIZE {\n        return Err(anyhow!(\n            \"invalid MVCC logical log header length: {header_len}\"\n        ));\n    }\n    if log[MVCC_LOG_HEADER_RESERVED_START..MVCC_LOG_HEADER_CRC_START]\n        .iter()\n        .any(|byte| *byte != 0)\n    {\n        return Err(anyhow!(\n            \"MVCC logical log header reserved bytes must be zero\"\n        ));\n    }\n    let stored_crc = read_u32_le(log, MVCC_LOG_HEADER_CRC_START)?;\n    let mut crc_buf = [0u8; MVCC_LOG_HEADER_SIZE];\n    crc_buf.copy_from_slice(&log[..MVCC_LOG_HEADER_SIZE]);","sourceCodeStart":1088,"sourceCodeEnd":1124,"githubUrl":"https://github.com/tursodatabase/turso/blob/492c4a71cd7c2649e7df83da1471b74f4b1c7aa9/cli/sync_server.rs#L1088-L1124","documentation":"Byte 5 of the MVCC logical log header is a flags field where only bit 0 (0x1) is defined; validate_mvcc_log_header requires (log[5] & 0b1111_1110) == 0. The error fires when any other bit is set, which indicates either a corrupted header or a future format revision that assigned new header flag bits this build does not understand.","triggerScenarios":"scan_mvcc_log -> validate_mvcc_log_header on a >= 56-byte log whose flags byte at log[5] has any bit above bit 0 set (e.g. 0x02, 0x80) during a POST /pull-updates logical pull.","commonSituations":"Bit rot or a torn header write after a crash during log creation; running a fork that writes extra header flags against a stock tursodb server; a log file edited or truncated then re-padded manually.","solutions":["Restore the MVCC logical log from a known-good backup (single flipped bit or torn write is the usual cause)","Delete/regenerate the log and let clients resync via replace-base fallback","If you maintain the writer, verify no build sets header flags beyond bit 0 before shipping a format change"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn mvcc_header_flags_ok(log: &[u8]) -> bool {\n    log.len() > 5 && (log[5] & 0b1111_1110) == 0\n}","typeGuard":"fn is_likely_valid_mvcc_header(log: &[u8]) -> bool {\n    log.len() >= MVCC_LOG_HEADER_SIZE\n        && read_u32_le(log, 0) == Ok(MVCC_LOG_MAGIC)\n        && log[4] == MVCC_LOG_VERSION\n        && (log[5] & 0b1111_1110) == 0\n}","tryCatchPattern":"if let Err(err) = scan_mvcc_log(&log) {\n    if err.to_string().contains(\"MVCC logical log header\") {\n        // header-level corruption: quarantine file, alert, fall back to replace-base\n    }\n}","preventionTips":["Write log headers from zeroed buffers so undefined fields stay zero","fsync the header before appending frames","Keep backups of the logical log so corruption means restore, not data loss"],"tags":["mvcc","sync-server","header-validation","corruption","flags"],"backgroundTag":"invalid-file-header","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"}