diff --git a/server/server.go b/server/server.go index 372324cb2fabca82ea9194afdcddd81dcebeb363..a3ae29e0fc57eedb6877bad47f2a0a3146420e56 100644 --- a/server/server.go +++ b/server/server.go @@ -66,7 +66,7 @@ type Server struct { Schema graphql.ExecutableSchema - addr string + addr []string metricsAddr string pprofAddr string conf ini.File @@ -85,7 +85,7 @@ // New creates a new common server context for a SourceHut GraphQL daemon. It // parses command line arguments and uses the provided configuration for setting // up the server and initializing the [crypto] subsystem. func New(service, defaultAddr string, conf ini.File, args []string) *Server { - addr := defaultAddr + var addr []string metricsAddr := ":0" pprofAddr := "localhost:0" @@ -97,7 +97,7 @@ for _, opt := range opts { switch opt.Option { case 'b': - addr = opt.Value + addr = append(addr, opt.Value) case 'd': debug = true case 'm': @@ -105,6 +105,9 @@ metricsAddr = opt.Value case 'p': pprofAddr = opt.Value } + } + if len(addr) == 0 { + addr = append(addr, defaultAddr) } crypto.InitCrypto(conf) @@ -365,13 +368,17 @@ } // Run the server. Blocks until SIGINT is received. func (server *Server) Run() { - qlisten, err := reuseport.Listen("tcp", server.addr) - if err != nil { - panic(err) + var qservers []*http.Server + for _, addr := range server.addr { + qlisten, err := reuseport.Listen("tcp", addr) + if err != nil { + panic(err) + } + qserver := &http.Server{Handler: server.root} + qservers = append(qservers, qserver) + go qserver.Serve(qlisten) } log.Printf("Running on %s", server.addr) - qserver := &http.Server{Handler: server.root} - go qserver.Serve(qlisten) mux := &http.ServeMux{} mux.Handle("/metrics", promhttp.Handler()) @@ -400,13 +407,17 @@ log.Println("Terminating server...") ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second)) - qserver.Shutdown(ctx) + for _, qserver := range qservers { + qserver.Shutdown(ctx) + } cancel() log.Println("Terminating work queues...") log.Printf("Progress available via Prometheus stats on port %d", plisten.Addr().(*net.TCPAddr).Port) work.Join(server.queues...) - qserver.Close() + for _, qserver := range qservers { + qserver.Close() + } log.Println("Server terminated.") }