Skip to content

feat: Allow external semaphore for executor busy state tracking - #14

Merged
lukekim merged 2 commits into
spiceai-51from
lukim/poll
Jan 29, 2026
Merged

lukekim merged 2 commits into
spiceai-51from
lukim/poll

Conversation

@lukekim

@lukekim lukekim commented Jan 29, 2026

Copy link
Copy Markdown

This change allows the semaphore controlling task concurrency to be passed into the poll_loop instead of being created internally. This enables:

  1. Sharing the semaphore across multiple poll loops connected to different scheduler nodes
  2. External tracking of executor busy state by querying available_permits()
  3. Reporting busy state in scheduler shared state location metadata

The semaphore parameter is optional - if None is passed, the function creates one internally to maintain backwards compatibility.

This change allows the semaphore controlling task concurrency to be passed
into the poll_loop instead of being created internally. This enables:

1. Sharing the semaphore across multiple poll loops connected to different
   scheduler nodes
2. External tracking of executor busy state by querying available_permits()
3. Reporting busy state in scheduler shared state location metadata

The semaphore parameter is optional - if None is passed, the function
creates one internally to maintain backwards compatibility.
@lukekim lukekim self-assigned this Jan 29, 2026
@lukekim lukekim added the enhancement New feature or request label Jan 29, 2026
@lukekim
lukekim merged commit 20ef1eb into spiceai-51 Jan 29, 2026
29 checks passed
@lukekim
lukekim deleted the lukim/poll branch January 29, 2026 03:34
milenkovicm pushed a commit to apache/datafusion-ballista that referenced this pull request Jul 20, 2026
* feat: allow an external semaphore for executor task concurrency

Adds an optional available_task_slots: Option<Arc<Semaphore>> parameter to
the executor poll_loop. When provided, the caller supplies the semaphore
that bounds concurrent task execution; this enables sharing it across poll
loops connected to different schedulers and observing executor busy state
via available_permits(). When None, the loop creates one internally sized
to the executor's task slots (unchanged behavior).

Ported from spiceai#14 for upstreaming. Note: layers
on the poll_loop signature; if landed after #12 (poll_now_notify) it needs
a trivial rebase to add both parameters.

* fix(examples): pass optional semaphore arg in mtls-cluster and reformat standalone

* fix(executor): address PR review feedback on shared-semaphore poll_loop

- Handle AcquireError from semaphore acquire/acquire_owned by mapping to
  BallistaError instead of panicking, since the semaphore may now be
  externally owned and closed by the caller
- Assert that the provided semaphore has at least one permit on entry to
  fail fast rather than deadlock
- Rewrite poll_loop doc comment to be public-facing: remove references
  to internal variable names and implementation types, document shared-
  semaphore over-commit semantics and sizing tradeoffs in behavioral
  terms, and add a # Panics section for the zero-permit case

* style: cargo fmt execution_loop.rs

---------

Co-authored-by: Phillip LeBlanc <879445+phillipleblanc@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants