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. // Module represents a module.
type Module struct { type Module struct {
Name string Name string
Active *abool.AtomicBool Active *abool.AtomicBool
inTransition bool
prep func() error prep func() error
start func() error start func() error
starting bool stop func() error
stop func() error
dependencies []string dependencies []string
} }

View file

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

View file

@ -41,7 +41,6 @@ func Start() error {
err = startModules() err = startModules()
if err != nil { if err != nil {
log.Critical(err.Error()) log.Critical(err.Error())
Shutdown()
return err return err
} }
@ -73,7 +72,7 @@ moduleLoop:
switch { switch {
case module.Active.IsSet(): case module.Active.IsSet():
active++ active++
case module.starting: case module.inTransition:
modulesInProgress = true modulesInProgress = true
default: default:
for _, depName := range module.dependencies { for _, depName := range module.dependencies {
@ -104,7 +103,7 @@ moduleLoop:
func startModules() error { func startModules() error {
var modulesStarting sync.WaitGroup var modulesStarting sync.WaitGroup
reports := make(chan error, 0) reports := make(chan error, 10)
for { for {
readyToStart, done, err := checkStartStatus() readyToStart, done, err := checkStartStatus()
if err != nil { if err != nil {
@ -117,15 +116,16 @@ func startModules() error {
for _, module := range readyToStart { for _, module := range readyToStart {
modulesStarting.Add(1) modulesStarting.Add(1)
module.starting = true module.inTransition = true
nextModule := module // workaround go vet alert nextModule := module // workaround go vet alert
go func() { go func() {
startErr := nextModule.start() startErr := nextModule.start()
if startErr != nil { 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 { } else {
log.Debugf("modules: started %s", nextModule.Name) log.Infof("modules: started %s", nextModule.Name)
nextModule.Active.Set() nextModule.Active.Set()
nextModule.inTransition = false
reports <- nil reports <- nil
} }
modulesStarting.Done() 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 { for _, module := range activeModules {
readyToStop = append(readyToStop, module) if !module.inTransition {
readyToStop = append(readyToStop, module)
}
} }
return readyToStop, false return readyToStop, false
@ -63,26 +65,26 @@ func Shutdown() error {
close(shutdownSignal) close(shutdownSignal)
} }
reports := make(chan error, 0) reports := make(chan error, 10)
for { for {
readyToStop, done := checkStopStatus() readyToStop, done := checkStopStatus()
if done { if done {
log.Info("modules: shutdown complete") break
return nil
} }
for _, module := range readyToStop { for _, module := range readyToStop {
module.starting = false module.inTransition = true
nextModule := module // workaround go vet alert nextModule := module // workaround go vet alert
go func() { go func() {
err := nextModule.stop() err := nextModule.stop()
nextModule.Active.UnSet()
if err != nil { if err != nil {
reports <- fmt.Errorf("modules: could not stop module %s: %s", nextModule.Name, err) reports <- fmt.Errorf("modules: could not stop module %s: %s", nextModule.Name, err)
} else { } else {
reports <- nil reports <- nil
} }
nextModule.Active.UnSet()
nextModule.inTransition = false
}() }()
} }
@ -93,4 +95,8 @@ func Shutdown() error {
} }
} }
log.Info("modules: shutdown complete")
log.Shutdown()
return nil
} }