Files
mxaccessgw/docs/WorkerProcessLauncher.md
T
Joseph Doherty ff397b27be fix(gateway): remove the worker startup-probe retry options that could never retry (#188)
WorkerProcessStartedProbe only checks HasExited and throws a non-retryable
WorkerProcessLaunchException, so StartupProbeRetryAttempts and
StartupProbeRetryDelayMilliseconds configured a Polly retry that no shipped
probe could trigger. Real readiness is WorkerClient's WorkerReady handshake
under the same StartupTimeoutSeconds budget, so the probe now runs once and
the two options, their validation, the Polly pipeline (and the server's now
unused Polly.Core reference) and their docs are removed. A stale value in
configuration is ignored by the binder.

Tests: WorkerProcessLauncherTests.LaunchAsync_WhenStartupProbeFails_DoesNotRetryTheProbe,
WorkerOptions_HasNoStartupProbeRetryOptions (both fail on the old code).
2026-11-06 16:05:42 -05:00

3.7 KiB

Worker Process Launcher

The gateway uses WorkerProcessLauncher to validate and start one worker process for a gateway session. The launcher owns process start semantics only; pipe handshaking and WorkerReady validation remain part of the worker client startup path.

Launch Inputs

WorkerProcessLaunchRequest carries the per-session bootstrap values:

  • SessionId,
  • PipeName,
  • ProtocolVersion,
  • Nonce,
  • optional PipeReservation cleanup handle.

The launcher passes SessionId, PipeName, and ProtocolVersion as command line arguments:

--session-id <sessionId> --pipe-name <pipeName> --protocol-version <version>

The launcher sets the nonce through the MXGATEWAY_WORKER_NONCE environment variable. The nonce is not included in WorkerProcessCommandLine so logs and diagnostics can report the launch command without exposing the secret.

All launch-variable names live in the shared Contracts WorkerLaunchEnvironment class and are consumed by both the launcher and the worker. The launcher always exports all six values:

Environment variable Gateway source Worker default when missing/invalid
MXGATEWAY_WORKER_NONCE WorkerProcessLaunchRequest.Nonce None; bootstrap fails because the nonce is required
MXGATEWAY_WORKER_PIPE_CONNECT_ATTEMPT_TIMEOUT_MS MxGateway:Worker:PipeConnectAttemptTimeoutMilliseconds 2000 ms
MXGATEWAY_WORKER_WRITE_COMPLETION_WAIT_MS MxGateway:Worker:WriteCompletionWaitMilliseconds 1500 ms
MXGATEWAY_EVENT_QUEUE_CAPACITY MxGateway:Worker:EventQueueCapacity 10000 events
MXGATEWAY_ALARM_POLL_INTERVAL_MS MxGateway:Alarms:PollIntervalMilliseconds 500 ms
MXGATEWAY_ALARM_MAX_ALARMS_PER_FETCH MxGateway:Alarms:MaxAlarmsPerFetch 1024 alarms

The write-completion wait applies to the four single-item write variants: Write, Write2, WriteSecured, and WriteSecured2. Bulk writes report COM acceptance per entry and do not wait for OnWriteComplete rows.

Validation And Cleanup

Before starting the process, the launcher validates that the configured worker path exists, has a .exe extension, contains a valid Windows Portable Executable header, and matches the configured RequiredArchitecture.

After the process starts, IWorkerStartupProbe runs once. The default probe only verifies that the worker did not exit immediately; a worker that has already exited cannot be recovered by waiting, so the probe is not retried. Real readiness is the pipe connection, hello, and WorkerReady handshake that WorkerClient performs after the launch, under the same WorkerOptions.StartupTimeoutSeconds budget. (The former StartupProbeRetryAttempts / StartupProbeRetryDelayMilliseconds options were removed because no shipped probe could ever produce a retryable failure; a stale value in configuration is ignored by the binder.)

The worker uses the exported pipe-attempt value inside its own bounded Polly retry loop.

If startup fails or exceeds WorkerOptions.StartupTimeoutSeconds, the launcher kills the worker process tree, disposes the process handle, disposes the optional pipe reservation, records a worker kill metric, and reports a WorkerProcessLaunchException.

Verification

Run the focused launcher tests after changing process launch behavior:

dotnet test src/ZB.MOM.WW.MxGateway.Tests/ZB.MOM.WW.MxGateway.Tests.csproj --filter WorkerProcessLauncherTests

Run the gateway build because the launcher is part of ZB.MOM.WW.MxGateway.Server:

dotnet build src/ZB.MOM.WW.MxGateway.Server/ZB.MOM.WW.MxGateway.Server.csproj