From 9e50040713076ddfa45faa4784666d95de84ebd8 Mon Sep 17 00:00:00 2001 From: watermeko Date: Wed, 5 Aug 2026 01:41:07 +0000 Subject: [PATCH] fix(ota): keep update lock through service restart --- server/service/application/update.go | 2 +- server/service/application/update_offline.go | 2 +- .../pages/desktop/menu/settings/update/offline.tsx | 12 +++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/server/service/application/update.go b/server/service/application/update.go index dfd4f64..610529b 100644 --- a/server/service/application/update.go +++ b/server/service/application/update.go @@ -29,9 +29,9 @@ func (s *Service) Update(c *gin.Context) { rsp.ErrRsp(c, -1, "update already in progress") return } - defer releaseUpdateLock() if err := update(); err != nil { + releaseUpdateLock() rsp.ErrRsp(c, -1, fmt.Sprintf("update failed: %s", err)) return } diff --git a/server/service/application/update_offline.go b/server/service/application/update_offline.go index 982bf7b..0031f7a 100644 --- a/server/service/application/update_offline.go +++ b/server/service/application/update_offline.go @@ -26,9 +26,9 @@ func (s *Service) OfflineUpdate(c *gin.Context) { rsp.ErrRsp(c, -1, "update already in progress") return } - defer releaseUpdateLock() if err := offlineUpdate(c); err != nil { + releaseUpdateLock() rsp.ErrRsp(c, -1, fmt.Sprintf("update failed: %s", err)) return } diff --git a/web/src/pages/desktop/menu/settings/update/offline.tsx b/web/src/pages/desktop/menu/settings/update/offline.tsx index 093c44f..b643abd 100644 --- a/web/src/pages/desktop/menu/settings/update/offline.tsx +++ b/web/src/pages/desktop/menu/settings/update/offline.tsx @@ -67,18 +67,20 @@ export const Offline = ({ status, setStatus, setIsLocked, setErrMsg }: UpdatePro api .offlineUpdate(formData, checksum) - .then((rsp: Response) => { + .then(async (rsp: Response) => { + // The proxy may return 502 after the update stops the old server. + if (rsp.status === 502) return; if (!rsp.ok) throw new Error(`HTTP error ${rsp.status}`); - return rsp.json(); - }) - .then((rspj: any) => { + + const rspj = await rsp.json(); if (rspj.code !== 0) { const message = rspj.msg?.includes('sha256 checksum mismatch') ? t('settings.update.offline.checksumMismatch') : rspj.msg || t('settings.update.offline.updateFailed'); throw new Error(message); } - + }) + .then(() => { setTimeout(() => { setIsLocked(false); window.location.reload();