Skip to content

Commit 8cfaa49

Browse files
author
Kelsey
authored
fix: panic on server shutdown from closing closed channel (#263)
1 parent d8d58fa commit 8cfaa49

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

server/server.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http/httptest"
77
"os"
88
"os/signal"
9+
"sync"
910
"syscall"
1011
"time"
1112

@@ -23,10 +24,11 @@ const (
2324
// Server handles the setup and shutdown of the http server
2425
// for an API
2526
type Server struct {
26-
log logrus.FieldLogger
27-
svr *http.Server
28-
api APIDefinition
29-
done chan (bool)
27+
log logrus.FieldLogger
28+
svr *http.Server
29+
api APIDefinition
30+
done chan (bool)
31+
doneOnce sync.Once
3032
}
3133

3234
type Config struct {
@@ -88,7 +90,11 @@ func New(log logrus.FieldLogger, config Config, api APIDefinition) (*Server, err
8890
func (s *Server) Shutdown(to time.Duration) error {
8991
ctx, cancel := context.WithTimeout(context.Background(), to)
9092
defer cancel()
91-
defer close(s.done)
93+
defer func() {
94+
s.doneOnce.Do(func() {
95+
close(s.done)
96+
})
97+
}()
9298

9399
if err := s.svr.Shutdown(ctx); err != nil && err != http.ErrServerClosed {
94100
return err

0 commit comments

Comments
 (0)