http: Close HTTP/3 servers and listeners; upstream bug irreproducible

See https://github.com/lucas-clemente/quic-go/issues/2103
and https://github.com/caddyserver/caddy/pull/2727
This commit is contained in:
Matthew Holt 2020-02-18 10:39:34 -07:00
parent 87a742c1e5
commit 7f9cfcc0f2
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5

View File

@ -322,22 +322,27 @@ func (app *App) Stop() error {
return err return err
} }
} }
// TODO: Closing the http3.Server is the right thing to do,
// however, doing so sometimes causes connections from clients // close the http3 servers; it's unclear whether the bug reported in
// to fail after config reloads due to a bug that is yet // https://github.com/caddyserver/caddy/pull/2727#issuecomment-526856566
// unsolved: https://github.com/caddyserver/caddy/pull/2727 // was ever truly fixed, since it seemed racey/nondeterministic; but
// for _, s := range app.h3servers { // recent tests in 2020 were unable to replicate the issue again after
// // TODO: CloseGracefully, once implemented upstream // repeated attempts (the bug manifested after a config reload; i.e.
// // (see https://github.com/lucas-clemente/quic-go/issues/2103) // reusing a http3 server or listener was problematic), but it seems
// err := s.Close() // to be working fine now
// if err != nil { for _, s := range app.h3servers {
// return err // TODO: CloseGracefully, once implemented upstream
// } // (see https://github.com/lucas-clemente/quic-go/issues/2103)
// } err := s.Close()
// as of September 2019, closing the http3.Server if err != nil {
// instances doesn't close their underlying listeners return err
// so we have todo that ourselves }
// (see https://github.com/lucas-clemente/quic-go/issues/2103) }
// closing an http3.Server does not close their underlying listeners
// since apparently the listener can be used both by servers and
// clients at the same time; so we need to manually call Close()
// on the underlying h3 listeners (see lucas-clemente/quic-go#2103)
for _, pc := range app.h3listeners { for _, pc := range app.h3listeners {
err := pc.Close() err := pc.Close()
if err != nil { if err != nil {