Cache list projects and domains for user
Listing projects and domains for a user based on their role assignments was noted as being really slow, especially when users have a lot of assignments. This commit implements caching to mitigate the issue while we continue to investigate ways to speed up the assignment API. Change-Id: I72e398c65f01aa4f9a37f817d184a13ed01089ce Closes-Bug: 1700852
This commit is contained in:
parent
9fccd38d1b
commit
63124f703a
@ -223,7 +223,15 @@ class Manager(manager.Manager):
|
|||||||
|
|
||||||
# TODO(henry-nash): We might want to consider list limiting this at some
|
# TODO(henry-nash): We might want to consider list limiting this at some
|
||||||
# point in the future.
|
# point in the future.
|
||||||
|
@MEMOIZE_COMPUTED_ASSIGNMENTS
|
||||||
def list_projects_for_user(self, user_id):
|
def list_projects_for_user(self, user_id):
|
||||||
|
# FIXME(lbragstad): Without the use of caching, listing effective role
|
||||||
|
# assignments is slow, especially with large data set (lots of users
|
||||||
|
# with multiple role assignments). This should serve as a marker in
|
||||||
|
# case we have the opportunity to come back and optimize this code so
|
||||||
|
# that it can be performant without having a hard dependency on
|
||||||
|
# caching. Please see https://bugs.launchpad.net/keystone/+bug/1700852
|
||||||
|
# for more details.
|
||||||
assignment_list = self.list_role_assignments(
|
assignment_list = self.list_role_assignments(
|
||||||
user_id=user_id, effective=True)
|
user_id=user_id, effective=True)
|
||||||
# Use set() to process the list to remove any duplicates
|
# Use set() to process the list to remove any duplicates
|
||||||
@ -233,6 +241,7 @@ class Manager(manager.Manager):
|
|||||||
|
|
||||||
# TODO(henry-nash): We might want to consider list limiting this at some
|
# TODO(henry-nash): We might want to consider list limiting this at some
|
||||||
# point in the future.
|
# point in the future.
|
||||||
|
@MEMOIZE_COMPUTED_ASSIGNMENTS
|
||||||
def list_domains_for_user(self, user_id):
|
def list_domains_for_user(self, user_id):
|
||||||
assignment_list = self.list_role_assignments(
|
assignment_list = self.list_role_assignments(
|
||||||
user_id=user_id, effective=True)
|
user_id=user_id, effective=True)
|
||||||
|
@ -332,6 +332,11 @@ class Manager(manager.Manager):
|
|||||||
|
|
||||||
notifications.Audit.disabled(self._PROJECT, project_id,
|
notifications.Audit.disabled(self._PROJECT, project_id,
|
||||||
public=False)
|
public=False)
|
||||||
|
# Drop the computed assignments if the project is being disabled.
|
||||||
|
# This ensures an accurate list of projects is returned when
|
||||||
|
# listing projects/domains for a user based on role assignments.
|
||||||
|
assignment.COMPUTED_ASSIGNMENTS_REGION.invalidate()
|
||||||
|
|
||||||
if cascade:
|
if cascade:
|
||||||
self._only_allow_enabled_to_update_cascade(project,
|
self._only_allow_enabled_to_update_cascade(project,
|
||||||
original_project)
|
original_project)
|
||||||
|
6
releasenotes/notes/bug-1700852-de775d0eb2ddfdd1.yaml
Normal file
6
releasenotes/notes/bug-1700852-de775d0eb2ddfdd1.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
[`bug 1700852 <https://bugs.launchpad.net/keystone/+bug/1700852>`_]
|
||||||
|
Keystone now supports caching of the `GET|HEAD
|
||||||
|
/v3/users/{user_id}/projects` API in an effort to improve performance.
|
Loading…
Reference in New Issue
Block a user