diff --git a/backup/discover.go b/backup/discover.go index 794528f..62701f4 100644 --- a/backup/discover.go +++ b/backup/discover.go @@ -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 { diff --git a/backup/manager.go b/backup/manager.go index c00ed5e..0d52cbf 100644 --- a/backup/manager.go +++ b/backup/manager.go @@ -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() diff --git a/backup/mysql.go b/backup/mysql.go index 2490a5e..ee212ea 100644 --- a/backup/mysql.go +++ b/backup/mysql.go @@ -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