next.js
0f089d5f - turbo-persistence: fix mmap page alignment and improve error context in MetaFile::open_internal (#91640)

Commit
198 days ago
turbo-persistence: fix mmap page alignment and improve error context in MetaFile::open_internal (#91640) ### What? Two changes to `turbopack/crates/turbo-persistence/src/meta_file.rs` and `mmap_helper.rs`: 1. **Bug fix: mmap page alignment** — `MmapOptions::offset()` requires the offset to be page-aligned (typically 4096 bytes), but the code was passing `file.stream_position()` (the byte position after reading the variable-length header), which is not guaranteed to be page-aligned. This would cause `mmap` to fail or behave incorrectly on some inputs. 2. **Improved error context** — Add `.context("...")` to all `?` operators in `open_internal` (except read calls) and inside `advise_mmap_for_persistence`, so errors carry actionable context. The filename is already attached by the `MetaFile::open` wrapper, so no filename is repeated in these messages. ### Why? The mmap offset bug could cause silent failures or panics when the meta file header length is not a multiple of the OS page size. The missing error context made it hard to diagnose failures in production. ### How? **mmap fix (`meta_file.rs`):** - Remove `options.offset(offset)` — map the entire file from byte 0 instead. - Add a new `amqf_data_start: usize` field to `MetaFile` storing the header-end byte offset. - `amqf_data()` now returns `&self.mmap[self.amqf_data_start..]`, exposing only the AMQF data region. All existing callers that index into `amqf_data()` continue to work unchanged since their offsets are already relative to the start of AMQF data. **Error context (`meta_file.rs`):** - `File::open(path)?` → `.context("Failed to open meta file")` - `file.stream_position()?` → `.context("Failed to get stream position")` - `unsafe { options.map(&file) }.with_context(|| format!(...))` → `.context("Failed to mmap")` (drop the closure and filename, already provided by the outer wrapper) - `mmap.advise(Advice::Random)?` → `.context("Failed to advise mmap")` **Error context (`mmap_helper.rs`):** - `Advice::DontFork` → `.context("Failed to advise mmap DontFork")` - `Advice::Unmergeable` → `.context("Failed to advise mmap Unmergeable")` Co-authored-by: Tobias Koppers <sokra@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
Author
Parents
Loading