Guard closing quitCh with sync.Once to prevent double close (#8242)

* Guard closing quitCh with sync.Once to prevent double close

Signed-off-by: Mitsuo Heijo <mitsuo.heijo@gmail.com>
This commit is contained in:
Mitsuo Heijo 2020-12-02 17:39:54 +09:00 committed by GitHub
parent acee998df6
commit 8b64b70fe4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -186,6 +186,7 @@ type Handler struct {
router *route.Router
quitCh chan struct{}
quitOnce sync.Once
reloadCh chan chan error
options *Options
config *config.Config
@ -918,12 +919,14 @@ func (h *Handler) version(w http.ResponseWriter, r *http.Request) {
}
func (h *Handler) quit(w http.ResponseWriter, r *http.Request) {
select {
case <-h.quitCh:
fmt.Fprintf(w, "Termination already in progress.")
default:
fmt.Fprintf(w, "Requesting termination... Goodbye!")
var closed bool
h.quitOnce.Do(func() {
closed = true
close(h.quitCh)
fmt.Fprintf(w, "Requesting termination... Goodbye!")
})
if !closed {
fmt.Fprintf(w, "Termination already in progress.")
}
}