Repository navigation
feat: add Database#persistWal() to keep the WAL on close - #49
Merged
Merged
Conversation
Add a persistWal([toggleState]) method that sets SQLITE_FCNTL_PERSIST_WAL on the connection's main database. While it is on, the last connection to close still checkpoints the WAL into the database, but keeps the -wal and -shm files instead of deleting them. The next connection then appends to the same WAL with the same salt. This lets zero-cache keep a replica's WAL intact across closes, so a litestream backup can continue from it instead of taking a new snapshot. Today zero-cache does that by holding an extra connection open (WalKeeper). Persistence is off by default, so behavior is unchanged for existing users. It is a no-op for in-memory and temporary databases, and throws if the connection is closed. Turn it off before switching the database out of WAL mode. Otherwise SQLite leaves the -wal file in place and reopens it on the next transaction, so the database effectively stays in WAL mode.
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.
Add a
persistWal([toggleState])method that setsSQLITE_FCNTL_PERSIST_WALon the connection's main database. While it is on, the last connection to close still checkpoints the WAL into the database, but keeps the -wal and -shm files instead of deleting them. The next connection then appends to the same WAL with the same salt.This lets zero-cache keep a replica's WAL intact across closes, so a litestream backup can continue from it instead of taking a new snapshot. Today zero-cache does that by holding an extra connection open (WalKeeper).
Persistence is off by default, so behavior is unchanged for existing users. It is a no-op for in-memory and temporary databases, and throws if the connection is closed.
Turn it off before switching the database out of WAL mode. Otherwise SQLite leaves the -wal file in place and reopens it on the next transaction, so the database effectively stays in WAL mode.