From 70d1912054de705c99f6373554ec36e53868f6b9 Mon Sep 17 00:00:00 2001 From: zhx Date: Thu, 23 Jul 2026 12:24:05 +0800 Subject: [PATCH] fix(room): align recovered command versions --- .../room-service/internal/room/service/recovery.go | 3 +++ tools/migrate-room-visible-region/main.go | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/services/room-service/internal/room/service/recovery.go b/services/room-service/internal/room/service/recovery.go index d0b66884..109d227e 100644 --- a/services/room-service/internal/room/service/recovery.go +++ b/services/room-service/internal/room/service/recovery.go @@ -128,6 +128,9 @@ func (s *Service) recoverRoom(ctx context.Context, roomMeta RoomMeta) (*state.Ro // replay 失败说明命令日志无法被当前状态机解释,不能继续装载错误 Cell。 return nil, err } + // room_version 是持久化事务提交后的权威版本。历史日志允许非回放命令占用版本,SendGift 也可能 + // 在同版本按自增 ID 收敛;仅依赖 replay 内部 Version++ 会在这些边界下产生空洞或超前。 + recovered.Version = record.RoomVersion } return recovered, nil diff --git a/tools/migrate-room-visible-region/main.go b/tools/migrate-room-visible-region/main.go index ceb5f941..6d183aa1 100644 --- a/tools/migrate-room-visible-region/main.go +++ b/tools/migrate-room-visible-region/main.go @@ -91,11 +91,13 @@ func main() { // 迁移必须走 Room Cell 命令链路,让 command log、snapshot、rooms 和 room_list_entries 在同一事务内收敛。 if _, err := client.AdminUpdateRoom(ctx, &roomv1.AdminUpdateRoomRequest{ Meta: &roomv1.RequestMeta{ - AppCode: appcode.Normalize(app), - RequestId: "room-visible-region-migration", - CommandId: migrationCommandID(item), - RoomId: item.RoomID, - SentAtMs: time.Now().UTC().UnixMilli(), + AppCode: appcode.Normalize(app), + // 后台迁移仍须携带真实房主作为命令操作者;Room Cell 依赖该字段完成审计和完整性校验。 + ActorUserId: item.OwnerUserID, + RequestId: "room-visible-region-migration", + CommandId: migrationCommandID(item), + RoomId: item.RoomID, + SentAtMs: time.Now().UTC().UnixMilli(), }, VisibleRegionId: &item.OwnerRegionID, AdminId: adminID,