Repository navigation
Replies: 3 comments
|
Follow-up after reading the public sources ( Correction: the installer already waits and retries
So the total budget is roughly 21 s, and all three of my failures exhausted it. My earlier claim "it does not wait for the old process to exit" was wrong; sorry. The interesting part
So whatever held
Suggestions
Reproducer environmentWindows 11 Happy to attach the three |
|
Independent repro on a per-user install (path contains a space) + a datum that reconciles both CWD observations Same failure on a different install layout, so this is not specific to Environment: Two identical logs ( The package itself was fine: sha512 matches On "is it the CWD?" — I think both observations in this thread are right, and here is the missing piece. Both the Start-menu and the desktop shortcut carry: and at runtime every app process holds a bare-directory handle on the install dir — not a handle to a file inside it, but to the directory itself, i.e. the inherited CWD handle ( So Workaround that worked here (no admin shell, no taskkill-all)
Two smaller notes
Cheapest fixes (either one unblocks the swap): spawn the Host and the installer with an explicit neutral 中文摘要:在每用户安装目录(路径含空格)、Windows 10.0.26300 上独立复现同一条错误( |
Status update (2026-11-13): fixed upstream in
|
Uh oh!
There was an error while loading. Please reload this page.
Summary
On Windows, the in-app "update → install and restart" flow always fails when the installer has to swap the existing install directory:
MoveFileExW(C:\ProgramFiles\deepseek → C:\ProgramFiles\deepseek.old-{GUID})returnsERROR_SHARING_VIOLATION (32)ten times, the installer gives up, and nothing is installed. The desktop shell has already calledapp.quit()by then, so the user sees "the app closed and never came back", gets no error, and the next launch is still the old version with the update prompt again.Reproduced 3 times, including once right after a clean reboot. Manually killing every
DeepSeek Harness.exeand running the already-downloaded installer from a neutral working directory succeeds immediately, so this is not antivirus / third-party software.Environment
@deepseek-ai/dsh-desktop0.2.2-rc.1 → 0.2.2-rc.2Windows: 10.0.26200), x64C:\ProgramFiles\deepseek(note: the path has no space — the installer's own default)https://download.deepseek.com/dsh-desk/feeds/win-x64/(app-update.yml:provider: generic,channel: nightly,updaterCacheDirName: @deepseek-aidsh-desktop-updater)deepseek-harness-0.2.2-rc.2-win-x64.exe(299,659,528 bytes, signature valid — Hangzhou DeepSeek AI), downloaded and sha512-verified by electron-updaterEvidence — installer failure log
Three files produced under
%LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\installer-logs\directory-failure-*.log(13:43:50, 13:51:45, 14:43:37 local time; all identical):Restoration error: 0means nothing was changed — the old version stays installed.Reproduction
quitAndInstall(true, true), then quits itself.C:\ProgramFiles\deepseek, retries 10 times, aborts silently, does not relaunch the app.Analysis
winerror 32, succeeds as soon as the process exits).ELECTRON_RUN_AS_NODE=1viaresources\runtime\bin\node.cmd). So the install directory is by design in use by the very process tree that has to be gone before the swap.update-coordinator.install()→beforeRestart()(idle, task lock,backend.stop()with 10s/5s/5s timeouts, journal drain) →quitAndInstall(true, true); electron-updater'sBaseUpdaterspawns the installer detached withstdio: "ignore"and never reads its exit code, thensetImmediate(() => app.quit()).--force-runis only passed along on the "success" path. So a failed install is inherently silent and never relaunches the app.app.exit(1)path that bypasses the shutdown sequence entirely — either can leave a long-lived handle on the install directory.Suggested fixes (priority order)
cwd(e.g.os.tmpdir()), not inherited from the app — an inherited install-directory CWD makes the rename fail unconditionally.quitAndInstall, terminate the whole descendant process tree (Host + node shims + plugin-spawned helpers) and wait for them, not just the direct child....\deepseek\<version>, switch a pointer), which removes this class of race entirely.Workaround (works for users)
This installed rc.2 successfully on the same machine with no other change.
中文摘要:Windows 上桌面端应用内更新在“改名旧安装目录”这一步必失败(MoveFileExW → ERROR_SHARING_VIOLATION 32,重试 10 次后放弃,Restoration error 0),而应用此时已自动退出,导致无提示、不重启、重开仍是旧版。安装目录里的
DeepSeek Harness.exe同时以ELECTRON_RUN_AS_NODE方式跑后端 Host,退出流程只 kill 直接子进程、安装器又是 detached 且不读退出码,因此形成稳定复现。建议安装器在目录交换前等待/结束旧进程并延长重试、以中性工作目录启动安装器、失败时回传并重新拉起应用。All reactions