프로젝트 리포지토리 스토리지 이동
이 문서는 기여자가 프로젝트 리포지토리 스토리지 이동의 코드 설계를 이해하는 데 도움이 되도록 작성되었습니다.
이 기능의 코드 변경을 수행하기 전에 이 문서를 읽으세요.
이 문서는 코드가 자주 변경될 수 있으므로 코드 설계에 대한 개요로 한정되어 있습니다. 기능의 특정 부분이 작동하는 방식에 대한 이해를 원하신다면 코드와 사양을 확인하세요. 여기의 세부사항은 코드 소유자 기능의 주요 구성 요소가 어떻게 작동하는지를 설명합니다.
이 문서는 이 문서에 언급된 코드베이스의 일부가 업데이트, 제거되거나 새로운 부분이 추가될 때 업데이트되어야 합니다.
비즈니스 로직
- 
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: 일괄 이동을 처리하기 위한 워커.- 
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을 나타내는 루비 객체.- 
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[<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 -->|성공| H[리포지토리 업데이트 작업자 예약]
  F -->|오류| G[상태를 실패로 설정]
예약된 후 저장소 이동하기
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
  A[리포지토리 업데이트 작업자가 예약됨] --> B{상태가 예약됨?}
  B -->|예| C[상태를 시작됨으로 설정]
  B -->|아니오| D[성공 반환]
  C --> E{동일한 파일 시스템?}
  E -.-> G[프로젝트 리포를 쓰기 가능으로 설정]
  E -->|예| F["거울 리포지토리(프로젝트, 위키, 디자인, 및 풀)"]
  G --> H[리포 저장소 값 업데이트]
  H --> I[상태를 완료됨으로 설정]
  I --> J[프로젝트를 새로운 풀 리포지토리와 연결]
  J --> K[구 풀 리포지토리 분리]
  K --> L[프로젝트 리포지토리 저장소 값 업데이트]
  L --> N[동일한 파일 시스템인 경우 오래된 경로 제거]
  N --> M[상태를 완료됨으로 설정]
                 도움말
        도움말