{"record":{"id":"1254910bed833d2f","repo":"tursodatabase/turso","slug":"database-page-number-does-not-fit-u32-page-no","errorCode":null,"errorMessage":"database page number does not fit u32: {page_no}","messagePattern":"database page number does not fit u32: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":972,"sourceCode":"            status: 200,\n            content_type: \"application/protobuf\".to_string(),\n            body: response_body,\n        })\n    }\n\n    #[allow(clippy::type_complexity)]\n    fn read_replace_base_pages(&self, db: &DbHandle) -> Result<(u64, Vec<(u64, Vec<u8>)>)> {\n        let conn = db.conn.lock().unwrap();\n        let wal_state = conn.wal_state()?;\n        let frame_watermark = Some(wal_state.max_frame);\n        let db_size = current_snapshot_db_size_pages(&conn, wal_state.max_frame)?;\n        let pages_capacity = usize::try_from(db_size)\n            .map_err(|_| anyhow!(\"database page count does not fit usize: {db_size}\"))?;\n        let mut pages = Vec::with_capacity(pages_capacity);\n\n        for page_no in 1..=db_size {\n            let page_no_u32 = u32::try_from(page_no)\n                .map_err(|_| anyhow!(\"database page number does not fit u32: {page_no}\"))?;\n            let mut page = vec![0; PAGE_SIZE];\n            let found =\n                conn.try_wal_watermark_read_page(page_no_u32, &mut page, frame_watermark)?;\n            if !found {\n                return Err(anyhow!(\n                    \"database page {} is missing from replace-base snapshot\",\n                    page_no\n                ));\n            }\n            pages.push((page_no - 1, page));\n        }\n\n        Ok((db_size, pages))\n    }\n}\n\nstruct HttpResponse {\n    status: u16,","sourceCodeStart":954,"sourceCodeEnd":990,"githubUrl":"https://github.com/tursodatabase/turso/blob/492c4a71cd7c2649e7df83da1471b74f4b1c7aa9/cli/sync_server.rs#L954-L990","documentation":"While iterating pages 1..=db_size for a replace-base snapshot, a page number failed u32::try_from when calling the page-read API. SQLite-format page numbers are inherently 32-bit, so a db_size with pages beyond u32::MAX implies a malformed or corrupt size (a 16+ TiB database), not a realistic file.","triggerScenarios":"read_replace_base_pages encounters a db_size (from current_snapshot_db_size_pages) larger than u32::MAX, so some page_no in the loop overflows the u32 the try_wal_watermark_read_page API requires.","commonSituations":"Corrupt database header or WAL-driven size metadata; bit-flipped size fields; not producible by valid SQLite-format databases of realistic size.","solutions":["Verify the database file and WAL integrity (dbhash / integrity check) and restore from backup","Confirm the db and WAL files belong together and were not truncated or swapped"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":"fn fits_u32(v: u64) -> bool {\n    u32::try_from(v).is_ok()\n}","tryCatchPattern":null,"preventionTips":["Treat any occurrence as corruption: verify the db/WAL pair and restore from backup","Run integrity checks before serving sync traffic"],"tags":["sync-server","overflow","u32","page-number","corruption"],"backgroundTag":"integer-overflow","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"}