N+1 issue when creating new pipeline - requirements_ci_variables
This is similar to #325998
When creating a new pipeline, we run N+1 queries:
"sql": "SELECT 1 AS one FROM \"requirements\" WHERE \"requirements\".\"project_id\" = 278964 AND \"requirements\".\"state\" = 1 LIMIT 1",
"backtrace": [
"ee/lib/ee/peek/views/active_record.rb:11:in `generate_detail'",
"lib/peek/views/active_record.rb:42:in `block in setup_subscribers'",
"ee/app/models/ee/project.rb:846:in `block in requirements_ci_variables'",
"ee/app/models/ee/project.rb:845:in `tap'",
"ee/app/models/ee/project.rb:845:in `requirements_ci_variables'",
"ee/app/models/ee/project.rb:784:in `predefined_variables'",
"app/models/concerns/ci/contextable.rb:15:in `block in scoped_variables'",
"app/models/concerns/ci/contextable.rb:13:in `tap'",
"app/models/concerns/ci/contextable.rb:13:in `scoped_variables'",
"lib/gitlab/ci/build/context/build.rb:24:in `block in variables'",
"lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize'",
"lib/gitlab/ci/build/context/build.rb:19:in `variables'",
"lib/gitlab/ci/build/rules/rule/clause/if.rb:13:in `satisfied_by?'",
"lib/gitlab/ci/build/rules/rule.rb:27:in `block in matches?'",
"lib/gitlab/ci/build/rules/rule.rb:27:in `all?'",
"lib/gitlab/ci/build/rules/rule.rb:27:in `matches?'",
"lib/gitlab/ci/build/rules.rb:46:in `block in match_rule'",
"lib/gitlab/ci/build/rules.rb:46:in `each'",
"lib/gitlab/ci/build/rules.rb:46:in `find'",
"lib/gitlab/ci/build/rules.rb:46:in `match_rule'",
"lib/gitlab/ci/build/rules.rb:31:in `evaluate'",
"lib/gitlab/ci/pipeline/seed/build.rb:190:in `block in rules_result'",
"lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize'",
"lib/gitlab/ci/pipeline/seed/build.rb:189:in `rules_result'",
"lib/gitlab/ci/pipeline/seed/build.rb:42:in `block in included?'",
"lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize'",
"lib/gitlab/ci/pipeline/seed/build.rb:40:in `included?'",
"lib/gitlab/ci/pipeline/seed/stage.rb:32:in `select'",
"lib/gitlab/ci/pipeline/seed/stage.rb:32:in `block in seeds'",
"lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize'",
"lib/gitlab/ci/pipeline/seed/stage.rb:31:in `seeds'",
"lib/gitlab/ci/pipeline/seed/stage.rb:49:in `included?'",
"lib/gitlab/ci/pipeline/seed/pipeline.rb:44:in `select'",
"lib/gitlab/ci/pipeline/seed/pipeline.rb:44:in `block in stage_seeds'",
"lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize'",
"lib/gitlab/ci/pipeline/seed/pipeline.rb:38:in `stage_seeds'",
"lib/gitlab/ci/pipeline/seed/pipeline.rb:16:in `errors'",
"lib/gitlab/ci/pipeline/chain/seed.rb:25:in `perform!'",
"lib/gitlab/ci/pipeline/chain/sequence.rb:19:in `block in build!'",
"lib/gitlab/ci/pipeline/chain/sequence.rb:16:in `each'",
"lib/gitlab/ci/pipeline/chain/sequence.rb:16:in `build!'",
"app/services/ci/create_pipeline_service.rb:83:in `execute'",
"ee/app/services/ee/merge_requests/create_pipeline_service.rb:28:in `create_merged_result_pipeline_for'",
"ee/app/services/ee/merge_requests/create_pipeline_service.rb:10:in `execute'",
"lib/api/merge_requests.rb:393:in `block (2 levels) in <class:MergeRequests>'",
I introduced this query in an older MR - !34419 (merged) - the purpose of the variable is described in the MR. It seems though that we evaluate this per each CI job separately - I wonder if it would be possible to evaluate this only once per pipeline and pass to each CI job being created? If not, another option might be request cache to cache this value.