Update OldestPerCommitFinder
to query SHAs from metadata table
What does this MR do and why?
Update OldestPerCommitFinder
to query SHAs from the commits metadata table, if they exist, and the FF merge_request_diff_commits_dedup
is enabled.
This finder uses the method MergeRequestDiffCommit.oldest_merge_request_id_per_commit
which queries the table merge_request_diff_commits
by sha.
Since we'll be moving the sha
column to the merge_request_commits_metadata
table, we need to be able to query that table as well. To achieve this, we use a similar method in the MergeRequests::CommitsMetadata
, which queries and groups the result using the sha
column in the metadata table.
We need to support both tables since there'll be records that won't have an associated merge_request_commits_metadata_id
until we backfill all the records.
References
Related to #527236
Database changes
Before
OldestPerCommitFinder
calls MergeRequestDiffCommit.oldest_merge_request_id_per_commit
query
SELECT "merge_request_diff_commits"."sha" AS sha,
min(merge_requests.id) AS merge_request_id
FROM "merge_request_diff_commits"
INNER JOIN "merge_request_diffs"
ON "merge_request_diffs"."id" = "merge_request_diff_commits"."merge_request_diff_id"
INNER JOIN merge_requests
ON merge_requests.latest_merge_request_diff_id = merge_request_diffs.id
WHERE "merge_request_diff_commits"."sha" IN ('\x0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', '\x62cdb7020ff920e5aa642c3d4066950dd1f01f4d')
AND "merge_requests"."target_project_id" = 1
AND "merge_requests"."state_id" = 3
GROUP BY "merge_request_diff_commits"."sha";
- Query plan: https://postgres.ai/console/gitlab/gitlab-production-main/sessions/43959/commands/134635
After
OldestPerCommitFinder
calls MergeRequests::CommitsMetadata.oldest_merge_request_id_per_commit
when FF merge_request_diff_commits_dedup
is enabled. If this query returns an empty result, it reverts to calling the previous method.
query
SELECT "merge_request_commits_metadata"."sha",
MIN(merge_requests.id) AS merge_request_id
FROM "merge_request_commits_metadata"
INNER JOIN merge_request_diff_commits
ON merge_request_diff_commits.merge_request_commits_metadata_id = merge_request_commits_metadata.id
INNER JOIN merge_request_diffs
ON merge_request_diffs.id = merge_request_diff_commits.merge_request_diff_id
INNER JOIN merge_requests
ON merge_requests.latest_merge_request_diff_id = merge_request_diffs.id
WHERE "merge_request_commits_metadata"."project_id" = 1
AND "merge_request_commits_metadata"."sha" IN ('\x0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', '\x62cdb7020ff920e5aa642c3d4066950dd1f01f4d')
AND "merge_requests"."target_project_id" = 1
AND "merge_requests"."state_id" = 3
GROUP BY "merge_request_commits_metadata"."sha";
- Query plan: https://postgres.ai/console/gitlab/gitlab-production-main/sessions/43959/commands/134655
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.