Reduce overhead and optimize ProjectTeam#max_member_access performance
The previous implementation would load the entire team member list and their respective attributes. Now we only search for the user's specific access level. In gitlab-com/operations#42, this reduces the overall overhead of rendering the issue from 28% to 20%. First step of optimizing #19273
This commit is contained in:
parent
1023289605
commit
e21c7d37c8
|
@ -26,6 +26,7 @@ v 8.9.3 (unreleased)
|
||||||
- Fix encrypted data backwards compatibility after upgrading attr_encrypted gem
|
- Fix encrypted data backwards compatibility after upgrading attr_encrypted gem
|
||||||
- Update mobile button icons to be more inline with typical UI paradigms
|
- Update mobile button icons to be more inline with typical UI paradigms
|
||||||
- Fixes missing avatar on system notes. !4954
|
- Fixes missing avatar on system notes. !4954
|
||||||
|
- Improve performance of obtaining the maximum access of a user in a project
|
||||||
|
|
||||||
v 8.9.2
|
v 8.9.2
|
||||||
- Fix visibility of snippets when searching.
|
- Fix visibility of snippets when searching.
|
||||||
|
|
|
@ -32,6 +32,7 @@ class Member < ActiveRecord::Base
|
||||||
scope :request, -> { where.not(requested_at: nil) }
|
scope :request, -> { where.not(requested_at: nil) }
|
||||||
scope :non_request, -> { where(requested_at: nil) }
|
scope :non_request, -> { where(requested_at: nil) }
|
||||||
scope :non_pending, -> { non_request.non_invite }
|
scope :non_pending, -> { non_request.non_invite }
|
||||||
|
scope :has_access, -> { where('access_level > 0') }
|
||||||
|
|
||||||
scope :guests, -> { where(access_level: GUEST) }
|
scope :guests, -> { where(access_level: GUEST) }
|
||||||
scope :reporters, -> { where(access_level: REPORTER) }
|
scope :reporters, -> { where(access_level: REPORTER) }
|
||||||
|
|
|
@ -137,20 +137,10 @@ class ProjectTeam
|
||||||
def max_member_access(user_id)
|
def max_member_access(user_id)
|
||||||
access = []
|
access = []
|
||||||
|
|
||||||
project.members.non_request.each do |member|
|
access += project.members.non_request.where(user_id: user_id).has_access.pluck(:access_level)
|
||||||
if member.user_id == user_id
|
|
||||||
access << member.access_field if member.access_field
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if group
|
if group
|
||||||
group.members.non_request.each do |member|
|
access += group.members.non_request.where(user_id: user_id).has_access.pluck(:access_level)
|
||||||
if member.user_id == user_id
|
|
||||||
access << member.access_field if member.access_field
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if project.invited_groups.any? && project.allowed_to_share_with_group?
|
if project.invited_groups.any? && project.allowed_to_share_with_group?
|
||||||
|
|
Loading…
Reference in New Issue