Skip to content

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";

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";

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.

Edited by Eugenia Grieff

Merge request reports

Loading