Repository navigation
Conversation
`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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.