Skip to content

fix(a2a-server): Resolve race condition in tool completion waiting#26568

Merged
kschaab merged 2 commits intomainfrom
keithsc/fix/a2a-race-condition
May 6, 2026
Merged

fix(a2a-server): Resolve race condition in tool completion waiting#26568
kschaab merged 2 commits intomainfrom
keithsc/fix/a2a-race-condition

Conversation

@kschaab
Copy link
Copy Markdown
Contributor

@kschaab kschaab commented May 6, 2026

Summary

This PR fixes a race condition in the @google/gemini-cli-a2a-server package where Task.waitForPendingTools() could hang indefinitely. The issue was caused by multiple tool confirmations being processed sequentially, which reset the tool completion promise while it was still being awaited. We now track whether the promise has been settled to prevent premature resets.

Description

  • Bug Fix: Introduced isCompletionPromiseResolved state tracking in Task to ensure that a new tool completion promise is only created if the previous one has already been settled.
  • Race Condition Prevention: Modified _resetToolCompletionPromise to check the resolution state before resetting, and updated the resolve/reject handlers to properly update this state.
  • Robustness: Added packages/a2a-server/src/agent/race-condition.test.ts to reproduce and verify the fix, ensuring that multiple sequential confirmations do not cause hangs.
  • Improved Testing: Added comprehensive event-driven scheduler tests in packages/a2a-server/src/agent/task-event-driven.test.ts to cover status mapping, tool confirmations, output updates, and edge cases like YOLO mode and parallel tool calls.

How to Validate

To verify this fix, you need to link the local development version of the a2a-server and run a high-concurrency tool task to trigger the potential race condition.

  1. Link the local package
    First, register the local package and link it into your testing environment:

Bash

In the repository root

cd packages/a2a-server
yarn link

Navigate to the directory where you are running the agent/IDE

cd /path/to/your/testing/directory
yarn link "@google/gemini-cli-a2a-server"
2. Run the reproduction task
Run the agent and provide a prompt that forces the scheduler to handle multiple tool calls (e.g., file system reads) in a single turn.

Reproduction Prompt:

"Read all the Python files in this project and output a brief summary of what each file does."

  1. Expected Results
    With Fix: The agent should successfully parallelize the file reads, receive all tool outputs, and provide the summary without hanging.

Before Fix: The agent would often "hang" indefinitely after the first few tool confirmations because the toolCompletionPromise was being overwritten before it could resolve.

Pre-Merge Checklist

Conducted bug bash with IDE on this change

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
      • npm run
      • npx
      • Docker
      • Podman
      • Seatbelt
    • Windows
      • npm run
      • npx
      • Docker
    • Linux
      • npm run
      • npx
      • Docker

@kschaab kschaab requested a review from a team as a code owner May 6, 2026 06:22
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical race condition in the @google/gemini-cli-a2a-server package where tool completion promises were being overwritten before resolution. By implementing a state-tracking mechanism, the system now correctly manages sequential tool confirmations, ensuring that the task completion promise remains stable until all pending operations are finished. This improves the reliability of the agent during high-concurrency tasks.

Highlights

  • Race Condition Fix: Introduced state tracking for tool completion promises to prevent premature resets when multiple tool confirmations are processed sequentially.
  • Robustness Improvements: Updated the task completion logic to ensure promises are only reset when fully settled, preventing indefinite hangs.
  • Enhanced Testing: Added a new reproduction test suite for race conditions and expanded event-driven scheduler tests to cover complex multi-turn scenarios.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request addresses a race condition in the Task class where the toolCompletionPromise could be overwritten before it had a chance to resolve. The fix introduces an isCompletionPromiseResolved flag to guard the _resetToolCompletionPromise method. Additionally, new tests were added to verify this fix and cover multi-turn tool resolution and subagent progress events. Feedback indicates that the new tests for acceptUserMessage are currently ineffective because they await the asynchronous generator without calling .next(), meaning the underlying logic is not being executed.

Comment thread packages/a2a-server/src/agent/race-condition.test.ts Outdated
Comment thread packages/a2a-server/src/agent/race-condition.test.ts Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

Size Change: -4 B (0%)

Total Size: 34 MB

Filename Size Change
./bundle/chunk-2CE7JBMM.js 0 B -658 kB (removed) 🏆
./bundle/chunk-75PRKOYO.js 0 B -12.5 kB (removed) 🏆
./bundle/chunk-CGSSYFEI.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-CSS3KAU5.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-IC6A23OF.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-JWI67IVM.js 0 B -14.8 MB (removed) 🏆
./bundle/chunk-RB3DBNUE.js 0 B -3.8 kB (removed) 🏆
./bundle/chunk-VPJLO54A.js 0 B -2.78 MB (removed) 🏆
./bundle/core-2XUMML54.js 0 B -48.8 kB (removed) 🏆
./bundle/devtoolsService-TOS45IBP.js 0 B -28 kB (removed) 🏆
./bundle/gemini-CJVUMNCV.js 0 B -584 kB (removed) 🏆
./bundle/interactiveCli-PXCTOAPR.js 0 B -1.29 MB (removed) 🏆
./bundle/liteRtServerManager-FEA6XISI.js 0 B -2.11 kB (removed) 🏆
./bundle/oauth2-provider-SHRETJHG.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-4FYXOFNY.js 3.8 kB +3.8 kB (new file) 🆕
./bundle/chunk-ABTWF62P.js 14.8 MB +14.8 MB (new file) 🆕
./bundle/chunk-CCA7SBV3.js 2.78 MB +2.78 MB (new file) 🆕
./bundle/chunk-FQVJTBPV.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-GXP4PNUQ.js 12.5 kB +12.5 kB (new file) 🆕
./bundle/chunk-L7MSZX6P.js 658 kB +658 kB (new file) 🆕
./bundle/chunk-OVDERR44.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-XYSTKPFM.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/core-PWJNXBE2.js 48.8 kB +48.8 kB (new file) 🆕
./bundle/devtoolsService-5NCPNVZC.js 28 kB +28 kB (new file) 🆕
./bundle/gemini-NN7QQG3F.js 584 kB +584 kB (new file) 🆕
./bundle/interactiveCli-RNDR4TNZ.js 1.29 MB +1.29 MB (new file) 🆕
./bundle/liteRtServerManager-C2KEWEKX.js 2.11 kB +2.11 kB (new file) 🆕
./bundle/oauth2-provider-VDWOXJBW.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-RJTRUG2J.js 39.8 kB 0 B
./bundle/chunk-VJSUVOZ4.js 1.97 MB 0 B
./bundle/cleanup-PY7HUDKM.js 0 B -932 B (removed) 🏆
./bundle/devtools-36NN55EP.js 696 kB 0 B
./bundle/dist-T73EYRDX.js 356 B 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.1 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/memoryDiscovery-NGHTMHWQ.js 980 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/start-RCNCIEKA.js 0 B -652 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/cleanup-VM4F376E.js 932 B +932 B (new file) 🆕
./bundle/start-MN4QJEHE.js 652 B +652 B (new file) 🆕

compressed-size-action

@gemini-cli gemini-cli Bot added the status/need-issue Pull requests that need to have an associated issue. label May 6, 2026
@kschaab kschaab added this pull request to the merge queue May 6, 2026
Merged via the queue into main with commit 02995ba May 6, 2026
27 checks passed
@kschaab kschaab deleted the keithsc/fix/a2a-race-condition branch May 6, 2026 16:32
@kschaab
Copy link
Copy Markdown
Contributor Author

kschaab commented May 6, 2026

/patch

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🚀 [Step 1/4] Patch workflow(s) waiting for approval!

📋 Details:

  • Channels: stable,preview
  • Commit: 02995ba939bcc592ac1ad9486f74a5708219a993
  • Workflows Created: 2

⏳ Status: The patch creation workflow has been triggered and is waiting for deployment approval. Please visit the specific workflow links below and approve the runs.

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🚀 [Step 2/4] Patch PR Created!

📋 Patch Details:

📝 Next Steps:

  1. Review and approve the hotfix PR: #26590
  2. Once merged, the patch release will automatically trigger
  3. You'll receive updates here when the release completes

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🚀 [Step 2/4] Patch PR Created!

📋 Patch Details:

📝 Next Steps:

  1. Review and approve the hotfix PR: #26589
  2. Once merged, the patch release will automatically trigger
  3. You'll receive updates here when the release completes

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🚀 [Step 3/4] Patch Release Waiting for Approval!

📋 Release Details:

  • Environment: prod
  • Channel: stable → publishing to npm tag latest
  • Version: v0.41.1
  • Hotfix PR: Merged ✅
  • Release Branch: release/v0.41.1-pr-26568

⏳ Status: The patch release has been triggered and is waiting for deployment approval. Please visit the specific workflow run link below and approve the deployment. You'll receive another update when it completes.

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

🚀 [Step 3/4] Patch Release Waiting for Approval!

📋 Release Details:

  • Environment: prod
  • Channel: preview → publishing to npm tag preview
  • Version: v0.42.0-preview.1
  • Hotfix PR: Merged ✅
  • Release Branch: release/v0.42.0-preview.1-pr-26568

⏳ Status: The patch release has been triggered and is waiting for deployment approval. Please visit the specific workflow run link below and approve the deployment. You'll receive another update when it completes.

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

[Step 4/4] Patch Release Failed!

📋 Details:

  • Version: 0.41.2
  • Channel: stable
  • Error: The patch release workflow encountered an error

🔍 Next Steps:

  1. Check the workflow logs for detailed error information
  2. The maintainers have been notified via automatic issue creation
  3. You may need to retry the patch once the issue is resolved

🔗 Troubleshooting:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

[Step 4/4] Patch Release Complete!

📦 Release Details:

🎉 Status: Your patch has been successfully released and published to npm!

📝 What's Available:

🔗 Links:

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

Labels

status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants