내부 허용 API
internal/allowed
엔드포인트는 사용자가 Git 저장소에서 특정 작업을 수행할 수 있는 권한이 있는지를 평가합니다. 다음과 같은 여러 가지 검사를 수행합니다:
- 브랜치 또는 태그 이름이 허용되는지 확인합니다.
- 사용자가 해당 작업을 수행할 권한이 있는지 여부.
엔드포인트 정의
내부 API 엔드포인트는
lib/api/internal
아래에 정의되어 있으며, /allowed
경로는
lib/api/internal/base.rb
에 위치해 있습니다.
엔드포인트 사용
internal/allowed
는 다음과 같은 경우에 호출됩니다:
- 저장소에 푸시할 때.
- 제안 적용 또는 GitLab IDE 사용과 같은 GitLab 사용자 인터페이스를 통해 저장소에서 작업을 수행할 때.
Gitaly는 일반적으로 이 엔드포인트를 호출합니다. 이는 API의 외부 사용자가 아니라 애플리케이션의 다른 부분에 의해 내부적으로만 호출됩니다.
푸시 검사
internal/allowed
흐름의 중요한 부분은 EE::Gitlab::Checks::PushRuleCheck
에 대한 호출로, 다음과 같은 검사를 수행할 수 있습니다:
EE::Gitlab::Checks::PushRules::CommitCheck
EE::Gitlab::Checks::PushRules::TagCheck
EE::Gitlab::Checks::PushRules::BranchCheck
EE::Gitlab::Checks::PushRules::FileSizeCheck
재귀
internal/allowed
에서 호출되는 일부 Gitaly RPC는 다시 internal/allowed
에 대한 호출을 합니다. 이러한 호출은 이제 원래 요청과 연관되어 있습니다. Gitaly는 권한 부여를 위해 Rails 애플리케이션에 의존하며, 자체적으로 권한 모델을 유지하지 않습니다.
이러한 호출은 초기 요청과 다르게 로그에 나타납니다. {example}
이 엔드포인트가 재귀적으로 호출될 수 있기 때문에, 이 엔드포인트에서의 느린 성능은 기하급수적인 성능 영향을 초래할 수 있습니다. 이 문서는 성능에 대한 조사에서 실제로 수정되었습니다.
알려진 성능 문제
참조
Git 저장소의 refs
수는 해당하는 git
명령의 성능에 주목할 만한 영향을 미칩니다. Gitaly RPC도 유사하게 영향을 받습니다. 특정 git
명령은 모든 refs를 스캔하므로 해당 명령의 속도에 상당한 영향을 미칩니다.
internal/allowed
엔드포인트에서 RPC 호출의 재귀적 특성은 ref 수가 성능에 기하급수적인 영향을 미친다는 것을 의미합니다.
환경 참조
오래된 환경 참조는 성능 문제를 일으키는 과도한 refs의 일반적인 예시입니다. 오래된 환경 ref는 바쁜 저장소에서 수만 개로 증가할 수 있으며, 자동으로 정리되지 않습니다.
유효하지 않은 참조
유효하지 않은 참조는 객체 풀에서 객체의 우발적인 삭제를 방지하기 위해 생성됩니다. 이러한 ref가 대량으로 존재할 수 있으며, 성능에 잠재적인 영향을 미칠 수 있습니다. 이 문제에 대한 기존 논의는
gitaly#1900
를 참조하세요. 이 문제는 오래된 환경 참조보다는 영향이 적은 것으로 보입니다.
풀 저장소
GitLab에서 포크가 생성되면 중앙 풀 저장소가 생성되고 포크가 이에 연결됩니다. 이 풀 저장소는 다른 포크와 공통된 데이터를 저장하여 데이터 중복을 방지합니다. 그러나 풀 저장소는 표준 저장소와 동일한 방식으로 정리되지 않으며, refs 문제에 더 취약합니다.
기능 플래그
병렬 푸시 검사
이 기능은 프로덕션 환경에서는 사용하지 마세요. GitLab Dedicated에서는 이 기능이 사용 불가능합니다.
이 실험적 기능 플래그는 엔드포인트에서 여러 RPC를 동시에 실행할 수 있게 하여, 전반적인 소요 시간을 대략 절반으로 줄여줍니다. 이 시간 절약은 스레드를 통해 이루어지며, 대규모에서 잠재적인 부작용이 있을 수 있습니다. GitLab.com에서는 이 기능 플래그가 오직 gitlab-org/gitlab
및 gitlab-com/www-gitlab-com
프로젝트에 대해서만 활성화되어 있습니다.
이를 사용하지 않으면, 해당 프로젝트는 엔드포인트에 대한 요청이 정기적으로 시간 초과됩니다. 이 기능이 GitLab.com 전체에 배포되었을 때, 일부 푸시가 실패했으며, 이는 데이터베이스 연결 풀과 같은 리소스 고갈 때문으로 추정됩니다.
이 기능 플래그는 시간 초과를 경험할 경우에만 활성화해야 하며, 특정 프로젝트에 대해서만 활성화하세요.