diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-08-05 03:31:52 +0900 |
|---|---|---|
| committer | Sho Sakuma <me@m1sk9.dev> | 2026-08-05 03:31:52 +0900 |
| commit | c939f879f388f07f00e017f59685276aa7a9faef (patch) | |
| tree | 0c67f359da3f39c9023b1261ab5e963e3a1a643a /docs/src/guide/patch-notes | |
| parent | 7c544224291e8ed7e23dcf97ea3cc6f42588c338 (diff) | |
| download | LunaticChat-c939f879f388f07f00e017f59685276aa7a9faef.tar.gz LunaticChat-c939f879f388f07f00e017f59685276aa7a9faef.tar.bz2 LunaticChat-c939f879f388f07f00e017f59685276aa7a9faef.zip | |
fix: keep a slow Google IME reply from killing a delivery queue
withTimeout reports a timeout as a CancellationException, which callers must
rethrow rather than degrade. With api.timeout below convertWithRomaji's budget
the client's timeout therefore travelled through convertWord, through
withTimeoutOrNull - which rethrows a timeout belonging to another coroutine -
and into the queue worker, which read it as shutdown and ended its loop. The
channel stayed registered with nothing reading it, so every later message from
that player was buffered and never delivered: exactly the failure the worker's
own guard exists to prevent. A timeout is now an ordinary exception, so
cancellation once again means only cancellation.
The concurrency limiter also no longer covers the cache lookup. Its four
permits are shared by the whole server and held for a full round trip, so
cached words queued behind in-flight requests for a permit they did not need
and a message whose every word was cached could still exhaust the caller's
budget and go out unconverted.
Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'docs/src/guide/patch-notes')
0 files changed, 0 insertions, 0 deletions
