Skip to content

[rush-daemon][WS2.8][7/9] Wire request admission - #7

Open
mojaza wants to merge 1 commit into
mojazayeri-microsoft-rushd-ws2-interactive-iofrom
mojazayeri-microsoft-rushd-ws2-request-admission
Open

[rush-daemon][WS2.8][7/9] Wire request admission#7
mojaza wants to merge 1 commit into
mojazayeri-microsoft-rushd-ws2-interactive-iofrom
mojazayeri-microsoft-rushd-ws2-request-admission

Conversation

@mojaza

@mojaza mojaza commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Summary

Adds WS2.8 scheduler classification and request admission for the opt-in rushd phased/global routing stack.

Depends on #6. This stack follows merged microsoft#5949 and advances microsoft#5897. Azure PBI: https://onedrive.visualstudio.com/EFun/_workitems/edit/3216024

Details

  • Classifies every built-in Rush command as SHARED-BUILD, SHARED-READ, or EXCLUSIVE, with unknown/custom commands failing closed to EXCLUSIVE.
  • Shares one RequestScheduler per warm workspace across phased and global routes.
  • Adds typed noWait/bounded waitTimeoutMs admission options, cancellation while queued, capability-gated one-based queue-position controls, and deterministic typed admission results.
  • Holds admission through command cleanup and final-result delivery, including abort, disconnect, output, and raw-mode restoration failures.
  • Adds focused protocol, concurrency, FIFO, cancellation, cleanup-race, and built-in-classification coverage.

Limitations

  • CLI parsing for --no-wait and --wait-timeout remains deferred to WS4; this layer accepts resolved typed values only.
  • Compatible SHARED-BUILD requests may hold admission concurrently, but the phased router intentionally retains its existing graph-execution lock. WS2.9 will add coordinated selection merging.
  • Existing Rush action/parser adaptation, daemon lifecycle/restart work, and apps/rush launcher integration remain out of scope; the executable stays opt-in under @rushstack/rush-daemon.

How it was tested

  • rush build --only @rushstack/rush-daemon-protocol --only @rushstack/rush-daemon
  • Protocol CommonJS Jest suite: 10 suites, 49 tests passed.
  • Affected daemon CommonJS Jest suites: 6 suites, 49 tests passed.
  • Final admission/policy rerun: 2 suites, 11 tests passed.
  • rush change --verify

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Unresolved review findings remain in admission handling and command classification.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds WS2.8 workspace-scoped request admission for opt-in phased and global Rush daemon routing.

Changes:

  • Adds scheduling, cancellation, timeouts, queue positions, and lease lifecycle handling.
  • Classifies Rush commands and shares admission across routes.
  • Extends protocol contracts, documentation, API reports, changesets, and tests.
File summaries
File Summary
libraries/rush-daemon/src/WorkspaceRequestAdmission.ts Bridges requests to workspace scheduling.
libraries/rush-daemon/src/test/RushCommandRequestPolicy.test.ts Tests command classification.
libraries/rush-daemon/src/test/RequestAdmissionIntegration.test.ts Tests admission integration and cleanup.
libraries/rush-daemon/src/test/PhasedRequestRouterTestUtilities.ts Supports phased-router admission tests.
libraries/rush-daemon/src/test/GlobalCommandRequestRouter.test.ts Tests global-router admission behavior.
libraries/rush-daemon/src/RushCommandRequestPolicy.ts Defines Rush command classifications.
libraries/rush-daemon/src/PhasedRequestRouter.ts Integrates admission with phased routing.
libraries/rush-daemon/src/PhasedRequestClient.ts Adds phased client admission capabilities.
libraries/rush-daemon/src/GlobalCommandRequestRouter.ts Integrates admission with global routing.
libraries/rush-daemon/src/GlobalCommandRequestClient.ts Adds global client admission capabilities.
libraries/rush-daemon/src/GlobalCommandRequest.ts Carries global admission options.
libraries/rush-daemon/README.md Documents daemon admission behavior.
libraries/rush-daemon-protocol/src/test/RequestAdmission.test.ts Tests admission validation.
libraries/rush-daemon-protocol/src/test/ControlFrame.test.ts Tests control protocol behavior.
libraries/rush-daemon-protocol/src/RequestAdmissionControlValidation.ts Validates admission controls.
libraries/rush-daemon-protocol/src/index.ts Exports admission contracts.
libraries/rush-daemon-protocol/src/DaemonRequestAdmission.ts Defines admission options and results.
libraries/rush-daemon-protocol/src/DaemonProtocolVersion.ts Advances the protocol version.
libraries/rush-daemon-protocol/src/DaemonPhasedRequest.ts Carries phased admission options.
libraries/rush-daemon-protocol/src/DaemonControlMessage.ts Adds queue-position messages.
libraries/rush-daemon-protocol/src/DaemonControlKinds.ts Defines the queue-position control kind.
libraries/rush-daemon-protocol/src/DaemonCommandResult.ts Adds typed admission failures.
libraries/rush-daemon-protocol/src/DaemonClientCaps.ts Adds admission capability negotiation.
libraries/rush-daemon-protocol/src/ControlMessageValidation.ts Wires control-message validation.
libraries/rush-daemon-protocol/README.md Documents protocol admission additions.
common/reviews/api/rush-daemon.api.md Updates the daemon API report.
common/reviews/api/rush-daemon-protocol.api.md Updates the protocol API report.
common/changes/@rushstack/rush-daemon/mojazayeri-request-admission_2026-08-21-22-37.json Records daemon changes.
common/changes/@rushstack/rush-daemon-protocol/mojazayeri-request-admission_2026-08-21-22-37.json Records protocol changes.
Review details
  • Files reviewed: 29/29 changed files
  • Comments generated: 3
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +120 to +123
graphLease = await routingState.graphExecutionScheduler.acquireAsync({
abortSignal: client.abortSignal,
exclusivityClass: RequestExclusivityClass.Exclusive
});
export const BUILT_IN_RUSH_COMMAND_CLASSIFICATION: Readonly<Record<string, RequestExclusivityClass>> =
Object.freeze({
add: RequestExclusivityClass.Exclusive,
alert: RequestExclusivityClass.SharedRead,
Comment on lines +51 to +54
export function classifyRushCommand(commandName: string): RequestExclusivityClass {
return Object.hasOwn(BUILT_IN_RUSH_COMMAND_CLASSIFICATION, commandName)
? BUILT_IN_RUSH_COMMAND_CLASSIFICATION[commandName]
: RequestExclusivityClass.Exclusive;
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