Ignore manually created MergeRequestsClosinIssues records
What does this MR do and why?
We will now allow setting a work item to be closed when an MR is merged, from the work item side. For this reason, we need to make sure these records don't get deleted whenever the merge request description is updated.
We update manually created records only if the new reference in the MR description matches an existing manually created record.
We also need to rename the closes_work_item column to something more appropriate.
MR acceptance checklist
Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
DB review
Console output
UP
bin/rails db:migrate
main: == [advisory_lock_connection] object_id: 124620, pg_backend_pid: 211
main: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: migrating =
main: -- add_column(:merge_requests_closing_issues, :from_mr_description, :boolean, {:default=>true, :null=>false})
main: -> 0.0024s
main: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: migrated (0.0054s)
main: == [advisory_lock_connection] object_id: 124620, pg_backend_pid: 211
ci: == [advisory_lock_connection] object_id: 124920, pg_backend_pid: 213
ci: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: migrating =
ci: -- add_column(:merge_requests_closing_issues, :from_mr_description, :boolean, {:default=>true, :null=>false})
ci: -> 0.0022s
ci: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: migrated (0.0081s)
ci: == [advisory_lock_connection] object_id: 124920, pg_backend_pid: 213
DOWN
bin/rails db:migrate:down:main db:migrate:down:ci VERSION=20240502200854
main: == [advisory_lock_connection] object_id: 124260, pg_backend_pid: 99417
main: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: reverting =
main: -- remove_column(:merge_requests_closing_issues, :from_mr_description, :boolean, {:default=>true, :null=>false})
main: -> 0.0048s
main: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: reverted (0.0089s)
main: == [advisory_lock_connection] object_id: 124260, pg_backend_pid: 99417
ci: == [advisory_lock_connection] object_id: 125100, pg_backend_pid: 99672
ci: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: reverting =
ci: -- remove_column(:merge_requests_closing_issues, :from_mr_description, :boolean, {:default=>true, :null=>false})
ci: -> 0.0015s
ci: == 20240502200854 AddFromMrDescriptionToMergeRequestsClosingIssues: reverted (0.0082s)
ci: == [advisory_lock_connection] object_id: 125100, pg_backend_pid: 99672
DB Plans
Looked for one of the merge requests with most associated closing issues, and even then it performs well
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/28169/commands/87752
DELETE FROM
"merge_requests_closing_issues"
WHERE
"merge_requests_closing_issues"."merge_request_id" = 20075985
Count query
Before
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/28214/commands/88000
SELECT
"merge_requests_closing_issues"."issue_id",
COUNT(*) as count
FROM
"merge_requests_closing_issues"
INNER JOIN "merge_requests" ON "merge_requests"."id" = "merge_requests_closing_issues"."merge_request_id"
INNER JOIN project_features ON merge_requests.target_project_id = project_features.project_id
WHERE
"merge_requests_closing_issues"."issue_id" IN (139496369, 139498138)
AND "merge_requests_closing_issues"."closes_work_item" = TRUE
AND (
project_features.merge_requests_access_level >= 20
OR EXISTS(
SELECT
1
FROM
"project_authorizations"
WHERE
"project_authorizations"."user_id" = 8110537
AND (
project_authorizations.project_id = merge_requests.target_project_id
)
AND (
project_authorizations.access_level >= 20
)
)
)
GROUP BY
"merge_requests_closing_issues"."issue_id"
After
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/28214/commands/87999
SELECT
"merge_requests_closing_issues"."issue_id",
COUNT(*) as count
FROM
"merge_requests_closing_issues"
INNER JOIN "merge_requests" ON "merge_requests"."id" = "merge_requests_closing_issues"."merge_request_id"
INNER JOIN project_features ON merge_requests.target_project_id = project_features.project_id
WHERE
"merge_requests_closing_issues"."issue_id" IN (139496369, 139498138)
AND (
project_features.merge_requests_access_level >= 20
OR EXISTS(
SELECT
1
FROM
"project_authorizations"
WHERE
"project_authorizations"."user_id" = 8110537
AND (
project_authorizations.project_id = merge_requests.target_project_id
)
AND (
project_authorizations.access_level >= 20
)
)
)
GROUP BY
"merge_requests_closing_issues"."issue_id"
Related to #460151 (closed)
Edited by Mario Celi