mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2026-03-14 20:17:28 +01:00
Add flag to optimize db. Remove ANALYZE on startup.
Entire-Checkpoint: d49917ff4b10
This commit is contained in:
@@ -11,7 +11,7 @@ import "flag"
|
||||
|
||||
var (
|
||||
flagReinitDB, flagInit, flagServer, flagSyncLDAP, flagGops, flagMigrateDB, flagRevertDB,
|
||||
flagForceDB, flagDev, flagVersion, flagLogDateTime, flagApplyTags bool
|
||||
flagForceDB, flagDev, flagVersion, flagLogDateTime, flagApplyTags, flagOptimizeDB bool
|
||||
flagNewUser, flagDelUser, flagGenJWT, flagConfigFile, flagImportJob, flagLogLevel string
|
||||
)
|
||||
|
||||
@@ -27,6 +27,7 @@ func cliInit() {
|
||||
flag.BoolVar(&flagRevertDB, "revert-db", false, "Migrate database to previous version and exit")
|
||||
flag.BoolVar(&flagApplyTags, "apply-tags", false, "Run taggers on all completed jobs and exit")
|
||||
flag.BoolVar(&flagForceDB, "force-db", false, "Force database version, clear dirty flag and exit")
|
||||
flag.BoolVar(&flagOptimizeDB, "optimize-db", false, "Optimize database: run VACUUM to reclaim space, then ANALYZE to update query planner statistics")
|
||||
flag.BoolVar(&flagLogDateTime, "logdate", false, "Set this flag to add date and time to log messages")
|
||||
flag.StringVar(&flagConfigFile, "config", "./config.json", "Specify alternative path to `config.json`")
|
||||
flag.StringVar(&flagNewUser, "add-user", "", "Add a new user. Argument format: <username>:[admin,support,manager,api,user]:<password>")
|
||||
|
||||
@@ -509,6 +509,20 @@ func run() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Optimize database if requested
|
||||
if flagOptimizeDB {
|
||||
db := repository.GetConnection()
|
||||
cclog.Print("Running VACUUM to reclaim space and defragment database...")
|
||||
if _, err := db.DB.Exec("VACUUM"); err != nil {
|
||||
return fmt.Errorf("VACUUM failed: %w", err)
|
||||
}
|
||||
cclog.Print("Running ANALYZE to update query planner statistics...")
|
||||
if _, err := db.DB.Exec("ANALYZE"); err != nil {
|
||||
return fmt.Errorf("ANALYZE failed: %w", err)
|
||||
}
|
||||
cclog.Exitf("OptimizeDB Success: Database '%s' optimized (VACUUM + ANALYZE).\n", config.Keys.DB)
|
||||
}
|
||||
|
||||
// Handle user commands (add, delete, sync, JWT)
|
||||
if err := handleUserCommands(); err != nil {
|
||||
return err
|
||||
|
||||
@@ -49,14 +49,6 @@ func setupSqlite(db *sql.DB, cfg *RepositoryConfig) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Update query planner statistics so SQLite picks optimal indexes.
|
||||
// Without this, SQLite guesses row distributions and often chooses wrong
|
||||
// indexes for queries with IN clauses + ORDER BY, causing full table sorts
|
||||
// in temp B-trees instead of using covering indexes.
|
||||
if _, err := db.Exec("ANALYZE"); err != nil {
|
||||
cclog.Warnf("Failed to run ANALYZE: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user