From d3dcee7075548725d51f6ce9b9c22c227f5c3151 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 27 Sep 2018 15:57:19 +0200 Subject: [PATCH] Fix module shutdown and logging integration --- modules/modules.go | 12 ++++++------ modules/modules_test.go | 2 +- modules/start.go | 12 ++++++------ modules/stop.go | 20 +++++++++++++------- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/modules/modules.go b/modules/modules.go index df9c065..3b29c78 100644 --- a/modules/modules.go +++ b/modules/modules.go @@ -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 } diff --git a/modules/modules_test.go b/modules/modules_test.go index 9665e59..8f3bfbc 100644 --- a/modules/modules_test.go +++ b/modules/modules_test.go @@ -79,7 +79,7 @@ func TestOrdering(t *testing.T) { func resetModules() { for _, module := range modules { module.Active.UnSet() - module.starting = false + module.inTransition = false } } diff --git a/modules/start.go b/modules/start.go index b9b5f8e..798cf70 100644 --- a/modules/start.go +++ b/modules/start.go @@ -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() diff --git a/modules/stop.go b/modules/stop.go index 06b6fad..2696aca 100644 --- a/modules/stop.go +++ b/modules/stop.go @@ -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 }