enable persistent WAL mode for sqlite db
allow processes without write access to the directory containing the db to read the db when all connections are closed. Without this setting and with WAL enabled and no open db connections unprivileged processes will fail to open the db due the WAL files not existing and not able to create them. When the WAL files are persistent unprivileged processeses can read the db when there are no open connections. Additionally, 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. https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal https://www.sqlite.org/pragma.html#pragma_journal_size_limit https://github.com/sqlite/sqlite/blob/ed517a708284b6e00b6ae5f1e3f702bbfcbd32ed/src/wal.c#L2518 Fixes https://github.com/NixOS/nix/issues/10300
This commit is contained in:
1 file changed
+13
@@ -552,6 +552,19 @@ void LocalStore::openDB(State & state, bool create)
|
||||
sqlite3_exec(db, ("pragma main.journal_mode = " + mode + ";").c_str(), 0, 0, 0) != SQLITE_OK)
|
||||
SQLiteError::throw_(db, "setting journal mode");
|
||||
|
||||
if (mode == "wal") {
|
||||
/* persist the WAL files when the db connection is closed. This allows
|
||||
for read-only connections without write permissions on the
|
||||
containing directory to succeed on a closed db. 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) {
|
||||
int enable = 1;
|
||||
sqlite3_file_control(db, NULL, SQLITE_FCNTL_PERSIST_WAL, &enable);
|
||||
}
|
||||
}
|
||||
|
||||
/* Increase the auto-checkpoint interval to 40000 pages. This
|
||||
seems enough to ensure that instantiating the NixOS system
|
||||
derivation is done in a single fsync(). */
|
||||
|
||||
Reference in new issue
Block a user