Repository navigation
Conversation
- EDDN uploader: wait on a TaskCompletionSource instead of an unbounded poll - EliteBGS: drop a 100 ms delay; callers join the in-flight request synchronously - Discord presence: advance the injected clock instead of Thread.Sleep - EDDN/Inara history tests: DisposeAsync drains, so the pre-dispose delay is gone - Inara: suppressed/disabled tests drain via DisposeAsync; accumulate test uses a dock as a sentinel - Settings: release the brief lock from a dedicated thread, not a pool timer - Twitch card: wait for the faulted PublishCompleted instead of a fixed delay Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
The 2 s watchdog failed on the Windows runner (CI run 42959125896): the pooled read can queue behind the blocked engine start without ever touching the lock. Read on its own thread with a 10 s bound; the start is held for 30 s, so a read blocked on the lock still fails the test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hort Windows CI (run 42959504078) counted 1 of 12,000 uploaders as stranded. DisposeAsync waits only DisposeGrace (1.5 s) before cancelling, so a worker starved by the 16-way stress loop was cancelled before its second send. Pinned to one core with a 1 ms grace this reproduces as 6-9 'stranded' per run; with a one-minute grace it passes. Dispose still returns as soon as the worker finishes, so a truly stranded message is still caught. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What & why
Before: several tests waited on fixed sleeps or unbounded polls. Two EDDN uploader tests could hang forever if the handler was never reached, and the settings "brief lock" test released its lock from a pool timer that a busy CI runner could delay past the store's retry budget.
After: those waits are tied to real signals (a
TaskCompletionSource, the injected clock,PublishCompleted, orDisposeAsyncdraining the send chain). Test-only; no app code changed.Follow-up to #265 (Windows test leg).
Changes
while (Calls == 0) await Task.Delay(5)loops (no deadline) now await a TCS set by the handler.GetSystemAsyncreturns.Thread.Sleep(5)replaced by advancing the injected clock past the throttle window.DisposeAsync; dispose flushes and awaits, which is a stronger check.DisposeAsyncinstead of 150 ms; the accumulate test now publishes a dock as a sentinel and asserts the single request carries everything.PublishCompleted(raised afterReauthRequired) instead of 6 intervals.Left on purpose
Task.WhenAny(x, Task.Delay(N))watchdogs: upper bounds, not sleeps.Task.Delay(Infinite)/ sleeps inside plugin bodies: they model hung I/O or slow plugins.TimeProviderseam in those services (no behaviour change), which is app code and is not in this PR.How it was verified
Windows: via the CI matrix on this PR.
Checklist
dotnet build EDNexus.slnx), no new warningsCommanderState; onlyStateTrackermutates it (no feature code touched)Generated by Claude Code
Summary by CodeRabbit