Skip to content

【架构优化】从 SaveWorkspaceCheckpointStream 中拆出分片暂存写入 stageWorkspaceCheckpointChunks #748

Open

Description

@fx-kurumi

现状问题

internal/repo/workspace_checkpoint_chunks.go 中 RunsRepo.SaveWorkspaceCheckpointStream 约 80 行,一个函数里混着四件事:小归档走旧的内联保存、清理过期的暂存分片、逐块读取源数据并写入分片行(含租约校验、大小上限、SHA-256 累计)、最后在事务里按租约 CAS 发布清单。其中分片写入循环占了近 30 行,循环里还要维护 size/count/hash 三个外层变量,读主流程时很难一眼看出「暂存 → 发布」两个阶段的边界;局部变量 hash 还遮蔽了同文件已导入的 hash 包。

重构方案

把分片写入循环原样抽成私有方法:

func (r *RunsRepo) stageWorkspaceCheckpointChunks(runID, token, archiveID string, source io.Reader) (size int64, count int, sum string, err error)
  • 循环体逐行不变:按 workspaceCheckpointChunkBytes 读块、超过 workspaceCheckpointArchiveBytes 报同样的错、每块前校验租约(失效返回 ErrWorkspaceInUse)、写入分片行并累计 SHA-256。
  • SaveWorkspaceCheckpointStream 只保留内联判断、生成 archive id 与失败清理、过期分片清理、空归档判断和事务发布;发布时直接使用返回的 size/count/sum。
  • 报错文案、SQL 条件、写入顺序全部不变。

影响范围

仅 internal/repo/workspace_checkpoint_chunks.go 一个文件内的私有拆分,导出方法签名与行为不变,调用方(internal/engine/workspace_checkpoint_stream.go)无需改动。

验证方式

  • 新增单测直接覆盖 stageWorkspaceCheckpointChunks:多块写入返回的字节数/块数/摘要正确且每行不超过分块上限;租约失效时返回 ErrWorkspaceInUse。
  • 原有 TestWorkspaceCheckpointChunksAtomicRoundTrip 等用例保持通过。
  • go vet ./internal/repo/...、go test ./internal/repo/...。

Activity

  1. added a commit that references this issue on Nov 14, 2026
    f9a131c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions