mirror of
https://github.com/safing/portbase
synced 2025-09-01 10:09:50 +00:00
Fix module shutdown and logging integration
This commit is contained in:
parent
45e187f883
commit
d3dcee7075
4 changed files with 26 additions and 20 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ func TestOrdering(t *testing.T) {
|
|||
func resetModules() {
|
||||
for _, module := range modules {
|
||||
module.Active.UnSet()
|
||||
module.starting = false
|
||||
module.inTransition = false
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue