Optimize lookup of org membership on prototype and perms APIs

Fixes a major slowdown when working with permissions under organizations with a lot of members

Fixes https://www.pivotaltracker.com/story/show/144076113
This commit is contained in:
Joseph Schorr 2017-05-08 13:31:26 -04:00
parent f5e4380a57
commit db767b3610
3 changed files with 37 additions and 17 deletions

View file

@ -73,6 +73,9 @@ class RepositoryUserPermissionList(RepositoryParamResource):
# This repository isn't under an org
pass
# Load the permissions.
repo_perms = model.user.get_all_repo_users(namespace, repository)
# Determine how to wrap the role(s).
def wrapped_role_view(repo_perm):
return wrap_role_view_user(role_view(repo_perm), repo_perm.user)
@ -80,20 +83,17 @@ class RepositoryUserPermissionList(RepositoryParamResource):
role_view_func = wrapped_role_view
if org:
org_members = model.organization.get_organization_member_set(namespace)
users_filter = {perm.user for perm in repo_perms}
org_members = model.organization.get_organization_member_set(org, users_filter=users_filter)
current_func = role_view_func
def wrapped_role_org_view(repo_perm):
return wrap_role_view_org(current_func(repo_perm), repo_perm.user,
org_members)
return wrap_role_view_org(current_func(repo_perm), repo_perm.user, org_members)
role_view_func = wrapped_role_org_view
# Load and return the permissions.
repo_perms = model.user.get_all_repo_users(namespace, repository)
return {
'permissions': {perm.user.username: role_view_func(perm)
for perm in repo_perms}
'permissions': {perm.user.username: role_view_func(perm) for perm in repo_perms}
}
@ -156,8 +156,8 @@ class RepositoryUserPermission(RepositoryParamResource):
perm_view = wrap_role_view_user(role_view(perm), perm.user)
try:
model.organization.get_organization(namespace)
org_members = model.organization.get_organization_member_set(namespace)
org = model.organization.get_organization(namespace)
org_members = model.organization.get_organization_member_set(org, users_filter={perm.user})
perm_view = wrap_role_view_org(perm_view, perm.user, org_members)
except model.InvalidOrganizationException:
# This repository is not part of an organization
@ -183,8 +183,8 @@ class RepositoryUserPermission(RepositoryParamResource):
perm_view = wrap_role_view_user(role_view(perm), perm.user)
try:
model.organization.get_organization(namespace)
org_members = model.organization.get_organization_member_set(namespace)
org = model.organization.get_organization(namespace)
org_members = model.organization.get_organization_member_set(org, users_filter={perm.user})
perm_view = wrap_role_view_org(perm_view, perm.user, org_members)
except model.InvalidOrganizationException:
# This repository is not part of an organization