Skip to content

Commit 2c5f399

Browse files
committed
Refactor graceful server shutdown
1 parent 9f65623 commit 2c5f399

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

cmd/erised/main.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package main
22

33
import (
4+
"errors"
45
"flag"
56
"fmt"
67
"net/http"
78
"os"
9+
"os/signal"
810
"strconv"
911
"strings"
12+
"syscall"
1013
"time"
1114

1215
"github.com/rs/zerolog"
@@ -110,17 +113,30 @@ func main() {
110113

111114
srv := newServer(*pt, *rt, *wt, *it, *ph)
112115

113-
if err := srv.cfg.ListenAndServe(); err != nil {
114-
switch err {
115-
case http.ErrServerClosed:
116+
go func() {
117+
sigChan := make(chan os.Signal, 1)
118+
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
119+
<-sigChan
120+
121+
if err := srv.cfg.Close(); err != nil {
122+
log.Fatal().Msg("HTTP close error: " + err.Error())
123+
}
124+
}()
125+
126+
if err := srv.cfg.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
127+
switch {
128+
case errors.Is(err, http.ErrServerClosed):
116129
log.Warn().Msg(err.Error())
117-
case http.ErrBodyReadAfterClose, http.ErrHandlerTimeout, http.ErrLineTooLong:
130+
case errors.Is(err, http.ErrBodyReadAfterClose), errors.Is(err, http.ErrHandlerTimeout), errors.Is(err, http.ErrLineTooLong):
118131
log.Error().Msg(err.Error())
119132
default:
120133
log.Fatal().Msg(err.Error())
121134
}
122135
}
123136

124-
defer log.Log().Msg("erised server shutting down")
137+
defer func() {
138+
log.Log().Msg("erised server shutting down")
139+
}()
140+
125141
log.Debug().Msg("leaving main")
126142
}

cmd/erised/serverRoutes.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,17 @@ func (s *server) handleShutdown() http.HandlerFunc {
205205

206206
s.respond(res, encodingJSON, 0, "{\"shutdown\":\"ok\"}")
207207

208-
if err := s.cfg.Shutdown(context.Background()); err != nil {
208+
shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 1*time.Millisecond)
209+
210+
if err := s.cfg.Shutdown(shutdownCtx); !errors.Is(err, context.DeadlineExceeded) {
209211
log.Error().Msg(err.Error())
210212
}
211213

214+
defer func() {
215+
log.Info().Msg("Initiating server shutdown")
216+
shutdownRelease()
217+
}()
218+
212219
log.Debug().Msg("leaving handleShutdown")
213220
}
214221
}

0 commit comments

Comments
 (0)