5.7 KiB
阶段3A:缓存状态与磁盘保存验收
2026-09-22。阶段3完整方案及两项恢复收紧策略已获用户“继续”确认,按3A边界实施。
结论
3A实现及本批验收通过;整个阶段3尚未完成。 86项主测试、独立13组/127断言和C盘Unity编译通过;独立代码审查发现的路径校验P2已修复并复审闭环,无剩余确认阻塞。
本批只有独立同步状态与磁盘层,不访问正式服务器、不改变游戏存档入口。正式API仍固定 http://s101.local:18080/,原登录/SignalR配置、PlayFab存档与SDK保持当前工作区实现。没有打包、提交或发布。
方案:阶段3完整方案。代码审查:阶段3A独立审查。每步见开发日志。
实际新增代码
| 文件(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 |
| 修复及补充后主测试 | 86通过、0失败 | Latest.log |
| 独立审查测试 | 13组、127断言通过 | 独立审查报告中的独立宿主和日志链接 |
| Unity2022.3.62f2c1编译 | 0错误、274已有警告;新增PlayerData模块0警告 | 编译原始结果 |
| 项目工具身份 | C:/projects/ft/Client/Assets,CLI Loop2.2.0 | 项目信息 |
| 源码版本 | 最终三个生产文件及主测试SHA256 | 源码存证 |
覆盖真实桌面磁盘替换/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方案,不需重新索取相同策略或测试账号授权。按既定方案继续:
- 新增PlayerKVSessionOwner及PlayerKVSyncCoordinator,绑定固定认证会话/epoch和独立HttpClient;不接游戏全局manager。
- 原子准入、失效取消、Close等待登记操作、只在收尾后释放磁盘锁;旧成功/旧401不影响新账号。
- Get恢复、批次Set/Delete、立即票据通过同一调度器;等待者取消不撤销已保存目标或其它票据。
- 生产源码配可控HTTP替身验证故障/迟到/取消;独立review后才进入3C组合联调。
3A的BeginBatch/ConfirmBatch只是纯状态接口,测试中直接调用不代表真实HTTP200。异步票据的Confirmed/Superseded、完整网络owner Close及账号Cookie隔离属于3B验收;阶段3C、游戏迁移阶段4、外围及SDK删除/最终包均未完成。当前不打包。