InfoGrab DocsInfoGrab Docs

프로젝트 리포지터리 스토리지 이동

요약

이 문서는 기여자들이 프로젝트 리포지터리 스토리지 이동의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 개요로 의도적으로 제한되어 있습니다. 이 문서에서 참조하는 코드베이스의 일부가 업데이트, 삭제되거나 새로운 부분이 추가되면 이 문서도 함께 업데이트되어야 합니다.

이 문서는 기여자들이 프로젝트 리포지터리 스토리지 이동의 코드 설계를 이해할 수 있도록 작성되었습니다. 이 기능의 코드를 변경하기 전에 이 문서를 먼저 읽으십시오.

이 문서는 코드가 자주 변경될 수 있으므로 코드 설계 개요로 의도적으로 제한되어 있습니다. 기능의 특정 부분이 어떻게 동작하는지 이해하려면 코드와 사양(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: Gitaly ObjectPool을 나타내는 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]

프로젝트 리포지터리 스토리지 이동

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: Gitaly ObjectPool을 나타내는 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]