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
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/experiment/dummy/dummy /usr/local/bin/wmdummy
COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter

View File

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

View File

@ -9,7 +9,7 @@ import (
"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 func() {
@ -35,7 +35,10 @@ signal:
isOpen = false
}
case unix.SIGCHLD:
// do nothing
select {
case sigchld <- s:
default:
}
}
case <-selfExit:

View File

@ -2,20 +2,20 @@ package init
import (
"errors"
"os"
"sync"
"time"
"gitea.suyono.dev/suyono/wingmate"
"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 (
ws unix.WaitStatus
// pid int
err error
running bool
flagged bool
ws unix.WaitStatus
err error
running bool
flagged bool
waitingForSignal bool
)
defer wg.Done()
@ -25,14 +25,27 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
running = true
flagged = true
waitingForSignal = true
wait:
for {
if running {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
default:
if waitingForSignal {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
case <-sigchld:
waitingForSignal = false
}
} else {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
default:
}
}
}
@ -50,7 +63,7 @@ wait:
}
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
time.Sleep(time.Millisecond * 100)
waitingForSignal = true
}
}
}