chore: fix .gitignore

feat(waiter): waiting for signal
This commit is contained in:
Suyono 2023-12-14 00:11:39 +00:00
parent 9c74296c27
commit 8cf92167df
5 changed files with 40 additions and 19 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
/cmd/wingmate/wingmatecmd/pidproxy/pidproxy /cmd/wingmate/wingmate
/cmd/pidproxy/pidproxy

View File

@ -8,7 +8,8 @@ RUN make all
FROM debian:bookworm FROM debian:bookworm
RUN ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime RUN ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime && \
apt update && apt install -y procps
COPY --from=builder /root/wingmate/cmd/wingmate/wingmate /usr/local/bin/wingmate COPY --from=builder /root/wingmate/cmd/wingmate/wingmate /usr/local/bin/wingmate
COPY --from=builder /root/wingmate/cmd/experiment/dummy/dummy /usr/local/bin/wmdummy COPY --from=builder /root/wingmate/cmd/experiment/dummy/dummy /usr/local/bin/wmdummy
COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter

View File

@ -1,6 +1,7 @@
package init package init
import ( import (
"os"
"sync" "sync"
"time" "time"
) )
@ -34,17 +35,19 @@ func (i *Init) Start() {
wg *sync.WaitGroup wg *sync.WaitGroup
signalTrigger chan any signalTrigger chan any
sighandlerExit chan any sighandlerExit chan any
sigchld chan os.Signal
) )
signalTrigger = make(chan any) signalTrigger = make(chan any)
sighandlerExit = make(chan any) sighandlerExit = make(chan any)
sigchld = make(chan os.Signal, 1)
wg = &sync.WaitGroup{} wg = &sync.WaitGroup{}
wg.Add(1) wg.Add(1)
go i.waiter(wg, signalTrigger, sighandlerExit) go i.waiter(wg, signalTrigger, sighandlerExit, sigchld)
wg.Add(1) wg.Add(1)
go i.sighandler(wg, signalTrigger, sighandlerExit) go i.sighandler(wg, signalTrigger, sighandlerExit, sigchld)
for _, s := range i.config.Services() { for _, s := range i.config.Services() {
wg.Add(1) wg.Add(1)

View File

@ -9,7 +9,7 @@ import (
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any) { func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any, sigchld chan<- os.Signal) {
defer wg.Done() defer wg.Done()
defer func() { defer func() {
@ -35,7 +35,10 @@ signal:
isOpen = false isOpen = false
} }
case unix.SIGCHLD: case unix.SIGCHLD:
// do nothing select {
case sigchld <- s:
default:
}
} }
case <-selfExit: case <-selfExit:

View File

@ -2,20 +2,20 @@ package init
import ( import (
"errors" "errors"
"os"
"sync" "sync"
"time"
"gitea.suyono.dev/suyono/wingmate" "gitea.suyono.dev/suyono/wingmate"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag chan<- any) { func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag chan<- any, sigchld <-chan os.Signal) {
var ( var (
ws unix.WaitStatus ws unix.WaitStatus
// pid int
err error err error
running bool running bool
flagged bool flagged bool
waitingForSignal bool
) )
defer wg.Done() defer wg.Done()
@ -25,15 +25,28 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
running = true running = true
flagged = true flagged = true
waitingForSignal = true
wait: wait:
for { for {
if running { if running {
if waitingForSignal {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
case <-sigchld:
waitingForSignal = false
}
} else {
select { select {
case <-runningFlag: case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...") wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false running = false
default: default:
} }
}
} }
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil { if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {
@ -50,7 +63,7 @@ wait:
} }
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err) wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
time.Sleep(time.Millisecond * 100) waitingForSignal = true
} }
} }
} }