diff --git a/cmd/serve_cmd.go b/cmd/serve_cmd.go index d0dac6400..c85332943 100644 --- a/cmd/serve_cmd.go +++ b/cmd/serve_cmd.go @@ -5,6 +5,7 @@ import ( "net" "net/http" "sync" + "syscall" "time" "github.com/pkg/errors" @@ -105,7 +106,23 @@ func serve(ctx context.Context) { } }() - if err := httpSrv.ListenAndServe(); err != http.ErrServerClosed { + lc := net.ListenConfig{ + Control: func(network, address string, c syscall.RawConn) error { + var serr error + if err := c.Control(func(fd uintptr) { + // hard-coded syscall.SO_REUSEPORT since it doesn't seem to be defined in different environments + serr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, 0x200, 1) + }); err != nil { + return err + } + return serr + }, + } + listener, err := lc.Listen(ctx, "tcp", addr) + if err != nil { log.WithError(err).Fatal("http server listen failed") } + if err := httpSrv.Serve(listener); err != nil { + log.WithError(err).Fatal("http server serve failed") + } }