refactor: maintain persistent database connections in instance status and correct wait order for backup processes
Build and Push / build (godump, amd64, linux) (push) Successful in 29s

This commit is contained in:
2026-06-25 19:28:04 +01:00
parent 9a417155fc
commit e1d260e3ac
3 changed files with 24 additions and 13 deletions
+3 -6
View File
@@ -9,13 +9,10 @@ import (
_ "github.com/go-sql-driver/mysql"
)
func discoverDatabases(cfg config.InstanceConfig) ([]string, error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/?parseTime=true", cfg.User, cfg.Password, cfg.Host, cfg.Port)
db, err := sql.Open("mysql", dsn)
if err != nil {
return nil, err
func discoverDatabases(db *sql.DB, cfg config.InstanceConfig) ([]string, error) {
if db == nil {
return nil, fmt.Errorf("database pool is not initialized")
}
defer db.Close()
// Ensure the connection is actually valid
if err := db.Ping(); err != nil {
+14 -2
View File
@@ -1,12 +1,16 @@
package backup
import (
"database/sql"
"fmt"
"os"
"path/filepath"
"sort"
"sync"
"time"
_ "github.com/go-sql-driver/mysql"
"godump/config"
"godump/logger"
"godump/notify"
@@ -23,6 +27,7 @@ type DBStatus struct {
type InstanceStatus struct {
Config config.InstanceConfig
DB *sql.DB
LastRunTime time.Time
NextRunTime time.Time
OverallResult string // success, partial, failed, running
@@ -97,8 +102,15 @@ func NewManager(cfg *config.Config) *Manager {
}
for _, instCfg := range cfg.Instances {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/?parseTime=true", instCfg.User, instCfg.Password, instCfg.Host, instCfg.Port)
db, err := sql.Open("mysql", dsn)
if err != nil {
logger.Error(instCfg.Name, "Failed to initialize database pool: %v", err)
}
status := &InstanceStatus{
Config: instCfg,
DB: db,
Databases: make(map[string]*DBStatus),
}
m.instances[instCfg.Name] = status
@@ -148,7 +160,7 @@ func (m *Manager) DiscoverInitial() {
m.mu.RLock()
defer m.mu.RUnlock()
for name, inst := range m.instances {
dbs, err := discoverDatabases(inst.Config)
dbs, err := discoverDatabases(inst.DB, inst.Config)
if err != nil {
logger.Error(name, "Initial database discovery failed: %v", err)
inst.mu.Lock()
@@ -246,7 +258,7 @@ func (m *Manager) RunInstance(name string) {
logger.Info(name, "Starting backup job")
// 1. Discovery
dbs, err := discoverDatabases(inst.Config)
dbs, err := discoverDatabases(inst.DB, inst.Config)
if err != nil {
logger.Error(name, "Database discovery failed: %v", err)
inst.mu.Lock()
+7 -5
View File
@@ -67,13 +67,15 @@ func backupDatabase(cfg config.InstanceConfig, dbName string) (int64, error) {
return 0, fmt.Errorf("failed to start gzip: %w", err)
}
if err := cmdDump.Wait(); err != nil {
cmdGzip.Process.Kill()
return 0, fmt.Errorf("mysqldump failed: %w", err)
errGzip := cmdGzip.Wait()
errDump := cmdDump.Wait()
if errDump != nil {
return 0, fmt.Errorf("mysqldump failed: %w", errDump)
}
if err := cmdGzip.Wait(); err != nil {
return 0, fmt.Errorf("gzip failed: %w", err)
if errGzip != nil {
return 0, fmt.Errorf("gzip failed: %w", errGzip)
}
// Get file size