Fix small race at shutdown, don't start prometheus if not prod

zikaeroh created

Change summary

internal/server/server.go | 13 +++++++++----
main.go                   |  5 ++++-
2 files changed, 13 insertions(+), 5 deletions(-)

Detailed changes

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()

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())
 }