guix gc: Add '--vacuum-database'.
authorEfraim Flashner <efraim@flashner.co.il>
Wed, 19 Oct 2022 09:19:04 +0000 (12:19 +0300)
committerEfraim Flashner <efraim@flashner.co.il>
Sun, 6 Nov 2022 12:02:08 +0000 (14:02 +0200)
* guix/scripts/gc.scm (show-help, %options): Add '--vacuum-database'.
* guix/store/database.scm (vacuum-database): New procedure.
* doc/guix.texi (Invoking guix gc): Document the option.

doc/guix.texi
guix/scripts/gc.scm
guix/store/database.scm

index 7806b21..1eb47e3 100644 (file)
@@ -4531,6 +4531,18 @@ import, unless it was started with @option{--disable-deduplication}
 this option is primarily useful when the daemon was running with
 @option{--disable-deduplication}.
 
+@item --vacuum-database
+@cindex vacuum the store database
+@comment Avoid words like 'repair,' 'compress,' and 'optimize.'
+Guix uses an sqlite database to keep track of the items in (@pxref{The Store}).
+Over time it is possible that the database may grow to a large size and become
+fragmented.  As a result, one may wish to clear the freed space and join the
+partially used pages in the database left behind from removed packages or after
+running the garbage collector.  Running @command{sudo guix gc
+--vacuum-database} will lock the database and @code{VACUUM} the store,
+defragmenting the database and purging freed pages, unlocking the database when
+it finishes.
+
 @end table
 
 @node Invoking guix pull
index 65cd4bd..5e775c5 100644 (file)
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012-2013, 2015-2020, 2022 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,6 +28,7 @@
                                 generation-number)
   #:autoload   (guix scripts package) (delete-generations)
   #:autoload   (gnu home) (home-generation-base)
+  #:autoload   (guix store database) (vacuum-database)
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
   #:use-module (srfi srfi-1)
@@ -86,6 +88,10 @@ Invoke the garbage collector.\n"))
   (display (G_ "
       --clear-failures   remove PATHS from the set of cached failures"))
   (newline)
+  (display (G_ "
+      --vacuum-database  repack the sqlite database tracking the store
+                         using less space"))
+  (newline)
   (display (G_ "
   -h, --help             display this help and exit"))
   (display (G_ "
@@ -131,6 +137,11 @@ current one."
                 (lambda args
                   (show-version-and-exit "guix gc")))
 
+        (option '("vacuum-database") #f #f
+                (lambda args
+                  (vacuum-database)
+                  (exit 0)))
+
         (option '(#\C "collect-garbage") #f #t
                 (lambda (opt name arg result)
                   (let ((result (alist-cons 'action 'collect-garbage
index 8d08def..e664015 100644 (file)
@@ -2,6 +2,7 @@
 ;;; Copyright © 2017, 2019 Caleb Ristvedt <caleb.ristvedt@cune.org>
 ;;; Copyright © 2018, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -45,7 +46,8 @@
             sqlite-register
             register-items
             %epoch
-            reset-timestamps))
+            reset-timestamps
+            vacuum-database))
 
 ;;; Code for working with the store database directly.
 
@@ -438,3 +440,8 @@ typically by adding them as temp-roots."
                     (register db item)
                     (report))
                   items)))))
+
+(define (vacuum-database)
+  (let ((db (sqlite-open (store-database-file))))
+    (sqlite-exec db "VACUUM;")
+    (sqlite-close db)))