Skip to content

[Bug]: ActiveTask.start() leaves the event queue dispatchers pending when setup fails #1421

Closed

Description

@cchinchilla-dev

What happened?

ActiveTask (src/a2a/server/agent_execution/active_task.py) creates its two EventQueueSource queues in __init__, and each EventQueueSource starts its dispatcher task as soon as it is created (src/a2a/server/events/event_queue_v2.py):

self._dispatcher_task = asyncio.create_task(self._dispatch_loop())

When the setup in start() fails, the except block marks the task as finished and re-raises, but never closes the queues:

except Exception:
    logger.debug('ActiveTask[%s]: Setup failed, cleaning up', self._task_id)
    self._is_finished.set()
    if self._reference_count == 0 and self._on_cleanup:
        self._on_cleanup(self)
    raise  # _event_queue_agent and _event_queue_subscribers stay open

The setup fails when the stored task is in a terminal state (UnsupportedOperationError) or is missing and create_task_if_missing is false (TaskNotFoundError). With DefaultRequestHandler, a SendMessage to a completed task takes the first path, so each rejected request leaves two _dispatch_loop tasks pending. Once they are garbage collected, asyncio logs:

Task was destroyed but it is pending!
task: <Task pending name='Task-28' coro=<EventQueueSource._dispatch_loop() ...>>

On a server built with DefaultRequestHandler, InMemoryTaskStore and the JSON-RPC and REST routes, six SendMessage requests to completed tasks log this twelve times.

Suggested fix: close both queues in the except block, before _on_cleanup:

await self._event_queue_agent.close(immediate=True)
await self._event_queue_subscribers.close(immediate=True)

aclose() already closes the queues the same way, but it can't be called here because it takes _lock, which start() holds.

I have a fix ready and I'm opening a PR alongside this issue.

Code of Conduct

  • I agree to follow this project's Code of Conduct

Activity

  1. added
    component: serverIssues related to frameworks for agent execution, HTTP/event handling, database persistence logic.
    on Nov 4, 2026
  2. added theissue type on Nov 4, 2026
  3. rohityan commented on Nov 4, 2026

    @rohityan

    Hi @cchinchilla-dev , thanks for reporting this and diagnosing. I was able to reproduce this issue.

    You identified the exact root cause regarding the unclosed EventQueueSource dispatcher tasks when ActiveTask.start()encounters a setup failure.

    Thanks for contributing towards the fix. Your fix in PR #1422 cleanly closes both queues before cleanup and completely resolves the task leak. Assigning this issue to you till your PR gets reviewed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

component: serverIssues related to frameworks for agent execution, HTTP/event handling, database persistence logic.status:awaiting response

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions