Manager: periodically run the SQL VACUUM command

This commit is contained in:
Sybren A. Stüvel 2022-03-17 11:03:29 +01:00
parent e7a5e0565d
commit 22ea599554
2 changed files with 29 additions and 0 deletions

@ -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)

@ -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")
}
}
}