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

5.7 KiB
Raw Blame History

阶段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方案,不需重新索取相同策略或测试账号授权。按既定方案继续:

  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删除/最终包均未完成。当前不打包。