Skip to content

[vMCP] Fix resource leak in session storage cleanup (Phase 3) #3871

@yrobla

Description

@yrobla

Depends on #3865, #3866

Storage.DeleteExpired() removes session metadata but does not release backend client connections, causing a connection leak on session expiry. Fix the cleanup path to call Close() on sessions that own resources.

Fix: In pkg/transport/session/manager.go, perform an optional interface check before deleting each expired session: if closer, ok := sess.(io.Closer); ok { closer.Close() }. This avoids adding Close() to the base Session interface (which would require all existing types t
o implement it) while still dispatching cleanup to sessions that carry resources.

Acceptance Criteria

  • DeleteExpired() calls Close() on any session that implements io.Closer before removing it from storage
  • Sessions that do not implement io.Closer are deleted without error (no regression for existing session types)
  • Backend client connections are released when a session expires (no connection leak)
  • Close() errors during cleanup are logged but do not prevent deletion
  • Unit tests cover: io.Closer sessions get Close() called, non-io.Closer sessions deleted cleanly, Close() error does not block deletion

RFC: THV-0038 — Session-scoped client lifecycle

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinggoPull requests that update go codep1MediumvmcpVirtual MCP Server related issues

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions