Skip to content

[Game Server] Resource disposal — HttpClient, WebSocket, Timer, pending messages accumulation #398

@Flegma

Description

@Flegma

Summary

Multiple resource types created without proper disposal, causing leaks over plugin lifetime.

Findings

  • MatchService.cs — new HttpClient() without using or DI. Should be singleton/injected.
  • MatchEvents.cs — WebSocket set to null without Dispose(). New WebSocket not disposed if ConnectAsync throws.
  • ReadySystem.cs — timer references lost when Reset() called with setupTimer=true multiple times.
  • SurrenderSystem.cs — _disconnectTimers accumulates in TimerUtility.Timers static list. Only cleared at match end.
  • MatchEvents.cs — System.Timers.Timer _retryTimer never disposed on plugin Unload.
  • MatchEvents.cs — _pendingMessages grows indefinitely if server stops acknowledging. No max size or TTL.

Impact

Memory and connection exhaustion over extended uptime. Timer list grows unbounded.

Suggested Fix

Use DI or static HttpClient. Add Dispose() in try/finally. Kill timers before creating new. Cap pending messages.


Related Issues (Memory Leak Pattern)

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1-highStability & reliabilityaudit-2026-03From March 2026 codebase auditresource-leakResource or connection leakservice:game-server5stackgg/game-server service

    Type

    No type

    Projects

    Status

    In progress

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions