cloudflare / cloudflare/tableflip

Can't catch syscall.SIGINT after upgrade

Open
#76 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
3.2k
Forks
158
PR merge metrics
No merged PRs in 30d

Description

I can catch syscall.SIGINT when I call upgrade(), but I can't catch syscall.SIGINT when upgrade() is called. What if I restart and shut down gracefully?

func main() {
upg, _ := tableflip.New(tableflip.Options{})
defer upg.Stop()

go func() {
sig := make(chan os.Signal, 1)
//
signal.Notify(sig, syscall.SIGHUP, os.Interrupt, syscall.SIGTERM)
for ch := range sig {
switch ch {
case syscall.SIGHUP:
err := upg.Upgrade()
if err != nil {
log.Fatal(err)
}
default:
upg.Interrupt()
}
}
}()

ln, err := upg.Listen("tcp", ":8080")
if err != nil {
log.Fatalln("Can't listen:", err)
}
defer func(ln net.Listener) {
_ = ln.Close()
}(ln)

count := 0
router := gin.Default()
router.GET("/", func(c *gin.Context) {
time.Sleep(5 * time.Second)
count++
c.String(http.StatusOK, strconv.Itoa(count))
})

server := http.Server{
Handler: router,
}
go func() {
if err := server.Serve(ln); err != http.ErrServerClosed {
log.Fatal("listen: ", err)
}
}()

// Listen must be called before Ready

if err := upg.Ready(); err != nil {
log.Fatal(err)
}

<-upg.Exit()

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Fatal("Server forced to shutdown:", err)
}
println("going to shutdown")
}

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.