installer: final: Delete SQLite WAL and shm files upon completion.

Previously, db.sqlite-{wal,shm} could be left behind after stopping
guix-daemon.  When resuming installation, SQLite could end up behaving
as if transactions visible in the WAL file had been committed, in spite
of having restored SAVED-DATABASE.

Fixes <https://issues.guix.gnu.org/59784>.
Reported by pelzflorian (Florian Pelz) <pelzflorian@pelzflorian.de>.

* gnu/installer/final.scm (install-system): Before restarting
guix-daemon, delete db.sqlite-{wal,shm}.
This commit is contained in:
Ludovic Courtès 2022-12-18 00:35:21 +01:00
parent 9b6703eabe
commit 495c50008b
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -221,10 +221,18 @@ (define (assert-exit x)
;; alive. ;; alive.
(stop-service 'guix-daemon) (stop-service 'guix-daemon)
;; Restore the database and restart it. ;; Restore the database and restart it. As part of restoring the
;; database, remove the WAL and shm files in case they were left
;; behind after guix-daemon was stopped. Failing to do so,
;; sqlite might behave as if transactions that appear in the WAL
;; file were committed. (See <https://www.sqlite.org/wal.html>.)
(installer-log-line "restoring store database from '~a'" (installer-log-line "restoring store database from '~a'"
saved-database) saved-database)
(copy-file saved-database database-file) (copy-file saved-database database-file)
(for-each (lambda (suffix)
(false-if-exception
(delete-file (string-append database-file suffix))))
'("-wal" "-shm"))
(start-service 'guix-daemon) (start-service 'guix-daemon)
;; Finally umount the cow-store and exit the container. ;; Finally umount the cow-store and exit the container.