summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-12-21 23:35:20 +0100
committerLudovic Courtès <ludo@gnu.org>2018-12-21 23:50:13 +0100
commitbdf860c2e99077d431da0cc1db4fc14db2a35d31 (patch)
tree5414c8953d73683e35f353bf6379654955fb8812
parentb96e05aefd7a4f734cfec3b27c2d38320d43b687 (diff)
database: Use "write-ahead log" mode and set a long "busy timeout".
This should avoid "database is locked" errors when there's a lot of concurrency, for instance when offloading simultaneously a lot of builds. * guix/store/database.scm (call-with-database): Add two 'sqlite-exec' calls to set 'journal_mode' and 'busy_timeout'.
-rw-r--r--guix/store/database.scm9
1 files changed, 9 insertions, 0 deletions
diff --git a/guix/store/database.scm b/guix/store/database.scm
index e6bfbe763e..4791f49865 100644
--- a/guix/store/database.scm
+++ b/guix/store/database.scm
@@ -79,6 +79,15 @@ as specified by SQL-SCHEMA."
create it and initialize it as a new database."
(let ((new? (not (file-exists? file)))
(db (sqlite-open file)))
+ ;; Turn DB in "write-ahead log" mode, which should avoid SQLITE_LOCKED
+ ;; errors when we have several readers: <https://www.sqlite.org/wal.html>.
+ (sqlite-exec db "PRAGMA journal_mode=WAL;")
+
+ ;; Install a busy handler such that, when the database is locked, sqlite
+ ;; retries until 30 seconds have passed, at which point it gives up and
+ ;; throws SQLITE_BUSY.
+ (sqlite-exec db "PRAGMA busy_timeout = 30000;")
+
(dynamic-wind noop
(lambda ()
(when new?