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