Files
ft/CodexOutput/upserver/阶段3A缓存状态与磁盘验收-2026-09-22.md

64 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阶段3A:缓存状态与磁盘保存验收
2026-09-22。阶段3完整方案及两项恢复收紧策略已获用户“继续”确认,按3A边界实施。
## 结论
**3A实现及本批验收通过;整个阶段3尚未完成。** 86项主测试、独立13组/127断言和C盘Unity编译通过;独立代码审查发现的路径校验P2已修复并复审闭环,无剩余确认阻塞。
本批只有独立同步状态与磁盘层,不访问正式服务器、不改变游戏存档入口。正式API仍固定 `http://s101.local:18080/`,原登录/SignalR配置、PlayFab存档与SDK保持当前工作区实现。没有打包、提交或发布。
方案:[阶段3完整方案](阶段3缓存同步方案与评审-2026-09-22.md)。代码审查:[阶段3A独立审查](阶段3A独立代码审查-2026-09-22.md)。每步见[开发日志](开发日志.md)。
## 实际新增代码
| 文件(Client/Assets/Scripts/Services/PlayerData/) | 责任 |
|---|---|
| PlayerKVSyncModels.cs | 固定API/数字账号缓存身份、只读结果与存在值、pending/batch、快照结构校验 |
| PlayerKVCacheStore.cs | 独占文件锁、版本化主档、临时文件flush及原子替换、失败分类和本地提交不确定标识 |
| PlayerKVSyncState.cs | 先落盘再发布、编辑/删除/localOnly、三方比较、批次水位、多版本确认、unknown冻结和同步释放 |
三文件均配meta;既有PlayerKVClient/Models未改。测试新增 `CodexOutput/upserver/KVSyncTests/`,直接编译生产源码;不新增Unity包或程序集定义。
### 已实现的关键行为
- 环境指纹包含完整API基址路径,涂游ID规范化为十进制。缓存根必须是完全限定绝对路径,拒绝Windows的 `C:relative` 和根相对路径。同命名空间文件锁阻止第二写入者。
- 所有状态变更先对副本计算、完整提交后再发布;返回编辑sequence和目标revision。提交后报错明确LocalCommitMayHaveSucceeded,不解释为“一定没保存”。64MiB单文件上限显式失败。
- 缺键、空字符串和Delete分别表达;remoteStore=false只改本地覆盖,不撤销旧remote pending;显式远端Set/Delete清同key本地覆盖。
- 批次最多10个连续同类型key,按sequence和调用水位选择;在途v1后编辑v2,确认v1保留v2并推进基线。未发旧版本被替换后不会被水位批次错误发送。
- 三方比较保留冲突B/L/R;未知批次和进程退出遗留active不因读回相同值解锁;主档损坏不自动回退较旧备份。
- 新实例仍需成功完整远端观察才Ready;这里的观察由调用方传入,3A本身不做HTTP或认证。旧owner的认证失效标志不阻止新owner重新读取,但unknown不清除。
- StorageError/未就绪/冲突等不向游戏伪造可读空档;损坏缓存通过Open的RecoveryRequired失败返回,不构造可编辑实例。
## 验收证据和边界
| 验证 | 结果 | 证据 |
|---|---|---|
| 主测试首轮 | 74通过、0失败 | [Initial.log](KVSyncTests/Initial.log) |
| 修复及补充后主测试 | **86通过、0失败** | [Latest.log](KVSyncTests/Latest.log) |
| 独立审查测试 | **13组、127断言通过** | 独立审查报告中的独立宿主和日志链接 |
| Unity2022.3.62f2c1编译 | **0错误、274已有警告;新增PlayerData模块0警告** | [编译原始结果](kv3a-unity-compile.json) |
| 项目工具身份 | C:/projects/ft/Client/Assets,CLI Loop2.2.0 | [项目信息](kv3a-unity-before.json) |
| 源码版本 | 最终三个生产文件及主测试SHA256 | [源码存证](kv3a-final-source-hashes.json) |
覆盖真实桌面磁盘替换/flush、子进程锁和退出释放、101个key、同key多版本、Set/Delete交错、localOnly、冲突重读、unknown重启、主/bak/tmp损坏组合、格式/身份/序号/active关联损坏、超限/溢出、并发编辑、写前/后及replace前后注入故障。测试数据是任务目录中的合成数据,日志不打印真实存档或认证信息。
子进程使用正常进程退出但不调用状态Dispose,另有各磁盘步骤退出用例;它们验证进程生命周期和提交边界,不是断电、电池耗尽或移动平台文件系统耐久性验证。Windows通过不替代最终设备对原子替换和独占锁的验收。
## 独立审查闭环
初审P2:Path.IsPathRooted接受Windows半绝对路径,缓存归属会依赖进程当前目录。修改前记录裁决后改为Path.IsPathFullyQualified,新增两条拒绝用例;Unity兼容性编译通过。独立复审确认该项关闭,其它缓存关联/提交/unknown/同步Dispose未发现确认阻塞。
不将3B未实现功能列为3A代码缺陷,也不冒称3A已经验证网络层。独立审查当前实现源文件,另跑隔离宿主;不是仅复用主测试日志。
## 下一步:3B固定会话及串行同步器
用户已确认整个阶段3方案,不需重新索取相同策略或测试账号授权。按既定方案继续:
1. 新增PlayerKVSessionOwner及PlayerKVSyncCoordinator,绑定固定认证会话/epoch和独立HttpClient;不接游戏全局manager。
2. 原子准入、失效取消、Close等待登记操作、只在收尾后释放磁盘锁;旧成功/旧401不影响新账号。
3. Get恢复、批次Set/Delete、立即票据通过同一调度器;等待者取消不撤销已保存目标或其它票据。
4. 生产源码配可控HTTP替身验证故障/迟到/取消;独立review后才进入3C组合联调。
3A的BeginBatch/ConfirmBatch只是纯状态接口,测试中直接调用不代表真实HTTP200。异步票据的Confirmed/Superseded、完整网络owner Close及账号Cookie隔离属于3B验收;阶段3C、游戏迁移阶段4、外围及SDK删除/最终包均未完成。当前不打包。