프로젝트 리포지터리 스토리지 이동
GitLab v19.1이 문서는 기여자들이 프로젝트 리포지터리 스토리지 이동의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 개요로 의도적으로 제한되어 있습니다. 이 문서에서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가되면 이 문서도 함께 업데이트되어야 합니다.
이 문서는 기여자들이 프로젝트 리포지터리 스토리지 이동의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 기능의 코드를 변경하기 전에 이 문서를 먼저 읽으십시오.
이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 개요로 의도적으로 제한되어 있습니다. 기능의 특정 부분이 어떻게 동작하는지 이해하려면 코드와 사양(spec)을 참조하십시오. 여기에 있는 세부 내용은 Code Owners 기능의 주요 컴포넌트가 어떻게 동작하는지 설명합니다.
이 문서에서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가되면 이 문서도 함께 업데이트되어야 합니다.
비즈니스 로직#
-
Projects::RepositoryStorageMove: 이동을 추적하며 상태 머신(state machine)을 포함합니다.app/models/projects/repository_storage_move.rb에 정의됩니다. -
RepositoryStorageMovable: 상태 머신 로직, 검증기(validator), 일부 헬퍼 메서드를 포함합니다.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: 대량 이동을 처리하는 워커입니다.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을 생성하는 워커입니다.app/workers/object_pool/create_worker.rb에 정의됩니다. -
ObjectPool::JoinWorker:Gitaly를 사용하여ObjectPool에 참여하는 워커입니다.app/workers/object_pool/join_worker.rb에 정의됩니다. -
ObjectPool::ScheduleJoinWorker:ObjectPool::JoinWorker를 예약하는 워커입니다.app/workers/object_pool/schedule_join_worker.rb에 정의됩니다. -
ObjectPool::DestroyWorker:Gitaly를 사용하여ObjectPool을 삭제하는 워커입니다.app/workers/object_pool/destroy_worker.rb에 정의됩니다. -
ObjectPoolQueue:ObjectPool워커를 구성하는 모듈입니다.app/workers/concerns/object_pool_queue.rb에 정의됩니다. -
Repositories::ReplicateService: 한 리포지터리에서 다른 리포지터리로 데이터를 복제하는 작업을 처리합니다.app/services/repositories/replicate_service.rb에 정의됩니다.
흐름#
다음 플로우차트는 다양한 기능에 대해 엔드포인트부터 모델까지의 흐름을 이해하는 데 도움이 됩니다.
API로 리포지터리 스토리지 이동 예약#
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
A[POST /api/:version/project_repository_storage_moves] --> C
B[POST /api/:version/projects/:id/repository_storage_moves] --> D
C[Schedule move for each project in shard] --> D[Set state to scheduled]
D --> E[after_transition callback]
E --> F{set_repository_read_only!}
F -->|success| H[Schedule repository update worker]
F -->|error| G[Set state to failed]
예약 후 스토리지 이동#
%%{init: { "fontFamily": "GitLab Sans" }}%% graph TD A[Repository update worker scheduled] --> B{State is scheduled?} B -->|Yes| C[Set state to started] B -->|No| D[Return success] C --> E{Same filesystem?} E -.-> G[Set project repo to writable] E -->|Yes| F["Mirror repositories (project, wiki, design, & pool)"] G --> H[Update repo storage value] H --> I[Set state to finished] I --> J[Associate project with new pool repository] J --> K[Unlink old pool repository] K --> L[Update project repository storage values] L --> N[Remove old paths if same filesystem] N --> M[Set state to finished]