쿼리 카운트 제한

각 컨트롤러 또는 API 엔드포인트는 최대 100개의 SQL 쿼리를 실행할 수 있으며 테스트 환경에서는 이 임계값을 초과할 때 오류가 발생합니다.

실패하는 테스트 해결

테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하는 경우 이 문제를 해결하는 두 가지 방법이 있습니다:

  • 실행되는 SQL 쿼리의 수를 줄입니다.
  • 컨트롤러 또는 API 엔드포인트의 쿼리 제한을 해제합니다.

SQL 쿼리의 수를 줄이는 것이 많은 노력이 필요한 경우에만 쿼리 제한을 해제해야 합니다. 새로 추가된 컨트롤러와 엔드포인트는 100개 이상의 SQL 쿼리를 실행할 수 없으며 이 규칙에는 예외가 없습니다. 특정 작업을 수행하는 데 많은 수의 SQL 쿼리가 필요한 경우 해당 작업을 직접 웹 요청에서 하는 대신 Sidekiq에서 수행하는 것이 좋습니다.

쿼리 제한 해제

컨트롤러의 쿼리 제한을 해제해야 하는 경우, 먼저 이 문제에 대한 이슈를 작성해야 합니다. 이 문제는 (가능하면 제목에) 해당 컨트롤러 또는 엔드포인트를 언급하고 적절한 레이블(예: database, performance, 그리고 Discussion과 같은 팀별 레이블)을 포함해야 합니다.

문제가 생성된 후 해당 코드에서 쿼리 제한을 해제할 수 있습니다. Rails 컨트롤러의 경우 가능한 빨리 실행되는 before_action 훅을 만드는 것이 좋습니다. 호출된 메소드는 다시 Gitlab::QueryLimiting.disable!('여기에 이슈 URL')를 호출해야 합니다. 예를 들어:

class MyController < ApplicationController
  before_action :disable_query_limiting, only: [:show]

  def index
    # ...
  end

  def show
    # ...
  end

  def disable_query_limiting
    Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/...')
  end
end

before_action을 사용하면 해당 컨트롤러 메소드를 수정할 필요가 없어서 병합 충돌 가능성이 줄어듭니다.

Grape API 엔드포인트의 경우 특정 엔드포인트 앞에서 신뢰할 수 있는 훅을 실행하는 신뢰할 수 있는 방법이 없습니다. 이는 엔드포인트에 직접 allowlist 호출을 추가해야 함을 의미합니다.

get '/projects/:id/foo' do
  Gitlab::QueryLimiting.disable!('...')

  # ...
end