{"record":{"id":"2c6ff5fa4469182c","repo":"tursodatabase/turso","slug":"unsupported-mvcc-logical-log-frame-flags-at-offset","errorCode":null,"errorMessage":"unsupported MVCC logical log frame flags at offset {offset}: {frame_flags:#x}","messagePattern":"unsupported MVCC logical log frame flags at offset (.+?): (.+?)","errorType":"http","errorClass":"anyhow::Error","httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":1173,"sourceCode":"        ));\n    }\n    let header_size = if has_extension_header {\n        MVCC_TX_EXT_HEADER_SIZE\n    } else {\n        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","sourceCodeStart":1155,"sourceCodeEnd":1191,"githubUrl":"https://github.com/tursodatabase/turso/blob/492c4a71cd7c2649e7df83da1471b74f4b1c7aa9/cli/sync_server.rs#L1155-L1191","documentation":"Extended frames store a u32 flags word at offset+36; this build only defines MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK and rejects any other bits. Unknown flag bits mean the frame was written by a format revision newer than the reader, or the flags word is corrupt.","triggerScenarios":"read_mvcc_frame_boundary evaluates frame_flags & !MVCC_TX_FRAME_FLAG_HAS_EXTENSION_BLOCK != 0 on an extension frame - e.g. a newer tursodb that defined additional frame flags wrote the log.","commonSituations":"Version skew: log written by a newer build, served by an older one; corruption of the flags word; forks that add flags without bumping MVCC_LOG_VERSION.","solutions":["Upgrade the sync server to the tursodb version that wrote the log","Regenerate the MVCC log if the skew is one-way and clients can resync","If maintaining the format, add flags only together with a MVCC_LOG_VERSION bump so old readers reject cleanly"],"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().starts_with(\"unsupported MVCC logical log frame flags\") => {\n        // likely written by a newer format revision: regenerate log or upgrade reader\n        upgrade_or_regenerate()?\n    }\n    Err(err) => return Err(err),\n};","preventionTips":["Keep writer and reader versions in lockstep when frames carry flags","Bump MVCC_LOG_VERSION whenever new frame flags are introduced","Log the offending flags value so skew can be diagnosed from server logs"],"tags":["mvcc","sync-server","frame-flags","version-mismatch"],"backgroundTag":"unsupported-format-flags","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"}