From 22ea5995540a65746981d464b5419973b4699ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 17 Mar 2022 11:03:29 +0100 Subject: [PATCH] Manager: periodically run the SQL `VACUUM` command --- cmd/flamenco-manager/main.go | 2 ++ internal/manager/persistence/db.go | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/cmd/flamenco-manager/main.go b/cmd/flamenco-manager/main.go index 15be6c3e..f3768000 100644 --- a/cmd/flamenco-manager/main.go +++ b/cmd/flamenco-manager/main.go @@ -75,6 +75,8 @@ func main() { // Construct the services. persist := openDB(*configService) + go persist.PeriodicMaintenanceLoop(mainCtx) + flamenco := buildFlamencoAPI(configService, persist) e := buildWebService(flamenco, persist, ssdp) diff --git a/internal/manager/persistence/db.go b/internal/manager/persistence/db.go index 3e76486e..68bc680e 100644 --- a/internal/manager/persistence/db.go +++ b/internal/manager/persistence/db.go @@ -5,6 +5,7 @@ package persistence import ( "context" + "time" "github.com/rs/zerolog/log" "gorm.io/gorm" @@ -13,6 +14,8 @@ import ( "github.com/glebarez/sqlite" ) +const vacuumPeriod = 1 * time.Hour + // DB provides the database interface. type DB struct { gormDB *gorm.DB @@ -57,3 +60,27 @@ func openDBWithConfig(uri string, config *gorm.Config) (*DB, error) { } return &db, nil } + +// PeriodicMaintenanceLoop periodically vacuums the database. +// This function only returns when the context is done. +func (db *DB) PeriodicMaintenanceLoop(ctx context.Context) { + log.Debug().Msg("periodic database maintenance loop starting") + defer log.Debug().Msg("periodic database maintenance loop stopping") + + var waitTime time.Duration + + for { + select { + case <-ctx.Done(): + return + case <-time.After(waitTime): + waitTime = vacuumPeriod + } + + log.Debug().Msg("vacuuming database") + tx := db.gormDB.Exec("vacuum") + if tx.Error != nil { + log.Error().Err(tx.Error).Msg("error vacuuming database") + } + } +}