{"record":{"id":"2d1b7d40509a1efd","repo":"facebook/flow","slug":"failed-to-deserialize-filesig","errorCode":null,"errorMessage":"failed to deserialize FileSig","messagePattern":"failed to deserialize FileSig","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"rust_port/crates/flow_heap_serialization/src/lib.rs","lineNumber":115,"sourceCode":"    let (module, _): (Module<Loc>, _) =\n        bincode::serde::decode_from_slice(&decompressed, bincode::config::legacy())\n            .expect(\"failed to deserialize type sig Module\");\n    clear_file_key();\n    Arc::new(module)\n}\n\npub fn serialize_file_sig(file_sig: &FileSig) -> Vec<u8> {\n    let bytes = bincode::serde::encode_to_vec(file_sig, bincode::config::legacy())\n        .expect(\"failed to serialize FileSig\");\n    compress(&bytes)\n}\n\npub fn deserialize_file_sig(file_key: &FileKey, bytes: &[u8]) -> Arc<FileSig> {\n    let decompressed = decompress(bytes);\n    set_file_key(file_key);\n    let (file_sig, _): (FileSig, _) =\n        bincode::serde::decode_from_slice(&decompressed, bincode::config::legacy())\n            .expect(\"failed to deserialize FileSig\");\n    clear_file_key();\n    Arc::new(file_sig)\n}\n\npub fn serialize_exports(exports: &Exports) -> Vec<u8> {\n    let bytes = bincode::serde::encode_to_vec(exports, bincode::config::legacy())\n        .expect(\"failed to serialize Exports\");\n    compress(&bytes)\n}\n\npub fn deserialize_exports(bytes: &[u8]) -> Arc<Exports> {\n    let decompressed = decompress(bytes);\n    let (exports, _): (Exports, _) =\n        bincode::serde::decode_from_slice(&decompressed, bincode::config::legacy())\n            .expect(\"failed to deserialize Exports\");\n    Arc::new(exports)\n}\n","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/facebook/flow/blob/f88ac94bcf6992f5d5a158854d94613ebb92c6e6/rust_port/crates/flow_heap_serialization/src/lib.rs#L97-L133","documentation":"Panics when bincode fails to decode a FileSig from decompressed bytes. FileSig caches per-file signatures (content hash, dependencies) used to decide rechecking; the file_key thread-local is set before decoding because locations are resolved against it. Corruption or writer/reader version mismatch triggers the panic.","triggerScenarios":"deserialize_file_sig on a file-sig cache entry that is truncated, from another flow version, or decoded under the wrong file_key; cache files partially overwritten.","commonSituations":"Saved state reused across flow upgrades; a killed daemon leaving half-written sig files; cache dirs copied between machines with different builds.","solutions":["Delete the file-sig cache/saved state so signatures are recomputed","Version-stamp cache paths so old entries are never read by new binaries","Write cache entries atomically (temp + rename)"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {\n    flow_heap_serialization::deserialize_file_sig(&file_key, &bytes)\n})) {\n    Ok(s) => s,\n    Err(_) => { std::fs::remove_file(&cache_path).ok(); recompute_file_sig(&file_key)? }\n}","preventionTips":["Clear file-sig caches when switching flow versions","Write cache entries atomically so truncated records never appear","Verify recorded vs actual file size before deserializing"],"tags":["rust","bincode","serialization","file-signature","saved-state"],"backgroundTag":"bincode-decode-error","analyzedSha":"f88ac94bcf6992f5d5a158854d94613ebb92c6e6","analyzedAt":"2026-08-20T10:41:37.992Z","schemaVersion":2},"datasetVersion":"2026-08-23T11:17:13.642Z"}