Skip to content

🐛 云同步不再随 SW 冷启动触发,闹钟周期改为 30 分钟 - #1678

Merged
CodFrm merged 4 commits into
mainfrom
fix/1670-cloud-sync-cold-start
Aug 18, 2026
Merged

🐛 云同步不再随 SW 冷启动触发,闹钟周期改为 30 分钟#1678
CodFrm merged 4 commits into
mainfrom
fix/1670-cloud-sync-cold-start

Conversation

@CodFrm

@CodFrm CodFrm commented Aug 18, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

Close #1670

背景

用户把云同步接到 S3 桶后发现「同步频率设成每天,结果每分钟调用五次接口」。

MV3 的 Service Worker 空闲即被回收,每次冷启动都会重跑 init() 并用当前配置回调一次
cloud_syncwatchSystemConfig.watch 注册时会立即执行一次回调)。
cloudSyncConfigChange 在无 previous 时会直接跑一次全量 syncOnce ——
agentTaskScheduler 闹钟每分钟唤醒一次 SW,于是实际同步频率退化成「每分钟一轮」,
60 分钟的 cloudSync 闹钟形同虚设。

v1.4.0 与当前 main 都有这个问题(v1.4.0 连配置等价判重都没有,另外还多一个
extension_initialized 触发点)。

顺带说明:云同步并没有频率设置项,设置页上紧挨着同步卡片的「每天」是脚本更新检查周期
报告人把它当成同步周期了。

本次改动

  • 冷启动只 ensureCloudSyncAlarm(),不再同步;周期同步交给闹钟。
  • cloudSync 闹钟周期 60 → 30 分钟。
  • 闹钟成为启用后唯一的周期性入口,处理器从裸的 getCloudSync → buildFileSystem → syncOnce
    改走 synchronize.cloudSyncOnce()(自带启用校验与失败状态写入)并补 .catch ——
    原来连接失败会在每轮闹钟留下一个未捕获 rejection。

不变:勾选启用的瞬间仍立即同步一次、设置页「立即同步」按钮、脚本安装/删除的事件推送。

第二个提交是顺带修的 OneDrive 建目录问题(Graph 个人版对 special/ 寻址的 POST children
返回 400 invalidRequest,改用 /me/drive/items/{approotId} 寻址)。

验证

单元测试按 TDD 先写 RED 再实现:

$ npx vitest run src/app/service/service_worker/synchronize.test.ts -t "云同步配置变更调度"
AssertionError: expected "buildFileSystem" to not be called at all, but actually been called 1 times
  ❯ synchronize.test.ts:2495  expect(buildFileSystem).not.toHaveBeenCalled();

$ npx vitest run --no-coverage        # 实现后,连跑 3 次
Test Files  329 passed (329)
Tests  3732 passed (3732)

$ npx tsc --noEmit                    # exit 0
$ npx prettier --check / npx eslint   # exit 0

真机复现与验收(真实 MinIO,扩展的 S3 端点指向一个逐请求记账的透传代理;
脱离调试器运行,因为 CDP 附着会阻止 MV3 SW 被回收、这个 bug 就不出现):

8 分钟完全空闲窗口 同步轮数 S3 请求数
修复前 7 34
修复后 0 0

修复前的轮次起点:02:09:57 / 02:10:57 / 02:11:58 / 02:12:57 / 02:14:00 / 02:15:59 / 02:16:57
每轮 HEAD + LIST + GET + PUT + LIST,与 issue 里贴的 5 条日志一致。

修复后仍验证了三条该保留的路径:

  • 勾选「启用」瞬间同步一次(02:37:52 一轮);
  • 闹钟仍触发同步:把闹钟排程临时改成 1 分钟以免等 30 分钟,02:39:17 排程 →
    02:39:17.264 起一轮(只替换触发时刻,处理器与同步链路是真实的);
  • chrome.alarms.getAll() 实测 cloudSync period=30min

.catch 单独验证:停掉代理制造真实连接失败,日志出现 cloud sync alarm failed
整个会话 [exception] 计数为 0。

另做了一次不经过代理的独立回读(扩展页 chrome.storage.local):空闲窗口后
lastSyncAt 仍停在 02:39:18enable=true;而这次回读本身又是一次冷启动,
lastSyncAt 未推进。

已知限制

  • 跨设备拉取延迟从「近乎实时」(此前是 bug 导致的每分钟同步)变为最长 30 分钟。
    同步周期仍是硬编码,可配置化是单独的 feature。
  • agentTaskScheduler 仍每分钟唤醒一次 SW,无条件创建、不受 Agent 开关约束。
    修完后它不再产生 S3 请求,但每分钟冷启一次 SW 的开销仍在,属另一个 issue,本 PR 未动。

CodFrm and others added 4 commits August 18, 2026 11:02
MV3 的 Service Worker 空闲即被回收,每次冷启动都会重跑 init 并用当前配置回调一次
`cloud_sync` 的 watch;`cloudSyncConfigChange` 在无 previous 时会直接跑一次全量
`syncOnce`。而 `agentTaskScheduler` 闹钟每分钟唤醒一次 SW,于是实际同步频率退化成
「每分钟一轮」,60 分钟的 `cloudSync` 闹钟形同虚设。

实测(真实 S3,经计数代理):浏览器完全空闲 8 分钟 = 7 轮全量同步 = 34 个 S3 请求。

改为冷启动只 `ensureCloudSyncAlarm()`,同步交给闹钟;启用瞬间、「立即同步」按钮、
脚本安装/删除的事件推送均不变。闹钟成为唯一的周期性入口后,处理器改走
`cloudSyncOnce()`(自带启用校验与失败状态写入)并补 `.catch`,否则连接失败会在
每轮闹钟留下一个未捕获 rejection。

同一窗口修复后为 0 轮 / 0 请求。

Close #1670
Graph 个人版对 special/ 寻址的 POST children 一律返回 400 invalidRequest,
建目录必须改用 /me/drive/items/{approotId} 寻址;id 在实例内缓存一次。
读取与上传路径不受影响。

Copy link
Copy Markdown
Collaborator

已基于原 PR head 38e2c8fc 完成 rework;PR 标题和正文未修改,当前发布 head 为 60e01f682d7da316a2d8556bebfb90e9dbe8dd40

修正 commits:

  • 15dbe0a8 修正已有旧版 60 分钟 cloudSync alarm 不会迁移的问题;现在缺失或周期不是 30 分钟时会重建,并增加回归测试。
  • 60e01f68 校验 OneDrive approot 响应中的 item id;异常响应会以 typed FileSystemError 失败,不会继续生成 undefined 子目录 URL,并增加回归测试。

验证结果:

  • 相关测试:2 个文件、102 项通过。
  • 全量 Vitest:329 个测试文件、3734 项通过。
  • pnpm run typecheck、Prettier 检查及提交钩子通过。
  • 多方向独立 PickInvariant review 已确认修正范围充分,且冷启动不立即同步、启用时立即同步、手动同步和脚本事件路径保持不变。
  • 当前 GitHub check 中 License Compliance 仍为 pending;未在真实浏览器中重跑 MV3 生命周期,也未连接真实 OneDrive Graph 账户。

@CodFrm
CodFrm merged commit dcc336d into main Aug 18, 2026
10 checks passed
@CodFrm
CodFrm deleted the fix/1670-cloud-sync-cold-start branch August 18, 2026 05:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 脚本同步到s3桶,脚本同步频率是每天,结果每分钟调用五次接口

2 participants