mirror of
https://github.com/safing/portbase
synced 2025-09-04 19:50:18 +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.
|
// 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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue