Skip to content

Conversation

@waleedlatif1
Copy link
Collaborator

Summary

  • upgraded abort controller to handle aborts for loops and parallels
  • cancels mid-loops and mid-parallels

Type of Change

  • Bug fix

Testing

Tested manually, added unit tests

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@waleedlatif1 waleedlatif1 requested a review from Sg312 January 19, 2026 03:33
@vercel
Copy link

vercel bot commented Jan 19, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Review Updated (UTC)
docs Skipped Skipped Jan 19, 2026 3:39am

Request Review

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 19, 2026

Greptile Summary

upgraded abort controller implementation to handle mid-loop and mid-parallel cancellations by introducing a cached abort promise pattern that enables immediate cancellation without waiting for all executing nodes to complete

Key changes:

  • added abortPromise and abortResolve fields to cache a single promise that resolves when abort signal fires
  • created initializeAbortHandler() to set up abort listener once during construction, preventing memory leaks from multiple listeners
  • modified waitForAnyExecution() and waitForAllExecutions() to race against the abort promise, enabling immediate return on cancellation
  • added check in run() to skip waitForAllExecutions() when cancelled, preventing blocking on incomplete executions
  • added cancellation check in processQueue() to prevent queueing new parallel branches after cancellation

The implementation properly handles edge cases like pre-aborted signals, preserves partial outputs, and maintains metadata on cancellation.

Confidence Score: 4/5

  • safe to merge with minor consideration for race condition handling
  • the implementation is well-designed with comprehensive test coverage including normal execution, abort scenarios, Redis cancellation, loop/parallel cancellation, and edge cases. The cached abort promise pattern effectively solves the memory leak issue and enables immediate cancellation. However, there's a theoretical race condition where nodes queued in processQueue() line 324 could still start executing even after checkCancellation() returns true on line 318, though this is minor and unlikely to cause issues in practice.
  • no files require special attention

Important Files Changed

Filename Overview
apps/sim/executor/execution/engine.ts upgraded abort handling to support immediate cancellation during loops and parallel execution with cached abort promise pattern
apps/sim/executor/execution/engine.test.ts comprehensive test suite added covering abort scenarios, Redis cancellation, loop/parallel cancellation, and edge cases

Sequence Diagram

sequenceDiagram
    participant User
    participant AbortController
    participant Engine
    participant AbortPromise
    participant ProcessQueue
    participant NodeExecution
    
    User->>AbortController: abort()
    AbortController->>Engine: abort event
    Engine->>Engine: set cancelledFlag = true
    Engine->>AbortPromise: resolve()
    
    alt During Queue Processing
        ProcessQueue->>Engine: checkCancellation()
        Engine-->>ProcessQueue: true (cancelled)
        ProcessQueue->>ProcessQueue: break queue loop
    end
    
    alt During Parallel Execution
        NodeExecution->>NodeExecution: executing parallel branches
        Engine->>Engine: waitForAnyExecution()
        Engine->>Engine: Promise.race([...executing, abortPromise])
        AbortPromise-->>Engine: resolves first
        Engine-->>ProcessQueue: returns immediately
        Note over NodeExecution: unfinished executions continue<br/>but won't be awaited
    end
    
    alt During Loop Iteration
        ProcessQueue->>Engine: checkCancellation()
        Engine-->>ProcessQueue: true (cancelled)
        ProcessQueue->>ProcessQueue: break loop
        Engine->>Engine: skip waitForAllExecutions()
    end
    
    Engine->>Engine: build result with status='cancelled'
    Engine-->>User: ExecutionResult (cancelled)
Loading

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

2 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@waleedlatif1
Copy link
Collaborator Author

@greptile

@icecrasher321 icecrasher321 merged commit 4afb245 into staging Jan 20, 2026
11 checks passed
@icecrasher321 icecrasher321 deleted the fix/terminate branch January 20, 2026 23:40
waleedlatif1 added a commit that referenced this pull request Jan 21, 2026
* fix(google): wrap primitive tool responses for Gemini API compatibility (#2900)

* fix(canonical): copilot path + update parent (#2901)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output (#2902)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output

* fix(imap): add top-level fields to IMAP trigger output

* improvement(browseruse): add profile id param (#2903)

* improvement(browseruse): add profile id param

* make request a stub since we have directExec

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels (#2880)

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels

* comments

* improvement(files): update execution for passing base64 strings (#2906)

* progress

* improvement(execution): update execution for passing base64 strings

* fix types

* cleanup comments

* path security vuln

* reject promise correctly

* fix redirect case

* remove proxy routes

* fix tests

* use ipaddr

* feat(tools): added textract, added v2 for mistral, updated tag dropdown (#2904)

* feat(tools): added textract

* cleanup

* ack pr comments

* reorder

* removed upload for textract async version

* fix additional fields dropdown in editor, update parser to leave validation to be done on the server

* added mistral v2, files v2, and finalized textract

* updated the rest of the old file patterns, updated mistral outputs for v2

* updated tag dropdown to parse non-operation fields as well

* updated extension finder

* cleanup

* added description for inputs to workflow

* use helper for internal route check

* fix tag dropdown merge conflict change

* remove duplicate code

---------

Co-authored-by: Vikhyath Mondreti <[email protected]>

* fix(ui): change add inputs button to match output selector (#2907)

* fix(canvas): removed invite to workspace from canvas popover (#2908)

* fix(canvas): removed invite to workspace

* removed unused props

* fix(copilot): legacy tool display names (#2911)

* fix(a2a): canonical merge  (#2912)

* fix canonical merge

* fix empty array case

* fix(change-detection): copilot diffs have extra field (#2913)

* improvement(logs): improved logs ui bugs, added subflow disable UI (#2910)

* improvement(logs): improved logs ui bugs, added subflow disable UI

* added duplicate to action bar for subflows

* feat(broadcast): email v0.5 (#2905)

---------

Co-authored-by: Vikhyath Mondreti <[email protected]>
Co-authored-by: Vikhyath Mondreti <[email protected]>
Co-authored-by: Emir Karabeg <[email protected]>
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.

3 participants