64 lines
5.7 KiB
Markdown
64 lines
5.7 KiB
Markdown
# 阶段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删除/最终包均未完成。当前不打包。
|