truncate WAL files on exit

Fix for https://github.com/NixOS/nix/issues/10300

18a2620273  enabled persistent WAL files that will never get truncated. to fix this, journal_size_limit is set to 2^40, which results in the WAL files being truncated to 0 on exit, as well as limiting the WAL files to 2^40 bytes following a checkpoint.

this aligns lix with the nix change: https://github.com/NixOS/nix/pull/10301

https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal
https://www.sqlite.org/pragma.html#pragma_journal_size_limit
ed517a7082/src/wal.c (L2518)

PR-Link: https://github.com/lix-project/lix/pull/9

Co-Authored-By: paparodeo <170618376+paparodeo@users.noreply.github.com>
Change-Id: I90ec1a467c92c582ff8c07dd363a4cf789782214
This commit is contained in:
annalee 2024-03-23 06:41:33 +00:00 committed by jade
parent 0c6cb34de6
commit 713cd7e9e7

View file

@ -550,7 +550,12 @@ void LocalStore::openDB(State & state, bool create)
if (mode == "wal" ) { if (mode == "wal" ) {
/* persist the WAL files when the DB connection is closed. /* persist the WAL files when the DB connection is closed.
* This allows for read-only connections without any write permissions * This allows for read-only connections without any write permissions
* on the state directory to succeed on a closed database. */ * on the state directory to succeed on a closed database. Setting the
* journal_size_limit to 2^40 bytes results in the WAL files getting
* truncated to 0 on exit and limits the on disk size of the WAL files
* to 2^40 bytes following a checkpoint */
if (sqlite3_exec(db, "pragma main.journal_size_limit = 1099511627776;", 0, 0, 0) != SQLITE_OK)
SQLiteError::throw_(db, "setting journal_size_limit");
int enable = 1; int enable = 1;
if (sqlite3_file_control(db, NULL, SQLITE_FCNTL_PERSIST_WAL, &enable) != SQLITE_OK) if (sqlite3_file_control(db, NULL, SQLITE_FCNTL_PERSIST_WAL, &enable) != SQLITE_OK)
SQLiteError::throw_(db, "setting persistent WAL mode"); SQLiteError::throw_(db, "setting persistent WAL mode");