test(gateway): cover auto-resume full-path no-regression; clarify guard docstring
The salvaged fix's two regression tests mock adapter.handle_message, so they only assert the pre-claimed sentinel is set/cleaned around a stub — they never drive the real dispatch chain. Add a full-path test that exercises _schedule_resume_pending_sessions -> _guarded_handle_message -> adapter.handle_message -> _process_message_background -> _handle_message and asserts the resumed session's agent runs EXACTLY ONCE: not zero (the pre-claim must not self-bounce the resume into a queued no-op) and not twice (the duplicate-agent bug #45456 the fix targets). Also assert no leaked sentinel and no orphaned pending event after the drain settles. Tighten the _guarded_handle_message docstring: on current main the real sentinel is taken over inside _handle_message (not _process_message_background), and note the `is _AGENT_PENDING_SENTINEL` guard only releases the slot we ourselves placed, never one a live run owns.
This commit is contained in:
+9
-5
@@ -4579,12 +4579,16 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew
|
||||
) -> None:
|
||||
"""Ensure the pre-claimed sentinel is always released.
|
||||
|
||||
In the normal flow, ``_process_message_background`` sets
|
||||
its own sentinel and releases it in its ``finally`` block.
|
||||
If ``handle_message`` raises *before* reaching that
|
||||
method (e.g. during topic recovery or session key
|
||||
In the normal flow the resume turn reaches
|
||||
``_handle_message``, which replaces our pre-claim with
|
||||
its own ``_AGENT_PENDING_SENTINEL`` (and releases it in
|
||||
its ``finally`` block) once the run begins. If
|
||||
``handle_message`` raises *before* the runner takes over
|
||||
the slot (e.g. during topic recovery or session-key
|
||||
resolution), nobody clears our pre-claim — so we do it
|
||||
here unconditionally.
|
||||
here unconditionally. The ``is _AGENT_PENDING_SENTINEL``
|
||||
guard below only releases the slot we ourselves placed,
|
||||
never one a live run currently owns.
|
||||
"""
|
||||
try:
|
||||
await _adapter.handle_message(_event)
|
||||
|
||||
Reference in New Issue
Block a user