diff --git a/cmd/dbmigrate/main.go b/cmd/dbmigrate/main.go index 496daadd..25b240bd 100644 --- a/cmd/dbmigrate/main.go +++ b/cmd/dbmigrate/main.go @@ -30,13 +30,13 @@ func openDbConnection(driver string) (err error) { if driver == database.DBPostgreSQL { dbConn, err = dbPSQL.Connect() if err != nil { - return fmt.Errorf("database failed to connect: %v Some features that utilise a database will be unavailable", err) + return fmt.Errorf("database failed to connect: %v, some features that utilise a database will be unavailable", err) } return nil } else if driver == database.DBSQLite || driver == database.DBSQLite3 { dbConn, err = dbsqlite3.Connect() if err != nil { - return fmt.Errorf("database failed to connect: %v Some features that utilise a database will be unavailable", err) + return fmt.Errorf("database failed to connect: %v, some features that utilise a database will be unavailable", err) } return nil } diff --git a/engine/database.go b/engine/database.go index c6811f0b..ca3eecaf 100644 --- a/engine/database.go +++ b/engine/database.go @@ -18,19 +18,26 @@ var ( ) type databaseManager struct { - running atomic.Value + started int32 + stopped int32 shutdown chan struct{} } func (a *databaseManager) Started() bool { - return a.running.Load() == true + return atomic.LoadInt32(&a.started) == 1 } func (a *databaseManager) Start() (err error) { - if a.Started() { + if atomic.AddInt32(&a.started, 1) != 1 { return errors.New("database manager already started") } + defer func() { + if err != nil { + atomic.CompareAndSwapInt32(&a.started, 1, 0) + } + }() + log.Debugln(log.DatabaseMgr, "Database manager starting...") a.shutdown = make(chan struct{}) @@ -70,11 +77,13 @@ func (a *databaseManager) Start() (err error) { } func (a *databaseManager) Stop() error { - if !a.Started() { - return errors.New("database manager already stopped") + if atomic.LoadInt32(&a.started) == 0 { + return errors.New("database manager not started") } - log.Debugln(log.DatabaseMgr, "Database manager shutting down...") + if atomic.AddInt32(&a.stopped, 1) != 1 { + return errors.New("database manager is already stopping") + } err := dbConn.SQL.Close() if err != nil { @@ -91,11 +100,10 @@ func (a *databaseManager) run() { t := time.NewTicker(time.Second * 2) - a.running.Store(true) - defer func() { t.Stop() - a.running.Store(false) + atomic.CompareAndSwapInt32(&a.stopped, 1, 0) + atomic.CompareAndSwapInt32(&a.started, 1, 0) Bot.ServicesWG.Done()