クエリ数の制限

各コントローラやAPIエンドポイントは、最大100個のSQLクエリを実行できます。テスト環境では、このしきい値を超えるとエラーが発生します。

テストの失敗の解決

100 を超えるクエリを実行したためにテストが失敗した場合、この問題には 2 つの解決策があります:

  • 実行する SQL クエリの数を減らします。
  • コントローラまたはAPIエンドポイントのクエリ制限を無効にします。

クエリ制限を無効にするのは、既存のコントローラやエンドポイントに問題がある場合に限ります。新しく追加されたコントローラやエンドポイントでは、 100 を超えるクエリを実行することはできません。特定の作業を行うために大量のSQLクエリが必要な_場合は_、Webリクエストで直接実行するのではなく、Sidekiqで実行するのが最善です。

クエリ制限の無効化

コントローラのクエリ制限を無効にする_必要が_ある場合、まずイシューを作成する必要があります。このイシューは、(できればタイトルに) コントローラまたはエンドポイントに言及し、適切なラベル (database,performance, 少なくともチーム固有のラベル (Discussionなど ) を含む必要があります。

イシューを作成したら、問題のコードのクエリ制限を無効にすることができます。Railsコントローラの場合は、できるだけ早い段階で実行されるbefore_action フックを作成するのが最善です。呼び出されたメソッドは順番にGitlab::QueryLimiting.disable!('issue URL here')を呼び出すようにします。たとえば

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