Skip to content

Conversation

@TranslateMe
Copy link

Problem

Sessions can get stuck in an infinite "Generator aborted" loop, preventing any observation processing.

Root Cause

When a generator exits with wasAborted=true, the cleanup in startGeneratorWithProvider() correctly sets:

  • generatorPromise = null
  • currentProvider = null

But it does NOT reset the AbortController, leaving signal.aborted = true.

When new observations arrive:

  1. ensureGeneratorRunning() sees generatorPromise = null
  2. Attempts to start a new generator via startGeneratorWithProvider()
  3. New generator immediately detects signal.aborted = true
  4. Generator exits with "Generator aborted" message
  5. Loop repeats infinitely

Reproduction

  1. Start a session and process some observations
  2. Abort the generator (e.g., session timeout, crash recovery)
  3. Send new observations to the same session
  4. Observe infinite "Generator aborted" messages in logs
  5. Observations queue grows but never gets processed

Solution

Add a check at the beginning of startGeneratorWithProvider() to detect if the session's AbortController signal is already aborted. If so, create a fresh AbortController instance before proceeding.

if (session.abortController.signal.aborted) {
  logger.debug('SESSION', 'Resetting aborted AbortController before starting generator', {
    sessionId: session.sessionDbId
  });
  session.abortController = new AbortController();
}

This mirrors the existing crash recovery logic (line 192) but applies it universally to all generator starts.

Testing

  • Verified fix resolves stuck sessions
  • Confirmed new generators start successfully after AbortController reset
  • Observation processing resumes normally

Impact

Low risk - only affects sessions that were previously stuck. Normal session flow unchanged.

…ite abort loop

When a generator exits with wasAborted=true, the AbortController remains in
aborted state but generatorPromise is set to null. When a new observation
arrives, ensureGeneratorRunning() sees generatorPromise=null and tries to
start a new generator, but the new generator immediately sees
signal.aborted=true and exits, causing an infinite "Generator aborted" loop.

This fix resets the AbortController if it's already aborted before starting
a new generator, allowing the session to recover from the stuck state.

Bug reproduction:
1. Session receives observations
2. Something causes the generator to be aborted
3. generatorPromise = null, but abortController.signal.aborted = true
4. New observation arrives → starts generator → immediately aborted → loop

Fix: Check if abortController.signal.aborted before starting generator,
and create a new AbortController if needed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant