fix(device-link): 修复手机连接的同步洪峰与拥塞恢复 - #4080
Conversation
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/maker-ipc/libraryExtraDirSyncTargets.ts | 新增 Library 同步目标筛选,但运行时 ID 仅与可见 active 数据库行取交集,遗漏状态或来源不匹配的运行中任务。 |
| apps/desktop/src/main/maker-ipc/remoteDirectoryGrantUpdate.ts | 将运行时授权恢复与持久化变更分离,避免相同目录集合重复写库,同时保留冲突过滤和回滚。 |
| apps/desktop/src/main/device-link/dispatch.ts | 新增任务列表补丁暂存、peer 可写门控及聚合失败日志,发送前的订阅、owner 和可见性复查较完整。 |
| apps/desktop/src/main/device-link/sessionPatchStage.ts | 按任务合并可延迟字段并分批排空,对背压、更新替换及 dispose 生命周期进行了处理。 |
| packages/device-link/src/congestionSendBudget.ts | 实现 250ms 共享物理帧预算、设备轮转和大消息债务结转;预算本身有界且测试覆盖公平性。 |
| packages/device-link/src/client.ts | 将初发、ACK 驱动和重试纳入共享预算,但物理发送失败时未按实际帧数修正已扣额度。 |
| apps/mobile/src/device-link/DeviceLinkContext.tsx | 为订阅和四类恢复快照接入代际隔离的匿名诊断,并仅在 store 接受结果后记录 applied。 |
| apps/mobile/src/device-link/recoveryDiagnostics.ts | 新增不记录设备标识、内容或错误正文的恢复阶段计时和前台/连接代际门控。 |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
DB[桌面会话数据库] --> T[Library 同步目标筛选]
Runtime[Maker 运行中任务] --> T
T --> Grants[应用或撤销目录授权]
Grants --> Stage[按设备合并列表补丁]
Stage --> Auth[发送前复查订阅、owner 与可见性]
Auth --> Queue[可靠传输队列]
Queue --> Budget[1013 后共享帧预算]
Budget --> Relay[Device-link relay]
Relay --> Mobile[移动端]
Mobile --> Rehydrate[恢复订阅与四类快照]
Rehydrate --> Diagnostics[匿名恢复诊断]
Prompt To Fix All With AI
### Issue 1
packages/device-link/src/client.ts:2796-2798
**拥塞预算重复计费**
这里在发送前按整条消息的 `frames.length` 扣除预算,但首帧发送失败或中途发送中断时,没有退回未发送帧的额度;后续重试还会再次按整条消息计费。WebSocket 在重连竞态中抛错时,这会产生虚假的拥塞债务,使同一连接上的其他设备在额度自然恢复前被无谓暂停,最大分片消息可能额外停顿数秒。应按实际写出的帧结算,或在失败路径退回未使用的额度。
### Issue 2
apps/desktop/src/main/maker-ipc/libraryExtraDirSyncTargets.ts:9-13
**遗漏运行中的同步目标**
`liveIds` 只在遍历可见且数据库状态为 `active` 的 `rows` 时参与筛选。因此,仍在 Maker 中运行、但数据库记录已归档、删除或来源不在可见列表中的任务不会成为同步目标。此类任务如果此前持有 Library 目录槽,在焦点或 Library 根变化后不会执行撤销,运行时会继续保留过期目录授权;这也没有实现本次修复所声明的“运行中的任务”同步范围。请独立合并符合条件的运行时 ID,或显式处理运行时状态与数据库可见状态不一致的情况。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "fix(device-link): 减少手机同步洪峰并平滑拥塞恢复" | Re-trigger Greptile
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 33a7ea2673
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3e233a20d9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
|
命中 UI 路径(apps/mobile/src/device-link/DeviceLinkContext.tsx / apps/mobile/src/device-link/recoveryDiagnostics.ts / apps/mobile/src/session/remoteSessionStore.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范 |
|
已核对 UI 路径提示(issuecomment-5576308609):本 PR 在 DeviceLinkContext.tsx 仅接入恢复计时与代际诊断;recoveryDiagnostics.ts 是无渲染代码的日志辅助模块;remoteSessionStore.ts 仅返回已有快照应用分支的接受/拒绝结果,供诊断记录使用。没有新增或修改 JSX 布局、样式、主题、交互及 UI 文案。按 PR 模板对“命中 UI 路径但无视觉/交互/文案变化”的豁免,正文已注明不涉及,因此不补无对应界面变化的截图或 HTML。正文仍保留未启动应用、未做实机弱网验证的限制。 |
MagicLizi
left a comment
There was a problem hiding this comment.
独立审查通过:手机连接同步洪峰用连接级发送预算节流,单设备不可写只暂停该镜像,不拆共享 relay。没有 P0/P1。
|
手机连电脑时列表同步不再把整条 relay 挤死:慢设备只暂停自己的镜像,正常设备还能回。1013 之后的数据帧也按连接预算排队,而不是无限制重放。 |
这次改了什么
摘要
修复手机连接电脑时,重复的目录同步和列表更新放大推送积压、拥塞恢复再次灌满 relay 的问题,并补齐恢复阶段的诊断证据。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
不涉及。
怎么验证的
自动验证
环境与复测说明:宿主继承的 CN 区域变量曾导致 3 个未改文件共 9 项失败;同一最新主干
760005b41精确复现,清环境后 55/55 通过。另一次全量出现未改动的 OAuth 固定端口并发用例失败,修复分支和干净主干单独运行均 41/41 通过;具体竞争原因未证实,保留原断言,最终全量复测通过。Review 回归:最新预算单测与 DeviceLinkClient 集成测试 205 项通过,相关门禁与 Desktop typecheck 通过。此前目录同步与授权更新测试 16 项通过。回归交错用例覆盖预算耗尽且 socket 已满时初发与 ACK 驱动仍保留可靠队列、有额度时容量预检仍先于入队,以及重试容量拒绝后额度完整退回。本轮另覆盖 12 个空闲或 inbound-closed 设备不稀释活动设备额度、原空闲目标大响应首发,以及双端有 pending 时的公平分配。此前用例继续覆盖不可见但仍存活的运行时撤权、数据库已空的残留授权撤销,以及首帧/部分分片发送失败后另一设备仍可立即回复。
专项回归覆盖:2026 条重复目录更新不写库、冷运行时授权恢复与撤销、列表字段合并、引擎/删除屏障保序、慢设备与正常设备并存、可靠队列背压、迟到授权与退订取消、1013 后初发/ACK/重试共享预算、大小包混发和多设备轮转、控制 ACK 不被限速、旧客户端订阅、恢复代际隔离、快照被接受/拒绝的结果及 1990 次重复错误计数。
手工验证
完成完整 diff 自查和独立只读交叉审查,核对权限撤销、设备隔离、事件顺序与异步收尾路径。
未执行的验证
未启动该分支的手机或桌面应用,未做真实多设备弱网、手机切前后台和升级后日志对照;没有 Metro、真机或 build label 证据。工作区为
cindy-mobile-link-congestion-recovery,分支为dash/mobile-link-congestion-recovery。自动化结果不代表已部署后的实际恢复时延。风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)