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

Đang mở
#1,421 1 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 2 ngày

@cchinchilla-dev đang làm issue này rồi.

Từ ngày 4/11/2026.

  • #1422 của @cchinchilla-dev — đang mở

Đánh giá

Issue này chưa được đánh giá.

Mô tả

component: server status:awaiting response
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
Ngôn ngữ chính
Python
Star
2.2k
Fork
532
Merge trung bình
3 ngày 6 giờ
Pull request đã merge (30 ngày)
42

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của a2aproject/a2a-python

Tất cả issue của a2aproject/a2a-python

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.