Skip to content

Split `CommitStatus#for_project_paths` into two queries

What does this MR do?

Implements #336434 (closed)

Splits CommitStatus#for_project_paths into two queries to prevent cross joining to projects. That is a step towards database decomposition.

Plucking is not recommended, but it turned out in some cases that a necessary step to do. Here is a related Slack thread https://gitlab.slack.com/archives/CNZ8E900G/p1629271665120800

DB queries

Before

SELECT "ci_builds".*
FROM "ci_builds"
WHERE "ci_builds"."project_id" IN (
  SELECT "projects"."id"
  FROM "projects" LEFT OUTER JOIN "routes" ON "routes"."source_type" = 'Project' AND "routes"."source_id" = "projects"."id"
  WHERE ((LOWER(routes.path) = LOWER('gitlab-org/gitlab')) OR
         (LOWER(routes.path) = LOWER('gitlab-org/gitlab-foss'))));

https://explain.depesz.com/s/atSz

After

SELECT "projects"."id"
FROM "projects"
LEFT OUTER JOIN "routes" ON "routes"."source_type" = 'Project' AND "routes"."source_id" = "projects"."id"
WHERE ((LOWER(routes.path) = LOWER('gitlab-org/gitlab')) OR
       (LOWER(routes.path) = LOWER('gitlab-org/gitlab-foss')));

SELECT "ci_builds".*
FROM "ci_builds"
WHERE "ci_builds"."project_id" IN (278964, 13083);

Screenshots or Screencasts (strongly suggested)

How to setup and validate locally (strongly suggested)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

Does this MR contain changes to processing or storing of credentials or tokens, authorization and authentication methods or other items described in the security review guidelines? If not, then delete this Security section.

  • Label as security and @ mention @gitlab-com/gl-security/appsec
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team
Edited by Vitali Tatarintev

Merge request reports