Repository navigation
Replies: 2 comments
|
A second live hang was captured today around 14:22:56 CST, after restarting the desktop app. Two useful differences from the first capture:
Additional native / Mojo investigationThe font request has progressed further than merely a posted task:
Full GPU and browser native stacks were obtained with
These samples show neither a GPU driver/fence wait nor an executing/blocked fontconfig call. They cannot exclude a graphics fault preceding the samples. CDP reports ANGLE OpenGL / Mesa 26.2.6 on RX 9060 XT, with hardware compositing/rasterization enabled. No corresponding GPU reset/crash was found in the checked logs. The model turn had completed at 14:21:36.621, before this freeze. Renderer memory was read through The remaining investigation boundary is the request/response path between the sender/controller, browser font service, and renderer response dispatch. The earlier loss of rAF and subsequent loss of fetch completions should also be considered; the post-hang font stack alone does not explain the initial rendering corruption. No font/GPU/runtime workaround has been verified yet. |
|
Root cause found and a local fix reproduced: the notification plugin leaves Live renderer inventory:
I isolated the actual plugin client in a small Electron app using a local custom protocol, with no DSH host, model, diagnostic page probe, or user data. Using the exact Electron 44.7.0 binary from this DSH installation, Xvfb, GPU disabled, and renderer nofile 1024/524288:
After exhaustion, forcing Chinese layout also timed out. That isolated timeout did not match the same fallback stack, so I am not presenting it as an identical-stack reproduction. It does reproduce and remove the resource accumulation seen in the live hang. Electron 44.10.2 also reproduced the original FD growth; a runtime update alone did not address the leak. The local patch explicitly cancels unused bodies: fetch(url, options)
.then(response => response.body?.cancel())
.catch(handleError);Successful pending polls still parse JSON; unsuccessful polls also cancel their bodies. The plugin's full 47 tests pass; the new release checks fail against the old code. With the user’s approval, the frozen instance has now been fully restarted. The actual loaded client source contains the cancellation fix. In the first several minutes, the full DSH renderer remained around 48 FDs, with zero retained 64 KiB This corrects the direction of my initial investigation: I should have checked FD usage/limits before repeatedly interpreting the native wait stack. No change to DSH's font-selection code is proposed by this finding. Chromium's behavior on FD exhaustion may still merit separate robustness work; a related report is crbug 582417463. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Update: root cause found in local notification plugin
The renderer exhausted its 1024 file-descriptor limit because the local dsh-notify-kde plugin did not read/cancel repeated no-store fetch responses. Of 983 retained 64 KiB regions, 979 contained
{"ok":true}. In an isolated app using this exact Electron 44.7.0 binary with GPU disabled, the original client reached 1024 FDs after 1000 heartbeats; explicitly cancelling unused bodies kept the fixed client at 30–31 FDs through 2500 heartbeats. The font wait below is a downstream symptom; no DSH font-algorithm change is proposed. Full plugin tests: 47 passed. The fix has now been reloaded into the actual desktop app, with short-run body cleanup/FD stability verified; multi-hour production validation remains pending.Original investigation follows for reference.
Summary
Linux desktop repeatedly becomes completely unresponsive while the separate DSH host can continue and finish an existing model turn. A live hang in 0.2.2-rc.1 / Electron 44.7.0 was symbolicated using the matching official Electron symbols: the renderer main thread is indefinitely waiting in
font_service::internal::FontServiceThread::FallbackFontForCharacterwhile shaping text. The outstanding lookup was U+2461 (②), localezh-CN.This is a report of a captured hang, not a claim that typing
②alone reliably reproduces it or that the deeper cause of the missing completion has been identified.Reproduction
There is not yet a standalone deterministic reproducer. The problem was observed before adding diagnostic instrumentation and has occurred repeatedly across restarts. Two independently captured hangs (Nov 10 and Nov 11) have matching ELF-relative PCs at the font-fallback wait.
The fully investigated Nov 11 instance was started with:
Diagnostic caveat: that instance also had a page probe wrapping
fetch/ WebSocket listeners and recording timer/rAF heartbeats. Third-party plugins were enabled; a clean-profile reproduction has not yet been established. This report does not rule out a plugin or embedder lifecycle interaction.Current behavior
Runtime.evaluatestops responding. The last heartbeat at 13:13:27.716 hadrafAgo=5ms,visibilityState=visible, and focus. Thus this particular capture is not merely an rAF pause in a hidden window.turn/endwithreason.kind=completedat 13:15:27.Symbol matching and live-memory investigation
6d9c8e1bbe821f8226585947aa0d54074711a758.Linux x86_64 1B8E9C6D82BE821F26585947AA0D54070 electron, matching the ELF ID after GUID byte-order conversion.0x03afb0c0saves the character argument withmov %esi,-0x3c(%rbp). Reading that location in the frozen frame gives 0x2461. The locale is the libc++ short string zh-CN.0x03afb2f2loads0x7fffffffffffffffbefore the wait. Despite theTimedWaitname, this invocation is an unbounded wait.FontServiceThreadobject has one entry inpending_waitable_events_. The entry points to exactly the stackdone_eventon which the renderer main thread is waiting. Object layout was checked against constructor/Impl disassembly. This establishes an outstanding completion, not why it was lost/delayed.eu-stackcapture of all browser-process threads was also symbolicated. The UI/IO threads were in their event loops and worker threads were waiting for work. That sample did not show an executing/blocking fontconfig call. Therefore a fontconfig mutex deadlock is not established by this report.0x03afb307/0x049a21aereturn PCs.fc-match ':charset=2461'returnsDejaVu Sansimmediately; several installed fonts cover the character. This is not simply an absence of a font containing U+2461, although it does not validate Electron's embedded font-service path.The full raw captures remain local because they contain process addresses and paths. The relevant normalized frames are included above; additional sanitized diagnostics can be supplied.
Expected behavior
A failed/unavailable fallback-font lookup should not leave the renderer main thread blocked indefinitely. The UI should remain usable, even if an individual character must temporarily render as a missing glyph.
Requested triage:
I have not verified that updating Electron, changing UI fonts, rebuilding font caches, or disabling the GPU fixes this hang. No such fix should be inferred from the stack alone.
Environment
0.2.2-rc.1(Arch package0.2.2rc.1-1); earlier repeated freezes also occurred on0.2.2-alpha.2.44.7.0; Chromium152.0.7977.130; V815.2.124.28.7.2.14-zen1-1-zen; KDE Plasma Wayland; AMD graphics.2.18.3-2; freetype22.15.0-1; Mesa26.2.6-1; GTK33.24.52-2; glibc2.44+r50+g1848099f063e-1.All reactions