Skip to content

Ignore manually created MergeRequestsClosinIssues records

Mario Celi requested to merge 460151-ignore-manually-created-records into master

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

Merge request reports