Feature: Add option to disable auto-VACUUMing of the SQLite database (#661)

This commit is contained in:
Ralph Slooten
2026-03-29 17:29:02 +13:00
parent dc9b8d54b7
commit 3a4c7766e9
3 changed files with 16 additions and 1 deletions

View File

@@ -86,6 +86,7 @@ func init() {
rootCmd.Flags().StringVarP(&config.Database, "database", "d", config.Database, "Database to store persistent data")
rootCmd.Flags().BoolVar(&config.DisableWAL, "disable-wal", config.DisableWAL, "Disable WAL for local database (allows NFS mounted DBs)")
rootCmd.Flags().BoolVar(&config.DisableVersionCheck, "disable-version-check", config.DisableVersionCheck, "Disable version update checking")
rootCmd.Flags().BoolVar(&config.DisableAutoVACUUM, "disable-auto-vacuum", config.DisableAutoVACUUM, "Disable auto-VACUUM for the database")
rootCmd.Flags().IntVar(&config.Compression, "compression", config.Compression, "Compression level to store raw messages (0-3)")
rootCmd.Flags().StringVar(&config.Label, "label", config.Label, "Optional label identify this Mailpit instance")
rootCmd.Flags().StringVar(&config.TenantID, "tenant-id", config.TenantID, "Database tenant ID to isolate data")
@@ -202,6 +203,8 @@ func initConfigFromEnv() {
config.DisableVersionCheck = getEnabledFromEnv("MP_DISABLE_VERSION_CHECK")
config.DisableAutoVACUUM = getEnabledFromEnv("MP_DISABLE_AUTO_VACUUM")
if len(os.Getenv("MP_COMPRESSION")) > 0 {
config.Compression, _ = strconv.Atoi(os.Getenv("MP_COMPRESSION"))
}

View File

@@ -46,6 +46,10 @@ var (
// @see https://sqlite.org/wal.html
DisableWAL bool
// DisableAutoVACUUM will disable the auto-VACUUM of the local SQLite database when messages
// are deleted and a preconfigured threshold is reached.
DisableAutoVACUUM bool
// Compression is the compression level used to store raw messages in the database:
// 0 = off, 1 = fastest (default), 2 = standard, 3 = best compression
Compression = 1

View File

@@ -16,6 +16,14 @@ import (
// Database cron runs every minute
func dbCron() {
if config.DisableAutoVACUUM {
if sqlDriver == "rqlite" {
logger.Log().Warn("[db] disable-auto-vacuum has no effect as rqlite handles vacuuming automatically")
} else {
logger.Log().Infof("[db] auto-VACUUM is disabled")
}
}
for {
time.Sleep(60 * time.Second)
@@ -35,7 +43,7 @@ func dbCron() {
deletedPercent = float64(deletedSize * 100 / total)
}
// only vacuum the DB if at least 1% of mail storage size has been deleted
if deletedPercent >= 1 {
if !config.DisableAutoVACUUM && deletedPercent >= 1 {
logger.Log().Debugf("[db] deleted messages is %f%% of total size, reclaim space", deletedPercent)
vacuumDb()
}