Add usage ping for MRs with overridden project rules
requested to merge 220541-instrument-usage-of-overridden-approval-rules-for-self-managed-instances-2 into master
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
-
Changelog entry -
Documentation (if required) -
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
Availability and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process. -
Tested in all supported browsers -
Informed Infrastructure department of a default or new setting change, if applicable per definition of done
Closes #220541 (closed)
Edited by Gary Holtz