Fix module shutdown and logging integration

This commit is contained in:
Daniel 2018-09-27 15:57:19 +02:00
parent 45e187f883
commit d3dcee7075
4 changed files with 26 additions and 20 deletions

View file

@ -22,13 +22,13 @@ var (
// Module represents a module.
type Module struct {
Name string
Active *abool.AtomicBool
Name string
Active *abool.AtomicBool
inTransition bool
prep func() error
start func() error
starting bool
stop func() error
prep func() error
start func() error
stop func() error
dependencies []string
}

View file

@ -79,7 +79,7 @@ func TestOrdering(t *testing.T) {
func resetModules() {
for _, module := range modules {
module.Active.UnSet()
module.starting = false
module.inTransition = false
}
}

View file

@ -41,7 +41,6 @@ func Start() error {
err = startModules()
if err != nil {
log.Critical(err.Error())
Shutdown()
return err
}
@ -73,7 +72,7 @@ moduleLoop:
switch {
case module.Active.IsSet():
active++
case module.starting:
case module.inTransition:
modulesInProgress = true
default:
for _, depName := range module.dependencies {
@ -104,7 +103,7 @@ moduleLoop:
func startModules() error {
var modulesStarting sync.WaitGroup
reports := make(chan error, 0)
reports := make(chan error, 10)
for {
readyToStart, done, err := checkStartStatus()
if err != nil {
@ -117,15 +116,16 @@ func startModules() error {
for _, module := range readyToStart {
modulesStarting.Add(1)
module.starting = true
module.inTransition = true
nextModule := module // workaround go vet alert
go func() {
startErr := nextModule.start()
if startErr != nil {
reports <- fmt.Errorf("modules: could not start module %s: %s", nextModule.Name, err)
reports <- fmt.Errorf("modules: could not start module %s: %s", nextModule.Name, startErr)
} else {
log.Debugf("modules: started %s", nextModule.Name)
log.Infof("modules: started %s", nextModule.Name)
nextModule.Active.Set()
nextModule.inTransition = false
reports <- nil
}
modulesStarting.Done()

View file

@ -40,9 +40,11 @@ func checkStopStatus() (readyToStop []*Module, done bool) {
}
}
// make list out of map
// make list out of map, minus modules in transition
for _, module := range activeModules {
readyToStop = append(readyToStop, module)
if !module.inTransition {
readyToStop = append(readyToStop, module)
}
}
return readyToStop, false
@ -63,26 +65,26 @@ func Shutdown() error {
close(shutdownSignal)
}
reports := make(chan error, 0)
reports := make(chan error, 10)
for {
readyToStop, done := checkStopStatus()
if done {
log.Info("modules: shutdown complete")
return nil
break
}
for _, module := range readyToStop {
module.starting = false
module.inTransition = true
nextModule := module // workaround go vet alert
go func() {
err := nextModule.stop()
nextModule.Active.UnSet()
if err != nil {
reports <- fmt.Errorf("modules: could not stop module %s: %s", nextModule.Name, err)
} else {
reports <- nil
}
nextModule.Active.UnSet()
nextModule.inTransition = false
}()
}
@ -93,4 +95,8 @@ func Shutdown() error {
}
}
log.Info("modules: shutdown complete")
log.Shutdown()
return nil
}