Repository navigation
fix(gateway): preserve queued messages at recursion cap - #93881
Closed
JoaoMarcos44 wants to merge 1 commit into
Closed
JoaoMarcos44 wants to merge 1 commit into
JoaoMarcos44 wants to merge 1 commit into
Conversation
Duplicate of #78015: both repair the recursion-cap promotion path that overwrites a promoted FIFO event and loses a queued turn. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Problem and impact
The gateway queue uses one adapter slot for the head and
SessionState.conversation.queued_eventsfor overflow. At the recursion ceiling, the drain path could lose the next queued message permanently while later messages still ran, creating both data loss and order inversion.Root cause
The drain popped the overflow head into the adapter slot before checking
_MAX_INTERRUPT_DEPTH. The cap branch then calledmerge_pending_message_event(..., merge_text=False), whose text-only fallback assigns into the slot and overwrites the promoted event.Implementation decision
When the recursion cap will defer the current event, promotion is deferred too. The current event is then placed back through
_enqueue_fifo, leaving the overflow tail untouched. This preserves the existing normal path and avoids merging separate user turns.Scope and compatibility
Files
gateway/run.pytests/gateway/test_queue_consumption.pyVerification
scripts/run_tests.sh tests/gateway/test_queue_consumption.py -q→6 passed.ruff check: passed.git diff --check: passed.msg2from[msg1, msg2, msg3, msg4]; the regression now preserves the full FIFO chain.Fixes #93871