Repository navigation
Windows 桌面端点「安装并重启」永久卡在「正在准备重启…」,安装器从未启动(0.2.1-rc.2 → rc.3) #10973
Mrsoso-1987
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
摘要 / TL;DR
The update downloads fine (276 MB, SHA512 + Authenticode verified), but the pre-restart
handshake never completes:
backend.stop()was never reached;Code-wise,
DesktopUpdateCoordinator.install()setsphase: "installing"before awaitingbeforeRestart(). Every step insidebeforeRestart()except one has a deadline; the onlyunbounded await is
platformView.closeAndWait()(ChromiumcloseAllConnections()/clearStorageData()/webContents 'destroyed'event). That is where the flow is stuck.环境 / Environment
app.asar!package.json, uninstall registryDisplayVersion)<install dir>/version)E:\DeepSeek Harness(内置 1 TB 机械硬盘,非 SSD)nightly, generic providerhttps://download.deepseek.com/dsh-desk/feeds/win-x64/0.2.1-rc.3(289,415,960 bytes)复现步骤 / Steps
实际结果 / Actual
16:18:45应用启动(单实例 PID 24172;host child PID 2259616:19:03)16:19:53current.blockmap写入;16:21:11pending\deepseek-harness-0.2.1-rc.3-win-x64.exe(289,415,960 B);
16:21:17pending\update-info.json16:21:47默认 session 的Network\Cookies被写(点击后的遥测上报)17:00+(约 19 分钟后)仍在「正在准备重启…」:主窗口正常响应,PID 不变deepseek-harness-0.2.1-rc.3-win-x64.exe进程、%TEMP%无 NSIS 解压目录、E:\DeepSeek Harness内文件时间仍是 10/17 17:20、version仍为 0.2.1-rc.2 对应内容。backend.stop()没有被执行到。installer.exe,289,385,456 B),应用文件至今仍是 10/17 的 ⇒ 不是一次性偶发,可重复。
期望结果 / Expected
要么在合理时间内完成安装(应用退出 → 安装器运行 → 自动重启),要么在 N 秒后给出可见错误、
可重试、并落日志。绝不能无限期静默挂起。
代码定位 / Where it hangs
app.asar→lib/main.jsDesktopUpdateCoordinator.install(version)(约 L7875-7899):beforeRestart()(约 L12329-12376)的每一步与其上限:commandManager.idle()await workspaceRecovery/await startuphost.updateTasks("inspect")control(..., 1e4, ...),L3861)updateDialog.show()track("desktop_upgrade_install_restart_click")AbortSignal.timeout(1e3))host.updateTasks("lock")platformView.closeAndWait()backend.stop()→host.stop(true)quitAndInstall()因为
host进程仍然活着、且没有任何错误弹窗,能同时满足这两点的只可能是platformView.closeAndWait()这个唯一没有超时的 await:closeAllConnections()/clearStorageData()/webContents 'destroyed'都是 Chromium 侧调用,在分区里存在 service worker、SSE/长连接或挂起的 IndexedDB 事务时都可能不返回;
storageCleanup还是一个按 session 累积的Map,一旦其中某个 promise 曾经挂住,后续每次closeAndWait()都会立刻挂住。影响 / Impact
DesktopUpdateJournal仅在DSH_DESKTOP_UPDATE_JOURNAL_DIR存在时创建,L12045-12046),因此这类问题是“零证据”的,难以自助排查。
建议修复 / Suggested fixes
给
closeAndWait()加上限(最小改动,直接解决本 issue):给整个
beforeRestart()加看门狗(例如 60 s),超时后:setState({ phase: "error", failedOperation: "install", message: "更新准备超时" })并在 UI 上给出「重试 / 查看日志 / 仍然安装」;
quitAndInstall()」,不要因为清理失败而放弃安装。UI:「正在准备重启…」应显示当前子步骤(停止任务 / 关闭账户视图 / 重启安装器)并允许取消;
超过 30 s 至少提示“仍在准备,可查看日志”。
日志:
DesktopUpdateJournal在失败路径或phase === "installing"时默认落盘到%LOCALAPPDATA%\@deepseek-ai\dsh-desktop\logs\,并记录每个子步骤的耗时。别把安装绑死在清理上:安装器本身会等待进程退出(NSIS
checkAppRunning),因此可以「先 spawn 安装器、再 best-effort 清理并退出」,把不可控的 Chromium 调用移出关键路径。
次生问题:
beforeRestart()在currentDialogWindow() === undefined或updateDialog.show()返回非 0 时直接return false,状态回到ready而没有任何提示(L12350-12351、L7884-7887),用户会看到“点了没反应”。建议区分「用户取消」与「无法准备」,
后者必须提示原因。
规避 / Workaround(给其他用户)
手动升级路径(我本机已验证可行):
DeepSeek Harness.exe)。%LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\pending\deepseek-harness-<version>-win-x64.exe(先在
pending\update-info.json核对 SHA512)。/S /D=<安装目录>(/D必须最后且不能加引号)。需要自升级自动化的话,可以用一个外置脚本完成「拉 feed → 校验 SHA512/签名 → 结束进程 →
/S /D=安装 → 校验 exe 版本 → 启动」,绕开这段握手。附:如何抓取本问题的证据
设环境变量
DSH_DESKTOP_UPDATE_JOURNAL_DIR=<一个可写目录>后启动桌面端,再走一次升级,会在该目录生成
<timestamp>-<uuid>.jsonl,逐条记录started / download-requested / state:installing / install-confirmed / quit-requested及时间戳。如果最后一条停在
state:installing且没有install-confirmed,即可确认卡在beforeRestart()。关于本报告的脱敏 / Privacy
本报告由用户在其机器上自查后整理,已剔除:
COMPUTERNAME)、Windows 账户 SID、安装目录之外的用户目录路径;~/.dsh下的匿名用户 ID(.anonymous-user-id)、会话 ID、工作区路径、会话内容;%LOCALAPPDATA%\...)。保留的仅为定位所需:应用/Electron 版本、Windows 版本与补丁号、CPU 型号与内存大小、
安装盘类型(机械盘)、磁盘上的时间戳、文件大小、以及公开更新源 URL。
其中 CPU/内存/磁盘类型是为了说明“安装本身可能慢”的量级,可自行删除而不影响结论。
All reactions