← 输入框|github.com|刷新
Skip to content

[Server] Fix Session::save() wiping a session that the store failed to read - #637

Merged
chr-hertel merged 1 commit into
modelcontextprotocol:mainfrom
nicolas-grekas:session-save-unreadable
Oct 28, 2026
Merged

chr-hertel merged 1 commit into
modelcontextprotocol:mainfrom
nicolas-grekas:session-save-unreadable

Conversation

@nicolas-grekas

Copy link
Copy Markdown
Contributor

Session::save() writes the changed keys onto what the store holds by then. When the store fails to read the session, read() returns false (Psr16SessionStore does that on any cache error), and the save wrote the changed keys alone over the session, wiping everything else: initialized, the client info, the protocol version...

save() now returns false in that case, as it already does for a session destroyed since it was read. A session that was never stored saves as before: telling it apart from an unreadable one costs one exists() call on its first save.

… to read

It returns false instead of writing the changed keys alone over the session.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No active review issues were identified for the change protecting stored session data when partial saves encounter failed reads.

No open issues 🎉

What changed in this PR

This PR prevents partial session updates from overwriting stored session data when a store read fails, while preserving saves for sessions that have never been stored.

Changes:

  • Distinguishes failed reads from empty session data and returns false when a partial save cannot safely proceed.
  • Adds regression coverage for sessions that become unreadable and those that were never readable.
  • Documents the fix in the changelog.
File Description
tests/​Unit/​Server/​Session/​SessionTest.php Verifies failed reads prevent saves and preserve stored keys.
src/​Server/​Session/​Session.php Guards partial saves against unreadable stored sessions.
CHANGELOG.md Documents the session data-loss fix.

Review effort: Balanced

@chr-hertel chr-hertel left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @nicolas-grekas!

@chr-hertel
chr-hertel merged commit 5d311d6 into modelcontextprotocol:main Oct 28, 2026
28 checks passed
@chr-hertel chr-hertel added the Server Issues & PRs related to the Server component label Nov 2, 2026
chr-hertel added a commit to BrocksiNet/php-sdk that referenced this pull request Nov 4, 2026
…et/php-sdk into pr-618-end-a-listen-stream-that-can

* 'fix/listen-empty-filter' of https://github.com/BrocksiNet/php-sdk: (25 commits)
  [Server] Pass an explicit null to a nullable tool parameter with a default (modelcontextprotocol#642)
  [Capability] Check tool names against the spec's 128-character limit and character set (modelcontextprotocol#639)
  [Tests] Stop php -S servers together with their forked workers (modelcontextprotocol#658)
  chore(deps): bump astral-sh/setup-uv from 10.3.2 to 10.3.3 (modelcontextprotocol#659)
  [Server] Accept plain http on `*.localhost` and `127.0.0.0/8` hosts in OAuth URLs (modelcontextprotocol#620)
  [Capability] Map PHPDoc pseudo-types to the JSON Schema type of their base type (modelcontextprotocol#643)
  Raise minimum versions of `phpdocumentor/reflection-docblock` and `psr/container` (modelcontextprotocol#657)
  [Server] Use compact JSON in result formatters (modelcontextprotocol#647)
  [Server] Filter list completions in one pass (modelcontextprotocol#649)
  [Server] Fix result lists being sent as JSON objects (modelcontextprotocol#656)
  Avoid repeated array merges in prompt formatting (modelcontextprotocol#650)
  [Docs] Add AGENTS.md (modelcontextprotocol#634)
  Avoid repeated array merges in resource formatting (modelcontextprotocol#651)
  [Server] Fix `"0"` prefix offering all completions (modelcontextprotocol#655)
  Filter enum completions in one pass (modelcontextprotocol#652)
  Paginate registry references before mapping (modelcontextprotocol#653)
  Extract JWT scopes in one pass (modelcontextprotocol#654)
  [Server] Fix `Session::save()` wiping a session that the store failed to read (modelcontextprotocol#637)
  [Server] Answer a DELETE of an unknown or ended session with 404 (modelcontextprotocol#638)
  [Server] Add `Psr6SessionStore` and `Psr6NotificationBus` (modelcontextprotocol#635)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Server Issues & PRs related to the Server component

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants