fix: mismatch WaitGroup
This commit is contained in:
@@ -25,6 +25,10 @@ func (i *Init) service(wg *sync.WaitGroup, path Path, exitFlag <-chan any) {
|
||||
failStatus bool
|
||||
)
|
||||
|
||||
defer func() {
|
||||
wingmate.Log().Info().Str(serviceTag, path.Path()).Msg("stopped")
|
||||
}()
|
||||
|
||||
failStatus = false
|
||||
service:
|
||||
for {
|
||||
@@ -57,7 +61,7 @@ service:
|
||||
iwg.Wait()
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("got error when waiting: %#v", err)
|
||||
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("got error when waiting: %+v", err)
|
||||
}
|
||||
fail:
|
||||
if failStatus {
|
||||
@@ -84,4 +88,6 @@ func (i *Init) pipeReader(wg *sync.WaitGroup, pipe io.ReadCloser, serviceName st
|
||||
if err := scanner.Err(); err != nil {
|
||||
wingmate.Log().Error().Str(serviceTag, serviceName).Msgf("got error when reading pipe: %#v", err)
|
||||
}
|
||||
|
||||
wingmate.Log().Info().Str(serviceTag, serviceName).Msg("closing pipe")
|
||||
}
|
||||
|
||||
@@ -5,11 +5,16 @@ import (
|
||||
"os/signal"
|
||||
"sync"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any) {
|
||||
defer wg.Wait()
|
||||
defer wg.Done()
|
||||
|
||||
defer func() {
|
||||
wingmate.Log().Warn().Msg("signal handler: exiting")
|
||||
}()
|
||||
|
||||
isOpen := true
|
||||
|
||||
@@ -23,6 +28,7 @@ signal:
|
||||
switch s {
|
||||
case unix.SIGTERM, unix.SIGINT:
|
||||
if isOpen {
|
||||
wingmate.Log().Info().Msg("initiating shutdown...")
|
||||
close(trigger)
|
||||
wg.Add(1)
|
||||
go i.signalPump(wg, selfExit)
|
||||
@@ -33,6 +39,7 @@ signal:
|
||||
}
|
||||
|
||||
case <-selfExit:
|
||||
wingmate.Log().Warn().Msg("signal handler received completion flag")
|
||||
break signal
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -15,6 +16,11 @@ const (
|
||||
)
|
||||
|
||||
func (i *Init) signalPump(wg *sync.WaitGroup, selfExit <-chan any) {
|
||||
defer wg.Done()
|
||||
defer func() {
|
||||
wingmate.Log().Info().Msg("signal pump completed")
|
||||
}()
|
||||
|
||||
if seStatus := i.sigTermPump(time.Now(), selfExit); seStatus == triggered {
|
||||
return
|
||||
}
|
||||
@@ -26,6 +32,11 @@ func (i *Init) sigKillPump(startTime time.Time, selfExit <-chan any) {
|
||||
t := time.NewTicker(time.Millisecond * 200)
|
||||
defer t.Stop()
|
||||
|
||||
wingmate.Log().Info().Msg("start pumping SIGKILL signal")
|
||||
defer func() {
|
||||
wingmate.Log().Info().Msg("stop pumping SIGKILL signal")
|
||||
}()
|
||||
|
||||
for time.Since(startTime) < time.Second {
|
||||
_ = unix.Kill(-1, unix.SIGKILL)
|
||||
|
||||
@@ -41,6 +52,11 @@ func (i *Init) sigTermPump(startTime time.Time, selfExit <-chan any) status {
|
||||
t := time.NewTicker(time.Millisecond * 100)
|
||||
defer t.Stop()
|
||||
|
||||
wingmate.Log().Info().Msg("start pumping SIGTERM signal")
|
||||
defer func() {
|
||||
wingmate.Log().Info().Msg("stop pumping SIGTERM signal")
|
||||
}()
|
||||
|
||||
for time.Since(startTime) < time.Duration(time.Second*4) {
|
||||
_ = unix.Kill(-1, unix.SIGTERM)
|
||||
|
||||
|
||||
@@ -3,7 +3,9 @@ package init
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -13,13 +15,21 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
|
||||
// pid int
|
||||
err error
|
||||
running bool
|
||||
flagged bool
|
||||
)
|
||||
defer wg.Done()
|
||||
|
||||
defer func() {
|
||||
wingmate.Log().Info().Msg("waiter exiting...")
|
||||
}()
|
||||
|
||||
running = true
|
||||
flagged = true
|
||||
wait:
|
||||
for {
|
||||
select {
|
||||
case <-runningFlag:
|
||||
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||
running = false
|
||||
default:
|
||||
}
|
||||
@@ -27,10 +37,18 @@ wait:
|
||||
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {
|
||||
if errors.Is(err, unix.ECHILD) {
|
||||
if !running {
|
||||
close(sigHandlerFlag)
|
||||
if flagged {
|
||||
close(sigHandlerFlag)
|
||||
flagged = false
|
||||
wingmate.Log().Warn().Msg("waiter: inner flag")
|
||||
}
|
||||
wingmate.Log().Warn().Msg("waiter: no child left")
|
||||
break wait
|
||||
}
|
||||
}
|
||||
|
||||
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user