diff options
author | Roman Verchikov <rverchikov@mirantis.com> | 2013-08-07 14:56:24 -0700 |
---|---|---|
committer | Roman Verchikov <rverchikov@mirantis.com> | 2013-08-07 14:56:24 -0700 |
commit | b920d15b01b21831999030b0becbc1da988ee638 (patch) | |
tree | 2bab843091f7993eeab1881aa3de051d01f9ebb4 /keystone/common/sql/core.py | |
parent | ed1f9676d9e59022ecd9cd05e50b970d1b2930c8 (diff) | |
download | keystone-b920d15b01b21831999030b0becbc1da988ee638.tar.gz keystone-b920d15b01b21831999030b0becbc1da988ee638.tar.xz keystone-b920d15b01b21831999030b0becbc1da988ee638.zip |
Fix select n+1 issue in keystone catalog
keystone.catalog.backends.sql.get_catalog() and get_v3_catalog() methods
generate N+1 select statements for each endpoint. Use sqlalchemy's
eager load to generate single select statement instead of generating N+1
select statents for each endpoint.
Given change does not modify DB schema and is runtime-only, since it's a
one-to-many relationship.
Change-Id: Ia72b8603fc13f01696771f6116b320364bd50f51
Fixes: bug #1206725
Diffstat (limited to 'keystone/common/sql/core.py')
-rw-r--r-- | keystone/common/sql/core.py | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/keystone/common/sql/core.py b/keystone/common/sql/core.py index 2d3114f2..a2deb58b 100644 --- a/keystone/common/sql/core.py +++ b/keystone/common/sql/core.py @@ -54,6 +54,8 @@ NotFound = sql.orm.exc.NoResultFound Boolean = sql.Boolean Text = sql.Text UniqueConstraint = sql.UniqueConstraint +relationship = sql.orm.relationship +joinedload = sql.orm.joinedload def initialize_decorator(init): @@ -179,6 +181,8 @@ class DictBase(object): setattr(self, key, value) def __getitem__(self, key): + if key in self.extra: + return self.extra[key] return getattr(self, key) def get(self, key, default=None): |