Skip to content

N+1 issue when creating new pipeline - label_names

On POST /api/:version/projects/:id/merge_requests/:merge_request_iid/pipelines request, the request sometimes executes hundreds of SQL calls to get label names:

https://log.gprd.gitlab.net/goto/51b4e225175b1aa7471edbe9bbb86d5c

Triggered e.g. on POST /api/v4/projects/278964/merge_requests/55998/pipelines

Sample backtrace:

          "sql": "SELECT \"labels\".\"title\" FROM \"labels\" INNER JOIN \"label_links\" ON \"labels\".\"id\" = \"label_links\".\"label_id\" WHERE \"label_links\".\"target_id\" = 93095897 AND \"label_links\".\"target_type\" = 'Merg
eRequest' ORDER BY \"labels\".\"title\" ASC, title ASC",
          "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'",
            "app/models/concerns/issuable.rb:479:in `label_names'",
            "app/models/merge_request.rb:1503:in `block in predefined_variables'",
            "app/models/merge_request.rb:1492:in `tap'",
            "app/models/merge_request.rb:1492:in `predefined_variables'",
            "app/models/ci/pipeline.rb:801:in `block in predefined_variables'",
            "app/models/ci/pipeline.rb:783:in `tap'",
            "app/models/ci/pipeline.rb:783:in `predefined_variables'",
            "app/models/concerns/ci/contextable.rb:16: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'",
Edited by Jan Provaznik