Use atomic.LoadInt32/AddInt32 for database subsystem (#412)

This commit is contained in:
Adrian Gallagher
2020-01-14 10:27:26 +11:00
committed by GitHub
parent 12159e36fa
commit 26b8e95eb0
2 changed files with 19 additions and 11 deletions

View File

@@ -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
}

View File

@@ -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()