Skip to content

Add usage ping for MRs with overridden project rules

What does this MR do?

This provides us a usage ping entry for overridden approval rules for merge requests. This requires the Can override approvals in merge request option checked in repository settings.

Adding a usage ping for overridden approval

This update also includes:

  • Adding some relationship links:
    • ApprovalMergeRequestRule has_one Project
    • ApprovalProjectRule has_many ApprovalMergeRequestRules
    • ApprovalProjectRule has_many ApprovalMergeRequestRuleSources
    • EE::MergeRequest has_many ApprovalMergeRequestRuleSources
    • EE::MergeRequest has_many ApprovalProjectRules
  • Scopes for Approval Merge Requests
  • Scopes for EE:MergeRequest
  • Two memoized functions for maximum/minimum IDs in the EE usage ping

Database Queries:

MAX:

SELECT MAX("approval_merge_request_rules"."merge_request_id") FROM "approval_merge_request_rules"

EXPLAIN:

Time: 9.503 ms
  - planning: 0.216 ms
  - execution: 9.287 ms
    - I/O read: 8.798 ms
    - I/O write: 0.000 ms

Shared buffers:
  - hits: 3 (~24.00 KiB) from the buffer pool
  - reads: 2 (~16.00 KiB) from the OS file cache, including disk I/O
  - dirtied: 1 (~8.00 KiB)
  - writes: 0

MIN:

SELECT MIN("approval_merge_request_rules"."merge_request_id") FROM "approval_merge_request_rules"

EXPLAIN:

Time: 5.095 ms
  - planning: 0.170 ms
  - execution: 4.925 ms
    - I/O read: 4.424 ms
    - I/O write: 0.000 ms

Shared buffers:
  - hits: 0 from the buffer pool
  - reads: 4 (~32.00 KiB) from the OS file cache, including disk I/O
  - dirtied: 0
  - writes: 0

COUNT:


SELECT
	COUNT(DISTINCT "approval_merge_request_rules"."merge_request_id")
FROM
	"approval_merge_request_rules"
WHERE ((EXISTS (
			SELECT
				1
			FROM
				approval_merge_request_rule_sources
			WHERE
				approval_merge_request_rule_sources.approval_merge_request_rule_id = approval_merge_request_rules.id
				AND NOT EXISTS (
					SELECT
						1
					FROM
						approval_project_rules
					WHERE
						approval_project_rules.id = approval_merge_request_rule_sources.approval_project_rule_id
						AND EXISTS (
							SELECT
								1
							FROM
								projects
							WHERE
								projects.id = approval_project_rules.project_id
								AND projects.disable_overriding_approvers_per_merge_request = FALSE))))
				OR("approval_merge_request_rules"."modified_from_project_rule" = TRUE))
			AND "approval_merge_request_rules"."merge_request_id" BETWEEN 1 AND 10000

EXPLAIN:

Aggregate  (cost=13.04..13.05 rows=1 width=8) (actual time=0.162..0.162 rows=1 loops=1)
   Buffers: shared hit=12
   ->  Index Scan using index_approval_merge_request_rules_1 on public.approval_merge_request_rules  (cost=0.43..13.03 rows=1 width=4) (actual time=0.045..0.045 rows=0 loops=1)
         Index Cond: ((approval_merge_request_rules.merge_request_id >= 1) AND (approval_merge_request_rules.merge_request_id <= 10000))
         Filter: ((alternatives: SubPlan 1 or hashed SubPlan 2) OR approval_merge_request_rules.modified_from_project_rule)
         Rows Removed by Filter: 0
         Buffers: shared hit=3
         SubPlan 1
           ->  Nested Loop Anti Join  (cost=1.28..9.58 rows=1 width=0) (actual time=0.000..0.000 rows=0 loops=0)
                 ->  Index Scan using index_approval_merge_request_rule_sources_1 on public.approval_merge_request_rule_sources  (cost=0.43..3.45 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                       Index Cond: (approval_merge_request_rule_sources.approval_merge_request_rule_id = approval_merge_request_rules.id)
                 ->  Nested Loop  (cost=0.85..6.12 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                       ->  Index Scan using approval_project_rules_pkey on public.approval_project_rules  (cost=0.42..3.44 rows=1 width=12) (actual time=0.000..0.000 rows=0 loops=0)
                             Index Cond: (approval_project_rules.id = approval_merge_request_rule_sources.approval_project_rule_id)
                       ->  Index Scan using projects_pkey on public.projects  (cost=0.43..2.69 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                             Index Cond: (projects.id = approval_project_rules.project_id)
                             Filter: (NOT projects.disable_overriding_approvers_per_merge_request)
                             Rows Removed by Filter: 0
         SubPlan 2
           ->  Hash Anti Join  (cost=327857.39..453744.09 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                 Hash Cond: (approval_merge_request_rule_sources_1.approval_project_rule_id = approval_project_rules_1.id)
                 ->  Seq Scan on public.approval_merge_request_rule_sources approval_merge_request_rule_sources_1  (cost=0.00..113894.69 rows=3197869 width=16) (actual time=0.000..0.000 rows=0 loops=0)
                 ->  Hash  (cost=326367.54..326367.54 rows=119188 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                       ->  Nested Loop  (cost=0.85..326367.54 rows=119188 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                             ->  Index Scan using approval_project_rules_pkey on public.approval_project_rules approval_project_rules_1  (cost=0.42..5725.64 rows=119381 width=12) (actual time=0.000..0.000 rows=0 loops=0)
                             ->  Index Scan using projects_pkey on public.projects projects_1  (cost=0.43..2.69 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                   Index Cond: (projects_1.id = approval_project_rules_1.project_id)
                                   Filter: (NOT projects_1.disable_overriding_approvers_per_merge_request)
                                   Rows Removed by Filter: 0
Time: 3.057 ms
  - planning: 2.599 ms
  - execution: 0.458 ms
    - I/O read: 0.000 ms
    - I/O write: 0.000 ms

Shared buffers:
  - hits: 12 (~96.00 KiB) from the buffer pool
  - reads: 0 from the OS file cache, including disk I/O
  - dirtied: 0
  - writes: 0

MIGRATION

== 20200817195628 AddModifiedToApprovalMergeRequestRule: migrating ============
-- column_exists?(:approval_merge_request_rules, :modified_from_project_rule)
   -> 0.0020s
-- add_column(:approval_merge_request_rules, :modified_from_project_rule, :boolean, {:
default=>false, :null=>false})
   -> 0.0028s
== 20200817195628 AddModifiedToApprovalMergeRequestRule: migrated (0.0049s) ===

== 20200901170135 BackfillModifiedColumnForApprovalMergeRequestRules: migrating
== 20200901170135 BackfillModifiedColumnForApprovalMergeRequestRules: migrated (0.0160
s)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Closes #220541 (closed)

Edited by Gary Holtz

Merge request reports