Assorted bug fixes

This commit is contained in:
Sasha Koshka 2025-12-29 15:57:39 -05:00
parent a58b5932e7
commit 0a4cc1143e
2 changed files with 19 additions and 16 deletions

View File

@ -36,6 +36,7 @@ type environment struct {
ctx context.Context ctx context.Context
done context.CancelCauseFunc done context.CancelCauseFunc
group sync.WaitGroup group sync.WaitGroup
noneLeft chan struct { }
conf MutableConfig conf MutableConfig
cron *cron cron *cron
@ -94,6 +95,8 @@ func (this *environment) Run(name, description string, actors ...Actor) {
this.addToSetsInitial(actors...) this.addToSetsInitial(actors...)
this.addToSetsInitial(this.cron) this.addToSetsInitial(this.cron)
this.noneLeft = make(chan struct { })
if !this.phase10FlagParsing() { os.Exit(2) } if !this.phase10FlagParsing() { os.Exit(2) }
if !this.phase13PidFileCreation() { os.Exit(1) } if !this.phase13PidFileCreation() { os.Exit(1) }
if !this.phase17PrivilegeDropping() { os.Exit(1) } if !this.phase17PrivilegeDropping() { os.Exit(1) }
@ -118,6 +121,17 @@ func (this *environment) Add(ctx context.Context, actors ...Actor) error {
this.delFromSets(actors...) this.delFromSets(actors...)
} }
for _, actor := range actors {
if actor, ok := actor.(Configurable); ok {
err := actor.Configure(this.conf)
if err != nil {
cleanUp()
return fmt.Errorf (
"could not apply configuration to %s: %w",
actor.(Actor).Type(), err)
}
}
}
initializable := make([]Initializable, 0, len(actors)) initializable := make([]Initializable, 0, len(actors))
for _, actor := range actors { for _, actor := range actors {
if actor, ok := actor.(Initializable); ok { if actor, ok := actor.(Initializable); ok {
@ -132,17 +146,6 @@ func (this *environment) Add(ctx context.Context, actors ...Actor) error {
cleanUp() cleanUp()
return err return err
} }
for _, actor := range actors {
if actor, ok := actor.(Configurable); ok {
err := actor.Configure(this.conf)
if err != nil {
cleanUp()
return fmt.Errorf (
"could not apply configuration to %s: %w",
actor.(Actor).Type(), err)
}
}
}
for _, actor := range actors { for _, actor := range actors {
_, isRunnable := actor.(Runnable) _, isRunnable := actor.(Runnable)
_, isRunShutdownable := actor.(RunShutdownable) _, isRunShutdownable := actor.(RunShutdownable)

View File

@ -200,7 +200,7 @@ func (this *environment) phase50ConfigurationApplication() bool {
defer done() defer done()
for _, actor := range sortActors(actors, actors.configurable.all()) { for _, actor := range sortActors(actors, actors.configurable.all()) {
if !actors.info(actor.(Actor)).initial { continue } if !actors.info(actor.(Actor)).initial { continue }
if this.Verb() { log.Println ("... (50) applying configuration to %s", actor.(Actor).Type())} if this.Verb() { log.Printf ("... (50) applying configuration to %s", actor.(Actor).Type())}
err := actor.Configure(this.conf) err := actor.Configure(this.conf)
if err != nil { if err != nil {
log.Printf ( log.Printf (
@ -288,15 +288,14 @@ func (this *environment) phase70RunningBody() bool {
}() }()
log.Println(".// (70) startup sequence complete") log.Println(".// (70) startup sequence complete")
// await context cancellation or waitgroup completion // await context cancellation or waitgroup completion
wgChannel := make(chan struct { }, 1)
go func() { go func() {
this.group.Wait() this.group.Wait()
wgChannel <- struct { } { } close(this.noneLeft)
}() }()
select { select {
case <- this.ctx.Done(): case <- this.ctx.Done():
if this.Verb() { log.Println("(i) (70) canceled") } if this.Verb() { log.Println("(i) (70) canceled") }
case <- wgChannel: case <- this.noneLeft:
if this.Verb() { log.Println("(i) (70) all actors have finished") } if this.Verb() { log.Println("(i) (70) all actors have finished") }
} }
return true return true
@ -358,6 +357,7 @@ func (this *environment) phase80Shutdown() bool {
log.Println(".// (80) shutdown succeeded, goodbye") log.Println(".// (80) shutdown succeeded, goodbye")
log.Printf("====== [%s] END =======", this.name) log.Printf("====== [%s] END =======", this.name)
}() }()
this.group.Wait() // wait for all actors to shut down
<- this.noneLeft
return cause == nil return cause == nil
} }