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: 表示 GitalyObjectPool的 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: 配置ObjectPoolWorker 的模块。- 定义在
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[将状态设置为已完成]