diff mbox series

[bug#58624] guix gc: Add '--vacuum-store'.

Message ID 56516d4a8143b96ef80d6dfd18f147568f23b73e.1666171506.git.efraim@flashner.co.il
State New
Headers show
Series [bug#58624] guix gc: Add '--vacuum-store'. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git-branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Efraim Flashner Oct. 19, 2022, 9:26 a.m. UTC
* guix/scripts/gc.scm (show-help, %options): Add '--vacuum-store'.
* guix/store/database.scm (vacuum-database): New procedure.
* doc/guix.texi (Invoking guix gc): Document the option.
---
 doc/guix.texi           | 11 +++++++++++
 guix/scripts/gc.scm     | 11 +++++++++++
 guix/store/database.scm |  9 ++++++++-
 3 files changed, 30 insertions(+), 1 deletion(-)


base-commit: 3bb145b6e2a8c84e7739ead9ae76dc4d42bb9850

Comments

Liliana Marie Prikler Oct. 20, 2022, 6:51 p.m. UTC | #1
Am Mittwoch, dem 19.10.2022 um 12:26 +0300 schrieb Efraim Flashner:
> * guix/scripts/gc.scm (show-help, %options): Add '--vacuum-store'.
> * guix/store/database.scm (vacuum-database): New procedure.
> * doc/guix.texi (Invoking guix gc): Document the option.
> ---
>  doc/guix.texi           | 11 +++++++++++
>  guix/scripts/gc.scm     | 11 +++++++++++
>  guix/store/database.scm |  9 ++++++++-
>  3 files changed, 30 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 3bf2dee752..89fd04415a 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -4531,6 +4531,17 @@ Invoking guix gc
>  this option is primarily useful when the daemon was running with
>  @option{--disable-deduplication}.
>  
> +@item --vacuum-store
> +@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}).
> +Overtime 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-store}
> +will lock the database and @code{VACUUM} the store, defragmenting
> the database
> +and purging freed pages, unlocking the database when it finishes..
You're using vacuum-store here...

>  @end table
>  
>  @node Invoking guix pull
> diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
> index 65cd4bdf8b..5e775c5cdb 100644
> --- a/guix/scripts/gc.scm
> +++ b/guix/scripts/gc.scm
> @@ -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 @@ (define-module (guix scripts gc)
>                                  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 @@ (define (show-help)
>    (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 @@ (define %options
>                  (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
> diff --git a/guix/store/database.scm b/guix/store/database.scm
> index 8d08def833..e664015673 100644
> --- a/guix/store/database.scm
> +++ b/guix/store/database.scm
> @@ -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 @@ (define-module (guix store database)
>              sqlite-register
>              register-items
>              %epoch
> -            reset-timestamps))
> +            reset-timestamps
> +            vacuum-database))
>  
>  ;;; Code for working with the store database directly.
>  
> @@ -438,3 +440,8 @@ (define* (register-items db items
>                      (register db item)
>                      (report))
>                    items)))))
> +
> +(define (vacuum-database)
> +  (let ((db (sqlite-open (store-database-file))))
> +    (sqlite-exec db "VACUUM;")
> +    (sqlite-close db)))
... but vacuum-database here.

Since the database is just a part of the store, I think making it
"vacuum-database" everywhere ought to make it both more consistent and
more correct.

Cheers
Efraim Flashner Oct. 20, 2022, 7:22 p.m. UTC | #2
On Thu, Oct 20, 2022 at 08:51:04PM +0200, Liliana Marie Prikler wrote:
> Am Mittwoch, dem 19.10.2022 um 12:26 +0300 schrieb Efraim Flashner:
> > * guix/scripts/gc.scm (show-help, %options): Add '--vacuum-store'.
> > * guix/store/database.scm (vacuum-database): New procedure.
> > * doc/guix.texi (Invoking guix gc): Document the option.
> > ---
> >  doc/guix.texi           | 11 +++++++++++
> >  guix/scripts/gc.scm     | 11 +++++++++++
> >  guix/store/database.scm |  9 ++++++++-
> >  3 files changed, 30 insertions(+), 1 deletion(-)
> > 
> > diff --git a/doc/guix.texi b/doc/guix.texi
> > index 3bf2dee752..89fd04415a 100644
> > --- a/doc/guix.texi
> > +++ b/doc/guix.texi
> > @@ -4531,6 +4531,17 @@ Invoking guix gc
> >  this option is primarily useful when the daemon was running with
> >  @option{--disable-deduplication}.
> >  
> > +@item --vacuum-store
> > +@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}).
> > +Overtime 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-store}
> > +will lock the database and @code{VACUUM} the store, defragmenting
> > the database
> > +and purging freed pages, unlocking the database when it finishes..
> You're using vacuum-store here...
> 
> >  @end table
> >  
> >  @node Invoking guix pull
> > diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
> > index 65cd4bdf8b..5e775c5cdb 100644
> > --- a/guix/scripts/gc.scm
> > +++ b/guix/scripts/gc.scm
> > @@ -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 @@ (define-module (guix scripts gc)
> >                                  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 @@ (define (show-help)
> >    (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 @@ (define %options
> >                  (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
> > diff --git a/guix/store/database.scm b/guix/store/database.scm
> > index 8d08def833..e664015673 100644
> > --- a/guix/store/database.scm
> > +++ b/guix/store/database.scm
> > @@ -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 @@ (define-module (guix store database)
> >              sqlite-register
> >              register-items
> >              %epoch
> > -            reset-timestamps))
> > +            reset-timestamps
> > +            vacuum-database))
> >  
> >  ;;; Code for working with the store database directly.
> >  
> > @@ -438,3 +440,8 @@ (define* (register-items db items
> >                      (register db item)
> >                      (report))
> >                    items)))))
> > +
> > +(define (vacuum-database)
> > +  (let ((db (sqlite-open (store-database-file))))
> > +    (sqlite-exec db "VACUUM;")
> > +    (sqlite-close db)))
> ... but vacuum-database here.
> 
> Since the database is just a part of the store, I think making it
> "vacuum-database" everywhere ought to make it both more consistent and
> more correct.

Agreed. I even made sure it was --vacuum-database in the help menu from
'guix gc --help'. Truth is I wrote the code and then the next day I
wrote the documentation, so figures I would document it wrong ...
diff mbox series

Patch

diff --git a/doc/guix.texi b/doc/guix.texi
index 3bf2dee752..89fd04415a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4531,6 +4531,17 @@  Invoking guix gc
 this option is primarily useful when the daemon was running with
 @option{--disable-deduplication}.
 
+@item --vacuum-store
+@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}).
+Overtime 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-store}
+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
diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
index 65cd4bdf8b..5e775c5cdb 100644
--- a/guix/scripts/gc.scm
+++ b/guix/scripts/gc.scm
@@ -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 @@  (define-module (guix scripts gc)
                                 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 @@  (define (show-help)
   (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 @@  (define %options
                 (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
diff --git a/guix/store/database.scm b/guix/store/database.scm
index 8d08def833..e664015673 100644
--- a/guix/store/database.scm
+++ b/guix/store/database.scm
@@ -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 @@  (define-module (guix store database)
             sqlite-register
             register-items
             %epoch
-            reset-timestamps))
+            reset-timestamps
+            vacuum-database))
 
 ;;; Code for working with the store database directly.
 
@@ -438,3 +440,8 @@  (define* (register-items db items
                     (register db item)
                     (report))
                   items)))))
+
+(define (vacuum-database)
+  (let ((db (sqlite-open (store-database-file))))
+    (sqlite-exec db "VACUUM;")
+    (sqlite-close db)))