Skip to content

fix(db): sync the database version file when creating it - #27880

Open
avalkov wants to merge 5 commits into
paradigmxyz:mainfrom
avalkov:fix/db-version-file-fsync
Open

avalkov wants to merge 5 commits into
paradigmxyz:mainfrom
avalkov:fix/db-version-file-fsync

Conversation

@avalkov

@avalkov avalkov commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

create_db_version_file writes database.version with fs::write, which never syncs. If a host loses power or crashes in the first seconds after a datadir is created, before the kernel writes the page back, the file survives empty. Every later start then fails with unable to determine the version of the database, file is malformed, until someone fixes the file by hand or wipes the datadir. That hits new nodes in particular: fresh syncs and snapshot restores.

This writes the file with reth_fs_util::atomic_write_file, the helper nippy-jar configs and the ExEx WAL already use. It writes a temporary file, syncs it, renames it into place, and syncs the directory. create_db_version_file now returns FsPathError instead of io::Error; its only caller is create_db.

Found with a LazyFS crash harness that drops unsynced writes on command. With fs::write, every cut right after creation left an empty file; with this change the file survived every cut. Unit tests cover the created file and replacing an empty one.

`create_db_version_file` wrote `database.version` with `fs::write`, which does not sync. A power
loss or host crash in the first seconds after a datadir is created, before the kernel writes the
page back, leaves the file empty. `check_db_version_file` then reports `MalformedFile` and the node
refuses to start until the file is fixed by hand or the datadir is wiped.

Write it with `reth_fs_util::atomic_write_file` instead, as nippy-jar configs and the ExEx WAL
already do: a temporary file is written, synced, renamed into place, and the directory synced.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant