From 279752344fb86aec420b3510ffbf29b98fae179b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Mon, 30 Oct 2023 09:22:50 -0400 Subject: [PATCH] chore: print a message periodically indicating that VACUUM is still being executed (#838) --- waku/persistence/postgres/postgres.go | 33 ++++++++++++++++++++++++--- waku/persistence/sqlite/sqlite.go | 33 ++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/waku/persistence/postgres/postgres.go b/waku/persistence/postgres/postgres.go index cfc372fe..565ee8f4 100644 --- a/waku/persistence/postgres/postgres.go +++ b/waku/persistence/postgres/postgres.go @@ -1,8 +1,10 @@ package postgres import ( + "context" "database/sql" "fmt" + "time" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/pgx" @@ -15,10 +17,35 @@ import ( func executeVacuum(db *sql.DB, logger *zap.Logger) error { logger.Info("starting PostgreSQL database vacuuming") - _, err := db.Exec("VACUUM FULL") - if err != nil { - return err + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + errCh := make(chan error) + + go func() { + defer cancel() + _, err := db.Exec("VACUUM FULL") + if err != nil { + errCh <- err + } + }() + + t := time.NewTicker(2 * time.Minute) + defer t.Stop() + +loop: + for { + select { + case <-ctx.Done(): + break loop + case err := <-errCh: + return err + case <-t.C: + logger.Info("still vacuuming...") + } } + logger.Info("finished PostgreSQL database vacuuming") return nil } diff --git a/waku/persistence/sqlite/sqlite.go b/waku/persistence/sqlite/sqlite.go index 75181608..9a718199 100644 --- a/waku/persistence/sqlite/sqlite.go +++ b/waku/persistence/sqlite/sqlite.go @@ -1,9 +1,11 @@ package sqlite import ( + "context" "database/sql" "fmt" "strings" + "time" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/sqlite3" @@ -32,10 +34,35 @@ func addSqliteURLDefaults(dburl string) string { func executeVacuum(db *sql.DB, logger *zap.Logger) error { logger.Info("starting sqlite database vacuuming") - _, err := db.Exec("VACUUM") - if err != nil { - return err + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + errCh := make(chan error) + + go func() { + defer cancel() + _, err := db.Exec("VACUUM") + if err != nil { + errCh <- err + } + }() + + t := time.NewTicker(2 * time.Minute) + defer t.Stop() + +loop: + for { + select { + case <-ctx.Done(): + break loop + case err := <-errCh: + return err + case <-t.C: + logger.Info("still vacuuming...") + } } + logger.Info("finished sqlite database vacuuming") return nil }