diff --git a/internal/server/server.go b/internal/server/server.go index be956f7..7e68e6d 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -239,15 +239,20 @@ func (r *Room) HandleConn(playerID uuid.UUID, nickname string, c *websocket.Conn r.mu.Lock() r.players[playerID] = func(s protocol.ServerNote) { - g.Go(func() error { + if ctx.Err() != nil { + return + } + + // It's not safe to start more group goroutines concurrently; just use a regular + // goroutine and hope that errors here will be reflected later via ping/receive failures. + go func() { ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() if err := wsjson.Write(ctx, c, &s); err != nil { - return err + return } metricSent.Inc() - return nil - }) + }() } r.room.AddPlayer(playerID, nickname) r.sendAll() diff --git a/main.go b/main.go index b7068b9..5d30767 100644 --- a/main.go +++ b/main.go @@ -210,7 +210,10 @@ func main() { }) runServer(ctx, g, args.Addr, r) - runServer(ctx, g, ":2112", prometheusHandler()) + + if args.Prod { + runServer(ctx, g, ":2112", prometheusHandler()) + } log.Fatal(g.Wait()) }