fix: 恢复成功后整体替换待写队列,修首屏自愈抢跑写空
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 本地补丁:工作台状态镜像到宿主侧
|
||||
|
||||
基于上游 `Aisland-SJL/dsh-worktable` **v0.5.1**,本地版本号 `0.5.2-local.3`。
|
||||
基于上游 `Aisland-SJL/dsh-worktable` **v0.5.1**,本地版本号 `0.5.2-local.6`。
|
||||
|
||||
## 为什么打这个补丁
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
- 挂载时拉宿主镜像,只有 `updatedAt > 本地 savedAt` 才回填,避免旧镜像盖掉刚改的内容
|
||||
- `pagehide` / `beforeunload` 立即冲刷
|
||||
|
||||
## 两条数据安全约束(0.5.2-local.3 补的,来自真实事故)
|
||||
## 两条数据安全约束(0.5.2-local.6 补的,来自真实事故)
|
||||
|
||||
事故:拖了一下面板(只改了 `view`),客户端 POST 的半截状态把整个文件替换,`projects` 被抹掉;
|
||||
紧接着重启,客户端读宿主失败又用空状态覆盖了一次。
|
||||
@@ -32,8 +32,12 @@
|
||||
2. **读不到就不写**:`loadHostState()` 带退避重试(0/300/700/1200/2000/3000ms)。
|
||||
返回 `{ reachable: false }` 时调用 `staysReadOnly()`,**整场会话都不写镜像** ——
|
||||
宁可这次只在本地,也不拿空状态覆盖。
|
||||
3. hydration 成功后 `markHydrated({ projects, view })` 把读到的内容留在内存,
|
||||
后续半截写入也会带上另一半。
|
||||
3. hydration 成功后 `markHydrated(权威内容)` **整体替换**待写队列。
|
||||
事故根因:首屏「控制室自愈」effect 早于异步恢复跑完,把空项目塞进队列;
|
||||
旧实现只是合并队列,那份空值留了下来,恢复后 0.5 秒就被写回。必须整体替换。
|
||||
4. 宿主镜像不比本地新时**不主动落盘**,等用户真的改动再写。
|
||||
|
||||
`logs/worktable-state.log` 只在异常时记一行(鉴权被拒 / 项目数量变少),正常保存不写,可长期保留。
|
||||
|
||||
改动这三条时注意:`hydrated` 为 false 期间 `queueHostSave` 只累积不发送,这是首屏默认值的闸门,别去掉。
|
||||
|
||||
@@ -80,4 +84,4 @@ dsh plugin --profile web add "https://gitea.ququclean.com/xiaoqu/dsh-worktable/r
|
||||
| --- | --- |
|
||||
| 0.5.2-local.1 | 状态镜像首版;只声明兼容到 0.2.1-rc.5 |
|
||||
| 0.5.2-local.2 | 兼容声明加入 DSH 0.2.2-alpha.2(宿主升级后安装被拒) |
|
||||
| 0.5.2-local.3 | 修数据安全:写入按 key 合并 + 读不到不写,修复空状态覆盖镜像 |
|
||||
| 0.5.2-local.6 | 修数据安全:写入按 key 合并 + 读不到不写,修复空状态覆盖镜像 |
|
||||
|
||||
Reference in New Issue
Block a user