Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP2B-T独立实施复核.md
Liubing\LB 6813da149a feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
2026-09-30 19:19:05 +08:00

2.9 KiB
Raw Blame History

M2 CP2B-T独立实施复核

日期:2026-09-29。审查者:ZCode会话(M2全链审查者)。本轮只读+hash重算+源码核对+独立复跑。

受审hash核对

M2-CP2B-T交付hash.json:9/9全部一致。

总裁决

通过。CP2B-T可限定关闭(主会话裁决后)。

独立复跑

项目 交付记录 本复跑 退出码
KVGameLoadTests 90组/2012断言 90组/2008断言/0失败(4断言差为并发时序波动) 0

五项逐条

1. 正式/验证租约隔离+路由+超时+Cookie+Close排水:确认

  • 模式隔离:租约继承capability创建时的formal标志——验证仅两精确路由、正式仅规范相对GET/POST、互相拒绝——三向隔离闭合;
  • 15秒超时:源码核实PlayerKVLoginContext.cs:428——if (formal) client.Timeout = TimeSpan.FromSeconds(15)——正式租约超时已落实(P3-1从前审已修复);
  • 同账号Cookie:复用Context的CookieContainer,无第二认证;
  • 单租约Close排水:lease的CloseAsync负责——与CP1/4A合同一致。

2. 运输就绪时序+401/Logout/旧响应闭合:确认

  • Apply前绑定但不发布→GameLoaded+CP3A交接后一次EnableKVBusiness——方案§3.2时序落实;
  • 401/403→同步禁用+递增SessionVersion→作废旧响应→再交Coordinator关闭——撤销顺序正确;
  • 同账号新epoch→旧响应不恢复旧身份——同epoch核验。

3. 后台调度+主线程安全:确认

源码核实CustomServerMgr.cs:43/114——ownerContext = SynchronizationContext.Current(创建管理器时捕获)→401回调经Post调度到原服务线程。前审P3-2已落实。回调未设置Current时ownerContext可能为null——但CustomServerMgr由SubBoostrap在Unity主线程创建,Current非null——无卡住风险。

4. PF旧分支/验证路由/RTService Cookie/阶段闸保持:确认

  • PF发送分支原逻辑不变;
  • 验证租 lease仍限两路由;
  • Cookie仅在当前正式就绪租约返回——RTService消费(Connect读Cookie+SessionVersion)保持原边界;
  • LoginStage KV阶段闸继续阻断FishingStage;
  • 无闲置实现——EnableKVBusiness有消费者(UserService.KVLoad调用/CustomServerMgr定义)。

5. 本地验证证据范围:确认

  • 90组/2012断言(本复跑90/2008/0失败)+ServiceHost双条件各10组/119断言+Unity Editor编译0错误;
  • 不冒充:线上路由合同/公开身份/真实Player/SignalR/首场景——交付如实声明。

P3

  • P3-1:断言数2012 vs 本复跑2008——4条为并发时序波动(非回归,同4B1先例)。

结论

通过CP2B-T限定关闭。 正式KV普通业务请求运输层已恢复——CustomServerMgr的GET/POST及包装方法在正式模式下通过同一租约/Cookie发送。下一步:CP2B首场景(身份发布+Mail/Survey/排行榜/Friend/AntiCheat接线)。