Help us learn about your current experience with the documentation. Take the survey.

项目仓库存储迁移

本文档旨在帮助贡献者理解项目仓库存储迁移的代码设计。 在为此功能修改代码前,请阅读本文档。

本文档仅限于概述代码的设计方式,因为代码经常变化。要了解功能特定部分的工作原理,请查看代码和规范。这里的细节解释了代码所有者功能主要组件的工作原理。

当本文档引用的代码库部分被更新、删除或添加新部分时,应更新本文档。

业务逻辑

  • Projects::RepositoryStorageMove: 跟踪迁移,包含状态机。
    • 定义在 app/models/projects/repository_storage_move.rb
  • RepositoryStorageMovable: 包含状态机逻辑、验证器和一些辅助方法。
    • 定义在 app/models/concerns/repository_storage_movable.rb
  • Project: 项目模型。
    • 定义在 app/models/project.rb
  • CanMoveRepositoryStorage: 包含注入到 Project 中的辅助方法。
    • 定义在 app/models/concerns/can_move_repository_storage.rb
  • API::ProjectRepositoryStorageMoves: 项目仓库存储迁移的 API 类。
    • 定义在 lib/api/project_repository_storage_moves.rb
  • Entities::Projects::RepositoryStorageMove: 用于序列化 Projects::RepositoryStorageMove 模型的 API 实体。
    • 定义在 lib/api/entities/projects/repository_storage_moves.rb
  • Projects::ScheduleBulkRepositoryShardMovesService: 安排批量迁移的服务。
    • 定义在 app/services/projects/schedule_bulk_repository_shard_moves_service.rb
  • ScheduleBulkRepositoryShardMovesMethods: 批量迁移的通用方法。
    • 定义在 app/services/concerns/schedule_bulk_repository_shard_moves_methods.rb
  • Projects::ScheduleBulkRepositoryShardMovesWorker: 处理批量迁移的 Worker。
    • 定义在 app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb
  • Projects::UpdateRepositoryStorageWorker: 查找仓库存储迁移并调用更新存储服务。
    • 定义在 app/workers/projects/update_repository_storage_worker.rb
  • UpdateRepositoryStorageWorker: 包含 Projects::UpdateRepositoryStorageWorker 通用逻辑的模块。
    • 定义在 app/workers/concerns/update_repository_storage_worker.rb
  • Projects::UpdateRepositoryStorageService: 执行迁移。
    • 定义在 app/services/projects/update_repository_storage_service.rb
  • UpdateRepositoryStorageMethods: 包含注入到 Projects::UpdateRepositoryStorageService 中的通用方法的模块。
    • 定义在 app/services/concerns/update_repository_storage_methods.rb
  • Projects::UpdateService: 如果传入参数请求迁移,则安排迁移。
    • 定义在 app/services/projects/update_service.rb
  • PoolRepository: 表示 Gitaly ObjectPool 的 Ruby 对象。
    • 定义在 app/models/pool_repository.rb
  • ObjectPool::CreateWorker: 使用 Gitaly 创建 ObjectPool 的 Worker。
    • 定义在 app/workers/object_pool/create_worker.rb
  • ObjectPool::JoinWorker: 使用 Gitaly 加入 ObjectPool 的 Worker。
    • 定义在 app/workers/object_pool/join_worker.rb
  • ObjectPool::ScheduleJoinWorker: 安排 ObjectPool::JoinWorker 的 Worker。
    • 定义在 app/workers/object_pool/schedule_join_worker.rb
  • ObjectPool::DestroyWorker: 使用 Gitaly 销毁 ObjectPool 的 Worker。
    • 定义在 app/workers/object_pool/destroy_worker.rb
  • ObjectPoolQueue: 配置 ObjectPool Worker 的模块。
    • 定义在 app/workers/concerns/object_pool_queue.rb
  • Repositories::ReplicateService: 处理从一个仓库到另一个仓库的数据复制。
    • 定义在 app/services/repositories/replicate_service.rb

流程

这些流程图应该有助于解释从端点到不同功能模型的流程。

使用 API 安排仓库存储迁移

%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
  A[<code>POST /api/:version/project_repository_storage_moves</code>] --> C
  B[<code>POST /api/:version/projects/:id/repository_storage_moves</code>] --> D
  C[为分片中的每个项目安排迁移] --> D[将状态设置为已安排]
  D --> E[<code>after_transition callback</code>]
  E --> F{<code>set_repository_read_only!</code>}
  F -->|success| H[安排仓库更新 Worker]
  F -->|error| G[将状态设置为失败]

安排后迁移存储

%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
  A[仓库更新 Worker 已安排] --> B{状态是否为已安排?}
  B -->|是| C[将状态设置为已开始]
  B -->|否| D[返回成功]
  C --> E{是否为相同文件系统?}
  E -.-> G[将项目仓库设置为可写]
  E -->|是| F["复制仓库(项目、wiki、设计图和池)"]
  G --> H[更新仓库存储值]
  H --> I[将状态设置为已完成]
  I --> J[将项目与新池仓库关联]
  J --> K[取消关联旧池仓库]
  K --> L[更新项目仓库存储值]
  L --> N[如果是相同文件系统则删除旧路径]
  N --> M[将状态设置为已完成]