From aaf9b3bd279c46f05e8b8fd567a7d1013f80540e Mon Sep 17 00:00:00 2001 From: Sasha Melentyev Date: Fri, 28 Jan 2022 21:42:02 +0300 Subject: [PATCH 1/4] feat: add graceful shutdown --- cmd/dummy/main.go | 26 +++++++++++++++++++++++++- internal/server/server.go | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/cmd/dummy/main.go b/cmd/dummy/main.go index affc168..f8a55a0 100644 --- a/cmd/dummy/main.go +++ b/cmd/dummy/main.go @@ -2,9 +2,14 @@ package main import ( "context" + "errors" "flag" "fmt" + "net/http" "os" + "os/signal" + "syscall" + "time" "github.com/cristalhq/acmd" @@ -49,7 +54,26 @@ func run() error { h := server.NewHandlers(api, l) s := server.NewServer(cfg.Server, l, h) - return s.Run() + go func() { + if err := s.Run(); !errors.Is(err, http.ErrServerClosed) { + l.Logger.Err(err).Msg("run server") + } + }() + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) + + select { + case x := <-interrupt: + l.Info().Msgf("received `%v`", x) + } + + const timeout = 5 * time.Second + + ctx, cancelFunc := context.WithTimeout(context.Background(), timeout) + defer cancelFunc() + + return s.Stop(ctx) }, }, } diff --git a/internal/server/server.go b/internal/server/server.go index 0edbae6..2670fad 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -1,6 +1,7 @@ package server import ( + "context" "net/http" "github.com/go-dummy/dummy/internal/config" @@ -47,3 +48,7 @@ func (s *Server) Run() error { return nil } + +func (s *Server) Stop(ctx context.Context) error { + return s.Server.Shutdown(ctx) +} From 6a105e65e653d39ee1b91873432b37971e519dfd Mon Sep 17 00:00:00 2001 From: Sasha Melentyev Date: Fri, 28 Jan 2022 21:42:23 +0300 Subject: [PATCH 2/4] refactor(api): sort import --- internal/api/build_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/api/build_test.go b/internal/api/build_test.go index d140785..c039ed0 100644 --- a/internal/api/build_test.go +++ b/internal/api/build_test.go @@ -2,10 +2,10 @@ package api_test import ( "fmt" - "github.com/go-dummy/openapi" "strconv" "testing" + "github.com/go-dummy/openapi" "github.com/stretchr/testify/require" "github.com/go-dummy/dummy/internal/api" From 90c46cbdbd7b3ed6b83f1890162a446f4c1eb0ea Mon Sep 17 00:00:00 2001 From: Sasha Melentyev Date: Fri, 28 Jan 2022 21:49:36 +0300 Subject: [PATCH 3/4] fix(server): use channel --- cmd/dummy/main.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmd/dummy/main.go b/cmd/dummy/main.go index f8a55a0..f2bc995 100644 --- a/cmd/dummy/main.go +++ b/cmd/dummy/main.go @@ -63,10 +63,8 @@ func run() error { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - select { - case x := <-interrupt: - l.Info().Msgf("received `%v`", x) - } + x := <-interrupt + l.Info().Msgf("received `%v`", x) const timeout = 5 * time.Second From e073aca92391289c9b0807e664d75e5dcd98e8f1 Mon Sep 17 00:00:00 2001 From: Sasha Melentyev Date: Fri, 28 Jan 2022 21:57:08 +0300 Subject: [PATCH 4/4] fix(server): reuse context --- cmd/dummy/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/dummy/main.go b/cmd/dummy/main.go index f2bc995..42ee55b 100644 --- a/cmd/dummy/main.go +++ b/cmd/dummy/main.go @@ -68,7 +68,7 @@ func run() error { const timeout = 5 * time.Second - ctx, cancelFunc := context.WithTimeout(context.Background(), timeout) + ctx, cancelFunc := context.WithTimeout(ctx, timeout) defer cancelFunc() return s.Stop(ctx)